00001
00002
00003
00004 #include "ClpSimplex.hpp"
00005 #include "ClpPrimalColumnSteepest.hpp"
00006 #include "ClpDualRowSteepest.hpp"
00007 #include <iomanip>
00008
00009 int main (int argc, const char *argv[])
00010 {
00011 ClpSimplex model;
00012 int status;
00013
00014 if (argc<2)
00015 status=model.readMps("../../Mps/Sample/p0033.mps",true);
00016 else
00017 status=model.readMps(argv[1],true);
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 ClpPrimalColumnSteepest primalSteepest;
00032 model.setPrimalColumnPivotAlgorithm(primalSteepest);
00033
00034
00035 int integerValue;
00036 double value;
00037
00038
00039 value = model.infeasibilityCost();
00040 std::cout<<"Default value of infeasibility cost is "<<value<<std::endl;
00041 model.setInfeasibilityCost(value);
00042
00043 if (!status) {
00044 model.primal();
00045 }
00046
00047 std::string modelName;
00048 model.getStrParam(ClpProbName,modelName);
00049 std::cout<<"Model "<<modelName<<" has "<<model.numberRows()<<" rows and "<<
00050 model.numberColumns()<<" columns"<<std::endl;
00051
00052
00053
00054
00055
00056 model.getDblParam(ClpDualObjectiveLimit,value);
00057 std::cout<<"Value of ClpDualObjectiveLimit is "<<value<<std::endl;
00058 model.getDblParam(ClpPrimalObjectiveLimit,value);
00059 std::cout<<"Value of ClpPrimalObjectiveLimit is "<<value<<std::endl;
00060 model.getDblParam(ClpDualTolerance,value);
00061 std::cout<<"Value of ClpDualTolerance is "<<value<<std::endl;
00062 model.getDblParam(ClpPrimalTolerance,value);
00063 std::cout<<"Value of ClpPrimalTolerance is "<<value<<std::endl;
00064 model.getDblParam(ClpObjOffset,value);
00065 std::cout<<"Value of ClpObjOffset is "<<value<<std::endl;
00066
00067
00068 model.getDblParam(ClpPrimalTolerance,value);
00069 model.setPrimalTolerance(value);
00070
00071 model.setDualTolerance( model.dualTolerance()) ;
00072
00073
00074
00075
00076 model.getIntParam(ClpMaxNumIteration,integerValue);
00077 std::cout<<"Value of ClpMaxNumIteration is "<<integerValue<<std::endl;
00078 model.setMaximumIterations(integerValue);
00079
00080
00081 model.getIntParam(ClpMaxNumIterationHotStart,integerValue);
00082 std::cout<<"Value of ClpMaxNumIterationHotStart is "
00083 <<integerValue<<std::endl;
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 std::cout<<"Model status is "<<model.status()<<" after "
00094 <<model.numberIterations()<<" iterations - objective is "
00095 <<model.objectiveValue()<<std::endl;
00096
00097 assert(!model.isAbandoned());
00098 assert(model.isProvenOptimal());
00099 assert(!model.isProvenPrimalInfeasible());
00100 assert(!model.isProvenDualInfeasible());
00101 assert(!model.isPrimalObjectiveLimitReached());
00102 assert(!model.isDualObjectiveLimitReached());
00103 assert(!model.isIterationLimitReached());
00104
00105
00106
00107 assert(model.primalFeasible());
00108 assert(!model.numberPrimalInfeasibilities());
00109 assert(model.sumPrimalInfeasibilities()<1.0e-7);
00110 assert(model.dualFeasible());
00111 assert(!model.numberDualInfeasibilities());
00112 assert(model.sumDualInfeasibilities()<1.0e-7);
00113
00114
00115 unsigned char * basis1 = model.statusCopy();
00116 model.createStatus();
00117
00118
00119 ClpSimplex model2=model;
00120 model2.copyinStatus(basis1);
00121 delete [] basis1;
00122
00123
00124 model.dual();
00125
00126
00127 model2.setOptimizationDirection(model.optimizationDirection());
00128
00129
00130
00131 model2.scaling();
00132
00133
00134 model2.setSparseFactorization(model.sparseFactorization());
00135
00136
00137 ClpDualRowSteepest dualSteepest;
00138 model2.setDualRowPivotAlgorithm(dualSteepest);
00139
00140
00141 value = model.dualBound();
00142 std::cout<<"Default value of dual bound is "<<value<<std::endl;
00143 model.setDualBound(value);
00144
00145
00146
00147 CoinMessageHandler handler;
00148 model2.passInMessageHandler(& handler);
00149 model2.newLanguage(CoinMessages::us_en);
00150
00151
00152 model2.setLogLevel(4);
00153
00154
00155 model2.dual();
00156
00157 model2.setOptimizationDirection(-1);
00158 model2.dual();
00159 model2.setOptimizationDirection(1);
00160
00161 model2.setLogLevel(1);
00162 model2.dual();
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 int numberRows = model2.numberRows();
00186
00187
00188 double * rowPrimal = model2.primalRowSolution();
00189
00190 double * rowDual = model2.dualRowSolution();
00191
00192 double * rowLower = model2.rowLower();
00193
00194 double * rowUpper = model2.rowUpper();
00195
00196 double * rowObjective = model2.rowObjective();
00197
00198
00199 assert(model2.lengthNames());
00200
00201
00202 const std::vector<std::string> * rowNames = model2.rowNames();
00203
00204
00205 int iRow;
00206
00207 std::cout<<" Primal Dual Lower Upper (Cost)"
00208 <<std::endl;
00209
00210 for (iRow=0;iRow<numberRows;iRow++) {
00211 double value;
00212 std::cout<<std::setw(6)<<iRow<<" "<<std::setw(8)<<(*rowNames)[iRow];
00213 value = rowPrimal[iRow];
00214 if (fabs(value)<1.0e5)
00215 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00216 else
00217 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00218 value = rowDual[iRow];
00219 if (fabs(value)<1.0e5)
00220 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00221 else
00222 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00223 value = rowLower[iRow];
00224 if (fabs(value)<1.0e5)
00225 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00226 else
00227 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00228 value = rowUpper[iRow];
00229 if (fabs(value)<1.0e5)
00230 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00231 else
00232 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00233 if (rowObjective) {
00234 value = rowObjective[iRow];
00235 if (fabs(value)<1.0e5)
00236 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00237 else
00238 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00239 }
00240 std::cout<<std::endl;
00241 }
00242 std::cout<<"--------------------------------------"<<std::endl;
00243
00244
00245
00246 int numberColumns = model2.numberColumns();
00247
00248
00249 double * columnPrimal = model2.primalColumnSolution();
00250
00251 double * columnDual = model2.dualColumnSolution();
00252
00253 double * columnLower = model2.columnLower();
00254
00255 double * columnUpper = model2.columnUpper();
00256
00257 double * columnObjective = model2.objective();
00258
00259
00260 assert(model2.lengthNames());
00261
00262
00263 const std::vector<std::string> * columnNames = model2.columnNames();
00264
00265
00266 int iColumn;
00267
00268 std::cout<<" Primal Dual Lower Upper Cost"
00269 <<std::endl;
00270
00271 for (iColumn=0;iColumn<numberColumns;iColumn++) {
00272 double value;
00273 std::cout<<std::setw(6)<<iColumn<<" "<<std::setw(8)<<(*columnNames)[iColumn];
00274 value = columnPrimal[iColumn];
00275 if (fabs(value)<1.0e5)
00276 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00277 else
00278 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00279 value = columnDual[iColumn];
00280 if (fabs(value)<1.0e5)
00281 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00282 else
00283 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00284 value = columnLower[iColumn];
00285 if (fabs(value)<1.0e5)
00286 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00287 else
00288 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00289 value = columnUpper[iColumn];
00290 if (fabs(value)<1.0e5)
00291 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00292 else
00293 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00294 value = columnObjective[iColumn];
00295 if (fabs(value)<1.0e5)
00296 std::cout<<setiosflags(std::ios::fixed|std::ios::showpoint)<<std::setw(14)<<value;
00297 else
00298 std::cout<<setiosflags(std::ios::scientific)<<std::setw(14)<<value;
00299
00300 std::cout<<std::endl;
00301 }
00302 std::cout<<"--------------------------------------"<<std::endl;
00303
00304 std::cout<<resetiosflags(std::ios::fixed|std::ios::showpoint|std::ios::scientific);
00305
00306
00307 CoinPackedMatrix * matrix = model2.matrix();
00308
00309 const double * element = matrix->getElements();
00310 const int * row = matrix->getIndices();
00311 const int * start = matrix->getVectorStarts();
00312 const int * length = matrix->getVectorLengths();
00313
00314 for (iColumn=0;iColumn<numberColumns;iColumn++) {
00315 std::cout<<"Column "<<iColumn;
00316 int j;
00317 for (j=start[iColumn];j<start[iColumn]+length[iColumn];j++)
00318 std::cout<<" ( "<<row[j]<<", "<<element[j]<<")";
00319 std::cout<<std::endl;
00320 }
00321 return 0;
00322 }