00001
00002
00003 #if defined(_MSC_VER)
00004
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
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
00040 simplexSi->enableSimplexInterface(true);
00041
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
00055 dj = si->getReducedCost();
00056 dual = si->getRowPrice();
00057 } else {
00058
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
00068
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;
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
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