00001
00009 package org.coinor;
00010
00011 import java.io.File;
00012
00047 public abstract class Ipopt
00048 {
00050 private native boolean AddIpoptIntOption(long ipopt, String keyword, int val);
00051
00053 private native boolean AddIpoptNumOption(long ipopt, String keyword, double val);
00054
00056 private native boolean AddIpoptStrOption(long ipopt, String keyword, String val);
00057
00059 private native long CreateIpoptProblem(int n,int m,
00060 int nele_jac, int nele_hess, int index_style);
00061
00063 private native void FreeIpoptProblem(long ipopt);
00064
00066 private native int OptimizeTNLP(long ipopt,
00067 double x[], double g[],
00068 double obj_val[], double mult_g[], double mult_x_L[], double mult_x_U[],
00069 double callback_grad_f[], double callback_jac_g[], double callback_hess[]);
00070
00071
00073 public static final String DLLNAME = "jipopt";
00075 public static final String DLLPATH = "lib";
00076
00078 public final static int C_STYLE = 0;
00080 public final static int FORTRAN_STYLE = 1;
00081
00083 public final static int SOLVE_SUCCEEDED = 0;
00084 public final static int ACCEPTABLE_LEVEL = 1;
00085 public final static int INFEASIBLE_PROBLEM = 2;
00086 public final static int SEARCH_DIRECTION_TOO_SMALL = 3;
00087 public final static int DIVERGING_ITERATES = 4;
00088 public final static int USER_REQUESTED_STOP = 5;
00089 public final static int ITERATION_EXCEEDED = -1;
00090 public final static int RESTORATION_FAILED = -2;
00091 public final static int ERROR_IN_STEP_COMPUTATION = -3;
00092 public final static int CPUTIME_EXCEEDED = -4;
00093 public final static int NOT_ENOUGH_DEGREES_OF_FRE = -10;
00094 public final static int INVALID_PROBLEM_DEFINITION = -11;
00095 public final static int INVALID_OPTION = -12;
00096 public final static int INVALID_NUMBER_DETECTED = -13;
00097 public final static int UNRECOVERABLE_EXCEPTION = -100;
00098 public final static int NON_IPOPT_EXCEPTION = -101;
00099 public final static int INSUFFICIENT_MEMORY = -102;
00100 public final static int INTERNAL_ERROR = -199;
00101
00103 private long ipopt;
00104
00106 private double callback_grad_f[];
00107 private double callback_jac_g[];
00108 private double callback_hess[];
00109
00111 private double x[];
00112
00114 private double obj_val[] = {0.0};
00115
00117 private double g[];
00118
00120 private double mult_x_L[];
00121
00123 private double mult_x_U[];
00124
00126 private double mult_g[];
00127
00129 private int status = INVALID_PROBLEM_DEFINITION;
00130
00135 public Ipopt()
00136 {
00137 this(DLLPATH, DLLNAME);
00138 }
00139
00148 public Ipopt(String path, String DLL)
00149 {
00150
00151 File file = new File(path, System.mapLibraryName(DLL));
00152 System.load(file.getAbsolutePath());
00153 }
00154
00156 abstract protected boolean get_bounds_info(int n, double[] x_l, double[] x_u,
00157 int m, double[] g_l, double[] g_u);
00158
00160 abstract protected boolean get_starting_point(int n, boolean init_x, double[] x,
00161 boolean init_z, double[] z_L, double[] z_U,
00162 int m, boolean init_lambda, double[] lambda);
00163
00165 abstract protected boolean eval_f(int n, double[] x, boolean new_x, double[] obj_value);
00166
00168 abstract protected boolean eval_grad_f(int n, double[] x, boolean new_x, double[] grad_f);
00169
00171 abstract protected boolean eval_g(int n, double[] x, boolean new_x, int m, double[] g);
00172
00174 abstract protected boolean eval_jac_g(int n, double[] x, boolean new_x,
00175 int m, int nele_jac, int[] iRow, int[] jCol, double[] values);
00176
00178 abstract protected boolean eval_h(int n, double[] x, boolean new_x, double obj_factor,
00179 int m, double[] lambda, boolean new_lambda,
00180 int nele_hess, int[] iRow, int[] jCol,
00181 double[] values);
00182
00192 public void dispose()
00193 {
00194
00195 if( ipopt != 0 )
00196 {
00197 FreeIpoptProblem(ipopt);
00198 ipopt = 0;
00199 }
00200 }
00201
00202 protected void finalize() throws Throwable
00203 {
00204 dispose();
00205 }
00206
00217 public boolean create(int n, int m, int nele_jac, int nele_hess, int index_style)
00218 {
00219
00220 dispose();
00221
00222 x = new double[n];
00223
00224 callback_grad_f = new double[n];
00225 callback_jac_g = new double[nele_jac];
00226 callback_hess = new double[nele_hess];
00227
00228
00229 mult_x_U = new double[n];
00230 mult_x_L = new double[n];
00231 g = new double[m];
00232 mult_g = new double[m];
00233
00234
00235 ipopt = CreateIpoptProblem(n, m, nele_jac, nele_hess, index_style);
00236
00237
00238 return ipopt == 0 ? false : true;
00239 }
00240
00249 public boolean setIntegerOption(String keyword, int val)
00250 {
00251 return ipopt == 0 ? false : AddIpoptIntOption(ipopt, keyword, val);
00252 }
00253
00262 public boolean setNumericOption(String keyword, double val)
00263 {
00264 return ipopt == 0 ? false : AddIpoptNumOption(ipopt, keyword, val);
00265 }
00266
00275 public boolean setStringOption(String keyword, String val)
00276 {
00277 return ipopt == 0 ? false : AddIpoptStrOption(ipopt, keyword, val.toLowerCase());
00278 }
00279
00290 public int OptimizeNLP()
00291 {
00292 this.status = this.OptimizeTNLP(ipopt,
00293 x, g, obj_val, mult_g, mult_x_L, mult_x_U,
00294 callback_grad_f, callback_jac_g, callback_hess);
00295
00296 return this.status;
00297 }
00298
00302 public double[] getVariableValues()
00303 {
00304 return x;
00305 }
00306
00310 public double getObjectiveValue()
00311 {
00312 return obj_val[0];
00313 }
00314
00320 public int getStatus()
00321 {
00322 return status;
00323 }
00324
00328 public double[] getConstraintValues()
00329 {
00330 return g;
00331 }
00332
00336 public double[] getConstraintMultipliers()
00337 {
00338 return mult_g;
00339 }
00340
00344 public double[] getLowerBoundMultipliers()
00345 {
00346 return mult_x_L;
00347 }
00348
00352 public double[] getUpperBoundMultipliers()
00353 {
00354 return mult_x_U;
00355 }
00356
00371 public boolean get_scaling_parameters(double[] obj_scaling,
00372 int n, double[] x_scaling,
00373 int m, double[] g_scaling,
00374 boolean[] use_x_g_scaling)
00375 {
00376 return false;
00377 }
00378
00383 public int get_number_of_nonlinear_variables()
00384 {
00385 return -1;
00386 }
00387
00395 public boolean get_list_of_nonlinear_variables(int num_nonlin_vars,
00396 int[] pos_nonlin_vars)
00397 {
00398 return false;
00399 }
00400 }