Example Code from Details Section (lsod01)

/**********************************************************************/
/*                                                                    */
/*               S A S   S A M P L E   L I B R A R Y                  */
/*                                                                    */
/*    NAME: lsod01                                                    */
/*   TITLE: Example Code from Details Section (lsod01)                */
/* PRODUCT: OR                                                        */
/*  SYSTEM: ALL                                                       */
/*    KEYS: OR                                                        */
/*   PROCS: FCMP, OPTLSO                                              */
/*    DATA:                                                           */
/*                                                                    */
/* SUPPORT:                             UPDATE:                       */
/*     REF:                                                           */
/*    MISC: Various code from the details section of the PROC OPTLSO  */
/*          chapter of the Local Search Optimization book.            */
/*          This code doesn't make sense all together, but is         */
/*          included in this sample file as a place to easiliy copy   */
/*          and paste parts of the code and build upon it.            */
/*                                                                    */
/**********************************************************************/

/**********************************************************************/
/*                                                                    */
/*  Sample code found in Details:Variable Data Set section            */
/*                                                                    */
/**********************************************************************/

data vardata;
   input _id_ $ _lb_ _ub_ _type_ $;
   datalines;
x1  0 1000  C
x2  0 0.001 C
x3  0 4     I
;

data vardata;
   input _id_ $ _lb_ _ub_ _type_ $ _scale_;
   datalines;
x1  0 1000  C  1000
x2  0 0.001 C  0.5
x3  0 4     I  2
;

/**********************************************************************/
/*                                                                    */
/*  Sample code found in Details:Describing the Objective Function    */
/*  section                                                           */
/*                                                                    */
/**********************************************************************/

proc fcmp outlib=sasuser.myfuncs.mypkg;
   function sixhump(x1,x2);
      return ((4 - 2.1*x1**2 + x1**4/3)*x1**2
              + x1*x2 + (-4 + 4*x2**2)*x2**2);
   endsub;
run;

data objdata;
   input _id_ $ _function_ $ _sense_ $;
   datalines;
f   sixhump     min
;

data objdata;
   length _function_ $10;
   input _id_ $ _function_ $ _sense_ $;
   datalines;
f1   sixhump1      .
f2   sixhump2      .
f3   sixhumpNew    min
;
proc fcmp outlib=sasuser.myfuncs.mypkg;
   function sixhump1(x1,x2);
      return (4 - 2.1*x1**2 + x1**4/3);
   endsub;
   function sixhump2(x1,x2);
      return (-4 + 4*x2**2);
   endsub;
   function sixhumpNew(x1,x2,f1,f2);
      return (f1*x1**2 + x1*x2 + f2*x2**2);
   endsub;
run;

data Abdata;
   input _id_ $ a1 a2 a3 a4 a5 b;
   datalines;
row1  1  2  3  4  5  6
row2  7  8  9  10 11 12
row3  13 14 15 16 17 18
;

proc fcmp outlib=sasuser.myfuncs.mypkg;
   function axbi(x1,x2,x3,x4,x5,a1,a2,a3,a4,a5,b);
      array x[5];
      array a[5];
      di = -b;
      do j=1 to 5;
         di = di + a[j]*x[j];
      end;
      return (di*di);
   endsub;

   function onenorm(x1,x2,x3,x4,x5);
      array x[5];
      f2 = 0;
      do j=1 to 5;
         f2 = f2 + abs(x[j]);
      end;
      return (f2);
   endsub;

   function combine(f1, f2);
      return (sqrt(f1)+f2);
   endsub;
run;

data lsqobj1;
   input _id_ $ _function_$ _sense_ $ _dataset_ $;
   datalines;
f1        axbi         .      Abdata
f2        onenorm      .      .
f         combine      min    .
;

data xvar;
   input _id_ $ @@;
   datalines;
   x1 x2 x3 x4 x5
   ;

options cmplib=sasuser.myfuncs;
proc optlso
   variables = xvar
   objective = lsqobj1;
run;

proc fcmp outlib=sasuser.myfuncs.mypkg;
   function combine2(x1,x2,x3,x4,x5, f1);
      array x[5];
      f2 = 0;
      do j=1 to 5;
         f2 = f2 + abs(x[j]);
      end;
      return (sqrt(f1)+f2);
   endsub;
run;

data lsqobj2;
   input _id_ $ _function_$ _sense_ $ _dataset_ $;
   datalines;
f1        axbi         .         Abdata
f         combine2     min       .
;

options cmplib=sasuser.myfuncs;
proc optlso
   variables = xvar
   objective = lsqobj2;
run;

/**********************************************************************/
/*                                                                    */
/*  Sample code found in Details:Describing Linear Constraints        */
/*  section                                                           */
/*                                                                    */
/**********************************************************************/

data lcondata;
   input _id_ $ _lb_ x1-x3 _ub_;
   datalines;
a1 -1    2 0 -4 15
a2  1   -3 7  0 13
a3  11   1 1  1 11
;

/**********************************************************************/
/*                                                                    */
/*  Sample code found in Details:Describing Nonlinear Constraints     */
/*  section                                                           */
/*                                                                    */
/**********************************************************************/

proc fcmp outlib=sasuser.myfuncs.mypkg;
   function con1(x1, x2, x3);
      return (x1*x2*x3 + sin(x2));
   endsub;
   function con2(x1, x2, x3);
      return (x1*x2 + x1*x3 + x3*x3);
   endsub;
run;

data condata;
   input _id_ $ _lb_ _ub_;
   datalines;
con1 -1 1
con2  1 1
;

/**********************************************************************/
/*                                                                    */
/*  Sample code found in Details:Specifying and Returning Trial       */
/*  Points section                                                    */
/*                                                                    */
/**********************************************************************/

data popin;
   low = -5.0;
   upp = 10.0;
   numpoints = 30;
   dim = 5;
   call streaminit(2);
   do _sol_=1 to numpoints;
      do i=1 to dim;
         _id_= compress("x" || put(i, 4.0));
         _value_ = low + (upp-low)*rand("UNIFORM");
         output;
      end;
   end;
   keep _sol_ _id_ _value_;
run;