Discontinuous Function With a Lookup Table (lsoe09)

```/**********************************************************************/
/*                                                                    */
/*               S A S   S A M P L E   L I B R A R Y                  */
/*                                                                    */
/*    NAME: lsoe09                                                    */
/*   TITLE: Discontinuous Function With a Lookup Table (lsoe09)       */
/* PRODUCT: OR                                                        */
/*  SYSTEM: ALL                                                       */
/*    KEYS: OR                                                        */
/*   PROCS: OPTLSO, FCMP, PRINT                                       */
/*    DATA:                                                           */
/*                                                                    */
/* SUPPORT:                             UPDATE:                       */
/*     REF:                                                           */
/*    MISC: Example 9 from the OPTLSO chapter of the                  */
/*          Local Search Optimization book.                           */
/*                                                                    */
/**********************************************************************/

%let N = 100;
%let L = 0;
%let U = 10;

options cmplib = sasuser.myfuncs;
proc fcmp outlib=sasuser.myfuncs.mypkg;
function SmoothFunc(x);
y = x*sin(x) + x*x*cos(x);
return (y);
endsub;

function DiscretizedFunc(x);
array lookup[&N, 2] / nosymbols;
do i = 1 to %eval(&N-1);
if x >= lookup[i,1] and x < lookup[i+1,1] then
do;
/* lookup value at nearest smaller discretized point */
y = lookup[i,2];
i = %eval(&N-1);
end;
end;
return (y);
endsub;
run;

data f_discrete;
a=&L; b=&U; n=&N;
drop i a b n;
do i = 1 to n;
x = a + (i/n)*(b-a);
y = SmoothFunc(x);
output;
end;
run;

data vardata;
input _id_ \$ _lb_ _ub_;
datalines;
x   0   10
;

/* Use the discretized function as the objective */
data objdata;
length _function_ \$16;
input _id_ \$ _function_ \$ _sense_ \$;
datalines;
f    DiscretizedFunc    min
;

options cmplib = sasuser.myfuncs;
proc optlso
primaluut = finalsol
variables = vardata
objective = objdata;
run;

proc print data=finalsol;
run;

%let N = 100;
%let L = 0;
%let U = 10;

options cmplib = sasuser.myfuncs;
proc fcmp outlib=sasuser.myfuncs.mypkg;
function SmoothFunc(x);
y = x*sin(x) + x*x*cos(x);
return (y);
endsub;
run;

data vardata;
input _id_ \$ _lb_ _ub_;
datalines;
x   0   10
;

/* Use the smooth function as the objective */
data objdata;
length _function_ \$16;
input _id_ \$ _function_ \$ _sense_ \$;
datalines;
f    SmoothFunc    min
;

options cmplib = sasuser.myfuncs;
proc optlso
primaluut = finalsol
variables = vardata
objective = objdata;
run;

proc print data=finalsol;
run;

```