Ipopt  trunk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Ipopt.java
Go to the documentation of this file.
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                 // Loads the library
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                 // dispose the native implementation
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                 // delete any previously created native memory
00220                 dispose();
00221 
00222                 x = new double[n];
00223                 // allocate the callback arguments
00224                 callback_grad_f = new double[n];
00225                 callback_jac_g = new double[nele_jac];
00226                 callback_hess = new double[nele_hess];
00227 
00228                 // the multiplier
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                 //      Create the optimization problem and return a pointer to it
00235                 ipopt = CreateIpoptProblem(n, m,  nele_jac, nele_hess, index_style);
00236 
00237                 //System.out.println("Finish Java Obj");
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines