00001
00017 #include "OSColGenApp.h"
00018 #include "OSErrorClass.h"
00019 #include "OSDataStructures.h"
00020
00021 #include "OSInstance.h"
00022 #include "OSCoinSolver.h"
00023 #include "OSConfig.h"
00024 #include "OSResult.h"
00025 #include "OSOption.h"
00026 #include "OSiLReader.h"
00027 #include "OSiLWriter.h"
00028 #include "OSoLReader.h"
00029 #include "OSoLWriter.h"
00030 #include "OSrLReader.h"
00031 #include "OSrLWriter.h"
00032 #include "OSInstance.h"
00033 #include "OSFileUtil.h"
00034
00035 #ifdef COIN_HAS_COUENNE
00036 #include "OSCouenneSolver.h"
00037 #endif
00038
00039 #ifdef COIN_HAS_IPOPT
00040 #include "OSIpoptSolver.h"
00041 #endif
00042
00043
00044
00045 #include <sstream>
00046 using std::ostringstream;
00047
00048
00049
00050
00051 OSColGenApp::OSColGenApp():
00052 m_osinstanceMaster(NULL) {
00053 std::cout << "INSIDE OSColGenApp CONSTRUCTOR" << std::endl;
00054 }
00055
00056
00057 OSColGenApp::OSColGenApp( OSOption *osoption) {
00058 std::cout << "INSIDE OSColGenApp CONSTRUCTOR" << std::endl;
00059
00060 m_osinstanceMaster = NULL;
00061 m_osrouteSolver = NULL;
00062 m_osoption = osoption;
00063 m_osrouteSolver = new OSRouteSolver( m_osoption);
00064 getOptions( m_osoption);
00065
00066
00067 }
00068
00069
00070 OSColGenApp::~OSColGenApp(){
00071
00072 std::cout << "INSIDE ~OSColGenApp DESTRUCTOR" << std::endl;
00073
00074 if( m_osinstanceMaster != NULL) delete m_osinstanceMaster;
00075
00076 if( m_osrouteSolver != NULL) delete m_osrouteSolver;
00077
00078 }
00079
00080
00081 void OSColGenApp::getInitialRestrictedMaster( ){
00082
00083 m_osinstanceMaster = m_osrouteSolver->getInitialRestrictedMaster( );
00084
00085
00086 }
00087
00088
00089 void OSColGenApp::getCuts(const double* x) {
00090
00091
00092 }
00093
00094 void OSColGenApp::getColumns(const double* y, const int numRows,
00095 int &numColumns, int* numNonz, double* cost, double* rcost,
00096 int** rowIdx, double** values, double &lowerBound)
00097 {
00098
00099
00100 m_osrouteSolver->getColumns(y, numRows,
00101 numColumns, numNonz, cost, rcost,
00102 rowIdx, values, lowerBound);
00103
00104
00105 }
00106
00107 void OSColGenApp::getOptions(OSOption *osoption) {
00108
00109
00110
00111
00112 try{
00113
00114
00115 } catch (const ErrorClass& eclass) {
00116
00117 throw ErrorClass(eclass.errormsg);
00118
00119 }
00120
00121 }
00122
00123
00124 void OSColGenApp::solveRestrictedMasterRelaxation(){
00125
00126 int i;
00127 int j;
00128 int k;
00129 int numRows;
00130
00131 double *y = NULL;
00132 int numColumns;
00133 int* numNonz = NULL;
00134 double* cost = NULL;
00135 double* rcost;
00136 int** rowIdx = NULL;
00137 double** values = NULL ;
00138 double lowerBound;
00139 double collb;
00140 double colub;
00141 collb = 0.0;
00142 colub = 1.0;
00143
00144
00145 try{
00146 numRows = m_osinstanceMaster->getConstraintNumber();
00147
00148 CoinSolver *solver = NULL;
00149 solver = new CoinSolver();
00150
00151
00152 solver->sSolverName ="clp";
00153 std::cout << m_osinstanceMaster->printModel( ) << std::endl;
00154 solver->osinstance = m_osinstanceMaster;
00155 solver->osoption = m_osoption;
00156 std::cout << "CALL Solveee " << std::endl;
00157 solver->solve();
00158 std::cout << "Solution Status = " << solver->osresult->getSolutionStatusType( 0 ) << std::endl;
00159
00160
00161
00162 OsiSolverInterface *si = solver->osiSolver;
00163
00164
00165
00166
00167 if(si->getNumRows() != numRows )
00168 throw ErrorClass("detect a row number inconsistency in solveRestrictedMasterRelaxation");
00169
00170 if( numRows > 0 ) y = new double[m_osinstanceMaster->getConstraintNumber() ];
00171
00172 if(si->getRowPrice() == NULL )
00173 throw ErrorClass("problem getting dual values in solveRestrictedMasterRelaxation");
00174
00175
00176 for(i = 0; i < numRows; i++){
00177
00178 *(y + i) = si->getRowPrice()[ i];
00179
00180 }
00181 lowerBound = -1;
00182
00183 int loopKount = 0;
00184 while(lowerBound < -.01 && loopKount < 1000){
00185 loopKount++;
00186
00187
00188
00189 getColumns(y, numRows, numColumns, numNonz,
00190 cost, rcost, rowIdx, values, lowerBound);
00191
00192 std::cout << "LOWER BOUND = " << lowerBound << std::endl;
00193
00194
00195 numNonz = m_osrouteSolver->m_nonzVec;
00196 cost = m_osrouteSolver->m_costVec;
00197 rcost = m_osrouteSolver->m_optValHub;
00198 rowIdx = m_osrouteSolver->m_newColumnRowIdx;
00199 values = m_osrouteSolver->m_newColumnRowValue;
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 for(k = 0; k < numColumns; k++){
00235
00236 si->addCol(numNonz[ k], rowIdx[k], values[k],
00237 collb, colub, cost[ k]) ;
00238
00239
00240
00241 }
00242
00243 std::cout << std::endl << std::endl << std::endl;
00244 std::cout << "CALL Solve " << std::endl;
00245
00246 solver->solve();
00247 std::cout << "Solution Status = " << solver->osresult->getSolutionStatusType( 0 ) << std::endl;
00248 std::cout << "Number of solver interface columns = " << si->getNumCols() << std::endl;
00249
00250
00251
00252 if(si->getNumCols() != m_osrouteSolver->m_numThetaVar - 1) throw ErrorClass("number variables in solver not consistent with master");
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 for(i = 0; i < numRows; i++){
00264
00265 *(y + i) = si->getRowPrice()[ i];
00266
00267
00268 }
00269
00270
00271 }
00272
00273
00274
00275
00276
00277 int numCols = 0;
00278
00279 double* theta = NULL;
00280 numCols = si->getNumCols();
00281 theta = new double[ numCols];
00282
00283 for(i=0; i < numCols; i++){
00284 *(theta + i) = si->getColSolution()[i];
00285 }
00286
00287 m_osrouteSolver->pauHana( theta);
00288
00289 if(numRows > 0) delete[] y;
00290 y = NULL;
00291
00292 if(numCols > 0) delete[] theta;
00293 theta = NULL;
00294
00295
00296 delete solver;
00297
00298
00299
00300
00301 } catch (const ErrorClass& eclass) {
00302
00303 throw ErrorClass(eclass.errormsg);
00304
00305 }
00306
00307
00308 }
00309
00310
00311