## A Nonlinear Optimization Problem (oclpe04)

```/***************************************************************/
/*                                                             */
/*          S A S   S A M P L E   L I B R A R Y                */
/*                                                             */
/*    NAME: oclpe04                                            */
/*   TITLE: A Nonlinear Optimization Problem (oclpe04)         */
/* PRODUCT: OR                                                 */
/*  SYSTEM: ALL                                                */
/*    KEYS: OR                                                 */
/*   PROCS: OPTMODEL                                           */
/*    DATA:                                                    */
/*                                                             */
/* SUPPORT:                             UPDATE:                */
/*     REF:                                                    */
/*    MISC: Example 4 from the CLP solver chapter of the       */
/*          Mathematical Programming book.                     */
/*                                                             */
/***************************************************************/

proc optmodel;
set DOM{1..3} = [ (-5 .. 5) (-5 .. 9 by 2) (1 .. 10) ];
var X{i in 1..3} integer >= min{j in DOM[i]} j <= max{j in DOM[i]} j;

/* map the domain of X[1] and X[2] to 1 .. list size */
var Z {1..2} integer;
/* map nonlinear expressions */
var Y {1..4} integer;

/* Use an element constraint to represent noncontiguous domains */
/* domains with negative numbers, and nonlinear functions. */
/* Z[2] does not appear anywhere else. Its only purpose is
to restrict X[2] to take a value from DOM[2]. */
con MapDomainTo1ToCard{i in 1..2}:
element(Z[i], {k in DOM[i]} k, X[i]);

/* Functional Dependencies on X[1] */
/* Y[1] = X[1]^3 -- Use Z[1] for X[1] for proper indexing */
con Y1:
element(Z[1], {k in DOM[1]} (k^3), Y[1]);

/* Y[4] = mod(X[1], 4) */
con Y4:
element(Z[1], {k in DOM[1]} (mod(k,4)), Y[4]);

/* Functional Dependencies on X[3] */
/* Y[2] = 2^X[3] */
con Y2:
element(X[3], {k in DOM[3]} (2^k), Y[2]);

/* Y[3] = X[3]^2 */
con Y3:
element(X[3], {k in DOM[3]} (k^2), Y[3]);

/* X[1] - 0.5 * X[2] + X[3]^2 <= 50 */
con Con1:
X[1] - 0.5 * X[2] + Y[3] <= 50;

/* mod(X[1],4) + 0.25 * X[2] >= 1.5 */
con Con2:
Y[4] + 0.25 * X[2] >= 1.5;

/* Objective function: X[1]^3 + 5 * X[2] - 2^X[3] */
max Objective = Y[1] + 5 * X[2] - Y[2];

solve;
print X Y Z;
quit;

```