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

OsiSimplexInterfaceTest.cpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #if defined(_MSC_VER)
00004 // Turn off compiler warning about long names
00005 #  pragma warning(disable:4786)
00006 #endif
00007  
00008 #ifdef NDEBUG
00009 #undef NDEBUG
00010 #endif
00011 
00012 #include <cstdlib>
00013 #include <cassert>
00014 #include <vector>
00015 #include <iostream>
00016 #include <cstdio>
00017 
00018 #include "OsiSolverInterface.hpp"
00019 #include "OsiSimplexInterface.hpp"
00020 //#############################################################################
00021 
00022 void
00023 OsiSimplexInterfaceCommonUnitTest(const OsiSolverInterface* emptySi,
00024                                  const std::string & mpsDir)
00025 {
00026   OsiSolverInterface * si = emptySi->clone();
00027   std::string solverName;
00028   si->getStrParam(OsiSolverName,solverName);
00029   OsiSimplexInterface * simplexSi = dynamic_cast<OsiSimplexInterface *> (si);
00030   
00031   if (simplexSi) {
00032     // solve an lp by hand
00033     
00034     std::string fn = mpsDir+"p0033";
00035     si->readMps(fn.c_str(),"mps");
00036     si->setObjSense(-1.0);
00037     si->initialSolve();
00038     si->setObjSense(1.0);
00039     // enable special mode
00040     simplexSi->enableSimplexInterface(true);
00041     // we happen to know that variables are 0-1 and rows are L
00042     int numberIterations=0;
00043     int numberColumns = si->getNumCols();
00044     int numberRows = si->getNumRows();
00045     double * fakeCost = new double[numberColumns];
00046     double * duals = new double [numberRows];
00047     double * djs = new double [numberColumns];
00048     const double * solution = si->getColSolution();
00049     memcpy(fakeCost,si->getObjCoefficients(),numberColumns*sizeof(double));
00050     while (1) {
00051       const double * dj;
00052       const double * dual;
00053       if ((numberIterations&1)==0) {
00054         // use given ones
00055         dj = si->getReducedCost();
00056         dual = si->getRowPrice();
00057       } else {
00058         // create
00059         dj = djs;
00060         dual = duals;
00061         simplexSi->getReducedGradient(djs,duals,fakeCost);
00062       }
00063       int i;
00064       int colIn=9999;
00065       int direction=1;
00066       double best=1.0e-6;
00067       // find most negative reduced cost
00068       // Should check basic - but should be okay on this problem
00069       for (i=0;i<numberRows;i++) {
00070         double value=dual[i];
00071         if (value>best) {
00072           direction=-1;
00073           best=value;
00074           colIn=-i-1;
00075         }
00076       }
00077       for (i=0;i<numberColumns;i++) {
00078         double value=dj[i];
00079         if (value<-best&&solution[i]<1.0e-6) {
00080           direction=1;
00081           best=-value;
00082           colIn=i;
00083         } else if (value>best&&solution[i]>1.0-1.0e-6) {
00084           direction=-1;
00085           best=value;
00086           colIn=i;
00087         }
00088       }
00089       if (colIn==9999)
00090         break; // should be optimal
00091       int colOut;
00092       int outStatus;
00093       double theta;
00094       assert(!simplexSi->primalPivotResult(colIn,direction,colOut,outStatus,theta,NULL));
00095       printf("out %d, direction %d theta %g\n",
00096              colOut,outStatus,theta);
00097       numberIterations++;
00098     }
00099     delete [] fakeCost;
00100     delete [] duals;
00101     delete [] djs;
00102     // exit special mode
00103     simplexSi->disableSimplexInterface();
00104     si->resolve();
00105     assert (!si->getIterationCount());
00106     si->setObjSense(-1.0);
00107     si->initialSolve();
00108     std::cout<<solverName<<" passed OsiSimplexInterface test"<<std::endl;
00109   } else {
00110     std::cout<<solverName<<" has no OsiSimplexInterface"<<std::endl;
00111   }
00112   delete si;
00113 }
00114 

Generated on Wed Dec 3 14:35:33 2003 for Osi by doxygen 1.3.5