00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "bande.hh"
00028
00029 namespace bande {
00030
00031
00032
00033
00034
00035
00036
00037 LinearProgram::LinearProgram() {
00038 solver = new OsiClpSolverInterface;
00039 hasSolution = false;
00040 rows = cols = 0;
00041 }
00042
00043
00044
00045
00046 LinearProgram::~LinearProgram() {
00047 if (solver) delete solver;
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 void LinearProgram::readMps(const char* fileName) {
00060 if (solver->readMps(fileName))
00061 exit(EXIT_FAILURE);
00062 solver->messageHandler()->setLogLevel(0);
00063 rows = solver->getNumRows();
00064 cols = solver->getNumCols();
00065 rowNames.resize(rows);
00066 colNames.resize(cols);
00067 OsiClpSolverInterface* nameModel;
00068 nameModel = dynamic_cast<OsiClpSolverInterface*>(solver);
00069 if (!nameModel) {
00070 nameModel = new OsiClpSolverInterface;
00071 nameModel->messageHandler()->setLogLevel(0);
00072 if (nameModel->readMps(fileName))
00073 exit(EXIT_FAILURE);
00074 }
00075 for (int row = 0; row < rows; ++row)
00076 rowNames[row] = nameModel->getRowName(row);
00077 for (int col = 0; col < cols; ++col)
00078 colNames[col] = nameModel->getColName(col);
00079 if (nameModel != solver) delete nameModel;
00080 }
00081
00082
00083
00084
00085
00086 bool LinearProgram::solve() {
00087 if (hasSolution) solver->resolve();
00088 else solver->initialSolve();
00089 solution = solver->getColSolution();
00090 hasSolution = true;
00091 return solver->isProvenOptimal();
00092 }
00093
00094
00095
00096
00097
00098
00099 void LinearProgram::dumpSolution(std::ostream& out) const {
00100 out << "BEGIN DUMP" << std::endl;
00101 for (int col = 0; col < getNumCols(); ++col) {
00102 double v = getColSolution(col);
00103 static const double eps = 1e-15;
00104 if (v > -eps && v < eps) continue;
00105 out << getColName(col) << " [" << col << "] = " << v << std::endl;
00106 }
00107 out << "END DUMP" << std::endl;
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 void LinearProgram::setColLower(UndoManager& um, int col, double val) {
00119 typedef UndoColAction<&OsiSolverInterface::setColLower> U;
00120 um.record(new U(solver, col, solver->getColLower()[col]));
00121 solver->setColLower(col, val);
00122 }
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 void LinearProgram::setColUpper(UndoManager& um, int col, double val) {
00133 typedef UndoColAction<&OsiSolverInterface::setColUpper> U;
00134 um.record(new U(solver, col, solver->getColUpper()[col]));
00135 solver->setColUpper(col, val);
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 void LinearProgram::randomizeObjective() {
00153 for (int col = 0; col < getNumCols(); ++col) {
00154 solver->setObjCoeff(col, CoinDrand48());
00155 }
00156 }
00157
00158 }