Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

ekk.cpp

00001 // Copyright (C) 2002, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 /*  This can be used to compare OSL and Clp.  The interface functions
00005     below (in ekk_interface.cpp) were written so that calls to osl
00006     in the middle of complex algorithms could easily be swapped
00007     for Clp code.  This was to stress test Clp (and Osl :-)).
00008 
00009     With the addition of ekk_crash it may be used to see if we need
00010     a crash in Clp.  With "both" set it can also be used to see which
00011     gives better behavior after postSolve.
00012 
00013     However they may be useful as sample code.  Virtuous people would
00014     add return code checking.
00015 
00016     This main could just as easily be C code.
00017 
00018 */
00019 
00020 #include "ekk_c_api.h"
00021 // These interface functions are needed
00022 // Note - This example wastes memory as it has several copies of matrix
00023 /* As ekk_primalSimplex + postsolve instructions:
00024    presolve - 0 , no presolve, 1 presolve but no primal after postsolve,
00025                   2 do primal if any infeasibilities,
00026                   3 always do primal.
00027 */
00028 extern "C" int ekk_primalClp(EKKModel * model, int  startup, int presolve);
00029 
00030 /* As ekk_dualSimplex + postsolve instructions:
00031    presolve - 0 , no presolve, 1 presolve but no primal after postsolve,
00032                   2 do primal if any infeasibilities,
00033                   3 always do primal.
00034 */
00035 extern "C" int ekk_dualClp(EKKModel * model, int presolve);
00036 
00037 /* rather like ekk_preSolve (3) plus:
00038    keepIntegers - false to treat as if continuous
00039    pass   - do this many passes (0==default(5))
00040 
00041    returns 1 if infeasible
00042 */
00043 extern "C" int ekk_preSolveClp(EKKModel * model, bool keepIntegers,
00044                                int pass);
00045 
00046 #include "ClpSimplex.hpp"
00047 #include <stdio.h>
00048 #include <stdarg.h>
00049 
00050 int main (int argc, const char *argv[])
00051 {
00052   const char * name;
00053   // problem is actually scaled for osl, dynamically for clp (slows clp)
00054   // default is primal, no presolve, minimise and use clp
00055   bool    primal=true,presolve=false;
00056   int useosl=0;
00057   bool freeFormat=false;
00058 
00059   EKKModel * model;
00060   EKKContext * context;
00061 
00062   if ( argc>1 ) {
00063     name=argv[1];
00064   } else {
00065     name="../../Mps/Sample/p0033.mps";
00066   }
00067 
00068   /* initialize OSL environment */
00069   context=ekk_initializeContext();
00070   model=ekk_newModel(context,"");
00071 
00072   int i;
00073   printf("*** Options ");
00074   for (i=2;i<argc;i++) {
00075     printf("%s ",argv[i]);
00076   }
00077   printf("\n");
00078 
00079   // see if free format needed
00080 
00081   for (i=2;i<argc;i++) {
00082     if (!strncmp(argv[i],"free",4)) {
00083       freeFormat=true;
00084     }
00085   }
00086 
00087   // create model from MPS file
00088 
00089   if (!freeFormat) {
00090     ekk_importModel(model,name);
00091   } else {
00092     ekk_importModelFree(model,name);
00093   }
00094 
00095   // other options
00096   for (i=2;i<argc;i++) {
00097     if (!strncmp(argv[i],"max",3)) {
00098       if (!strncmp(argv[i],"max2",4)) {
00099         // This is for testing - it just reverses signs and maximizes
00100         int i,n=ekk_getInumcols(model);
00101         double * objective=ekk_getObjective(model);
00102         for (i=0;i<n;i++) {
00103           objective[i]=-objective[i];
00104         }
00105         ekk_setObjective(model,objective);
00106         ekk_setMaximize(model);
00107       } else {
00108         // maximize
00109         ekk_setMaximize(model);
00110       }
00111     }
00112     if (!strncmp(argv[i],"dual",4)) {
00113       primal=false;
00114     }
00115     if (!strncmp(argv[i],"presol",6)) {
00116       presolve=true;
00117     }
00118     if (!strncmp(argv[i],"osl",3)) {
00119       useosl=1;
00120     }
00121     if (!strncmp(argv[i],"both",4)) {
00122       useosl=2;
00123     }
00124   }
00125   if (useosl) {
00126     // OSL
00127     if (presolve)
00128       ekk_preSolve(model,3,NULL);
00129     ekk_scale(model);
00130     
00131     if (primal)
00132       ekk_primalSimplex(model,1);
00133     else
00134       ekk_dualSimplex(model);
00135     if (presolve) {
00136       ekk_postSolve(model,NULL);
00137       ekk_primalSimplex(model,3);
00138     }
00139     if (useosl==2)
00140       ekk_allSlackBasis(model); // otherwise it would be easy
00141   }
00142   if ((useosl&2)==0) {
00143     // CLP
00144     if (presolve)
00145       ekk_preSolveClp(model,true,5);
00146     /* 3 is because it is ignored if no presolve, and we
00147        are forcing Clp to re-optimize */
00148     if (primal)
00149       ekk_primalClp(model,1,3);
00150     else
00151       ekk_dualClp(model,3);
00152   }
00153   return 0;
00154 }    

Generated on Wed Dec 3 14:37:36 2003 for CLP by doxygen 1.3.5