source: stable/1.13/Clp/examples/defaults.cpp @ 1898

Last change on this file since 1898 was 1583, checked in by lou, 10 years ago

Fix up examples: Correct library ordering in Makefile.in, add std:: prefix in
several examples.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.2 KB
Line 
1/* $Id: defaults.cpp 1583 2010-07-29 20:30:59Z stefan $ */
2// Copyright (C) 2002, International Business Machines
3// Corporation and others.  All Rights Reserved.
4
5#include "ClpSimplex.hpp"
6#include "ClpPrimalColumnSteepest.hpp"
7#include "ClpDualRowSteepest.hpp"
8#include <iomanip>
9
10int main(int argc, const char *argv[])
11{
12     ClpSimplex  model;
13     int status;
14     // Keep names
15     if (argc < 2) {
16#if defined(SAMPLEDIR)
17          status = model.readMps(SAMPLEDIR "/p0033.mps", true);
18#else
19          fprintf(stderr, "Do not know where to find sample MPS files.\n");
20          exit(1);
21#endif
22     } else
23          status = model.readMps(argv[1], true);
24     /*
25       This driver is similar to minimum.cpp, but it
26       sets all parameter values to their defaults.  The purpose of this
27       is to give a list of most of the methods that the end user will need.
28
29       There are also some more methods as for OsiSolverInterface e.g.
30       some loadProblem methods and deleteRows and deleteColumns.
31
32       Often two methods do the same thing, one having a name I like
33       while the other adheres to OsiSolverInterface standards
34     */
35
36     // Use exact devex ( a variant of steepest edge)
37     ClpPrimalColumnSteepest primalSteepest;
38     model.setPrimalColumnPivotAlgorithm(primalSteepest);
39
40
41     int integerValue;
42     double value;
43
44     // Infeasibility cost
45     value = model.infeasibilityCost();
46     std::cout << "Default value of infeasibility cost is " << value << std::endl;
47     model.setInfeasibilityCost(value);
48
49     if (!status) {
50          model.primal();
51     }
52     // Number of rows and columns - also getNumRows, getNumCols
53     std::string modelName;
54     model.getStrParam(ClpProbName, modelName);
55     std::cout << "Model " << modelName << " has " << model.numberRows() << " rows and " <<
56               model.numberColumns() << " columns" << std::endl;
57
58     /* Some parameters as in OsiSolverParameters.  ObjectiveLimits
59        are not active yet.  dualTolerance, setDualTolerance,
60        primalTolerance and setPrimalTolerance may be used as well */
61
62     model.getDblParam(ClpDualObjectiveLimit, value);
63     std::cout << "Value of ClpDualObjectiveLimit is " << value << std::endl;
64     model.getDblParam(ClpPrimalObjectiveLimit, value);
65     std::cout << "Value of ClpPrimalObjectiveLimit is " << value << std::endl;
66     model.getDblParam(ClpDualTolerance, value);
67     std::cout << "Value of ClpDualTolerance is " << value << std::endl;
68     model.getDblParam(ClpPrimalTolerance, value);
69     std::cout << "Value of ClpPrimalTolerance is " << value << std::endl;
70     model.getDblParam(ClpObjOffset, value);
71     std::cout << "Value of ClpObjOffset is " << value << std::endl;
72
73     // setDblParam(ClpPrimalTolerance) is same as this
74     model.getDblParam(ClpPrimalTolerance, value);
75     model.setPrimalTolerance(value);
76
77     model.setDualTolerance(model.dualTolerance()) ;
78
79     // Other Param stuff
80
81     // Can also use maximumIterations
82     model.getIntParam(ClpMaxNumIteration, integerValue);
83     std::cout << "Value of ClpMaxNumIteration is " << integerValue << std::endl;
84     model.setMaximumIterations(integerValue);
85
86     // Not sure this works yet
87     model.getIntParam(ClpMaxNumIterationHotStart, integerValue);
88     std::cout << "Value of ClpMaxNumIterationHotStart is "
89               << integerValue << std::endl;
90
91     // Can also use getIterationCount and getObjValue
92     /* Status of problem:
93         0 - optimal
94         1 - primal infeasible
95         2 - dual infeasible
96         3 - stopped on iterations etc
97         4 - stopped due to errors
98     */
99     std::cout << "Model status is " << model.status() << " after "
100               << model.numberIterations() << " iterations - objective is "
101               << model.objectiveValue() << std::endl;
102
103     assert(!model.isAbandoned());
104     assert(model.isProvenOptimal());
105     assert(!model.isProvenPrimalInfeasible());
106     assert(!model.isProvenDualInfeasible());
107     assert(!model.isPrimalObjectiveLimitReached());
108     assert(!model.isDualObjectiveLimitReached());
109     assert(!model.isIterationLimitReached());
110
111
112     // Things to help you determine if optimal
113     assert(model.primalFeasible());
114     assert(!model.numberPrimalInfeasibilities());
115     assert(model.sumPrimalInfeasibilities() < 1.0e-7);
116     assert(model.dualFeasible());
117     assert(!model.numberDualInfeasibilities());
118     assert(model.sumDualInfeasibilities() < 1.0e-7);
119
120     // Save warm start and set to all slack
121     unsigned char * basis1 = model.statusCopy();
122     model.createStatus();
123
124     // Now create another model and do hot start
125     ClpSimplex model2 = model;
126     model2.copyinStatus(basis1);
127     delete [] basis1;
128
129     // Check model has not got basis (should iterate)
130     model.dual();
131
132     // Can use getObjSense
133     model2.setOptimizationDirection(model.optimizationDirection());
134
135     // Can use scalingFlag() to check if scaling on
136     // But set up scaling
137     model2.scaling();
138
139     // Could play with sparse factorization on/off
140     model2.setSparseFactorization(model.sparseFactorization());
141
142     // Sets row pivot choice algorithm in dual
143     ClpDualRowSteepest dualSteepest;
144     model2.setDualRowPivotAlgorithm(dualSteepest);
145
146     // Dual bound (i.e. dual infeasibility cost)
147     value = model.dualBound();
148     std::cout << "Default value of dual bound is " << value << std::endl;
149     model.setDualBound(value);
150
151     // Do some deafult message handling
152     // To see real use - see OsiOslSolverInterfaceTest.cpp
153     CoinMessageHandler handler;
154     model2.passInMessageHandler(& handler);
155     model2.newLanguage(CoinMessages::us_en);
156
157     //Increase level of detail
158     model2.setLogLevel(4);
159
160     // solve
161     model2.dual();
162     // flip direction twice and solve
163     model2.setOptimizationDirection(-1);
164     model2.dual();
165     model2.setOptimizationDirection(1);
166     //Decrease level of detail
167     model2.setLogLevel(1);
168     model2.dual();
169
170     /*
171       Now for getting at information.  This will not deal with:
172
173       ClpMatrixBase * rowCopy() and ClpMatrixbase * clpMatrix()
174
175       nor with
176
177       double * infeasibilityRay() and double * unboundedRay()
178       (NULL returned if none/wrong)
179       Up to user to use delete [] on these arrays.
180
181      */
182
183
184     /*
185       Now to print out solution.  The methods used return modifiable
186       arrays while the alternative names return const pointers -
187       which is of course much more virtuous
188
189      */
190
191     int numberRows = model2.numberRows();
192
193     // Alternatively getRowActivity()
194     double * rowPrimal = model2.primalRowSolution();
195     // Alternatively getRowPrice()
196     double * rowDual = model2.dualRowSolution();
197     // Alternatively getRowLower()
198     double * rowLower = model2.rowLower();
199     // Alternatively getRowUpper()
200     double * rowUpper = model2.rowUpper();
201     // Alternatively getRowObjCoefficients()
202     double * rowObjective = model2.rowObjective();
203
204     // If we have not kept names (parameter to readMps) this will be 0
205     assert(model2.lengthNames());
206
207     // Row names
208     const std::vector<std::string> * rowNames = model2.rowNames();
209
210
211     int iRow;
212
213     std::cout << "                       Primal          Dual         Lower         Upper        (Cost)"
214               << std::endl;
215
216     for (iRow = 0; iRow < numberRows; iRow++) {
217          double value;
218          std::cout << std::setw(6) << iRow << " " << std::setw(8) << (*rowNames)[iRow];
219          value = rowPrimal[iRow];
220          if (fabs(value) < 1.0e5)
221               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
222          else
223               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
224          value = rowDual[iRow];
225          if (fabs(value) < 1.0e5)
226               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
227          else
228               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
229          value = rowLower[iRow];
230          if (fabs(value) < 1.0e5)
231               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
232          else
233               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
234          value = rowUpper[iRow];
235          if (fabs(value) < 1.0e5)
236               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
237          else
238               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
239          if (rowObjective) {
240               value = rowObjective[iRow];
241               if (fabs(value) < 1.0e5)
242                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
243               else
244                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
245          }
246          std::cout << std::endl;
247     }
248     std::cout << "--------------------------------------" << std::endl;
249
250     // Columns
251
252     int numberColumns = model2.numberColumns();
253
254     // Alternatively getColSolution()
255     double * columnPrimal = model2.primalColumnSolution();
256     // Alternatively getReducedCost()
257     double * columnDual = model2.dualColumnSolution();
258     // Alternatively getColLower()
259     double * columnLower = model2.columnLower();
260     // Alternatively getColUpper()
261     double * columnUpper = model2.columnUpper();
262     // Alternatively getObjCoefficients()
263     double * columnObjective = model2.objective();
264
265     // If we have not kept names (parameter to readMps) this will be 0
266     assert(model2.lengthNames());
267
268     // Column names
269     const std::vector<std::string> * columnNames = model2.columnNames();
270
271
272     int iColumn;
273
274     std::cout << "                       Primal          Dual         Lower         Upper          Cost"
275               << std::endl;
276
277     for (iColumn = 0; iColumn < numberColumns; iColumn++) {
278          double value;
279          std::cout << std::setw(6) << iColumn << " " << std::setw(8) << (*columnNames)[iColumn];
280          value = columnPrimal[iColumn];
281          if (fabs(value) < 1.0e5)
282               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
283          else
284               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
285          value = columnDual[iColumn];
286          if (fabs(value) < 1.0e5)
287               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
288          else
289               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
290          value = columnLower[iColumn];
291          if (fabs(value) < 1.0e5)
292               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
293          else
294               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
295          value = columnUpper[iColumn];
296          if (fabs(value) < 1.0e5)
297               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
298          else
299               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
300          value = columnObjective[iColumn];
301          if (fabs(value) < 1.0e5)
302               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
303          else
304               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
305
306          std::cout << std::endl;
307     }
308     std::cout << "--------------------------------------" << std::endl;
309
310     std::cout << std::resetiosflags(std::ios::fixed | std::ios::showpoint | std::ios::scientific);
311
312     // Now matrix
313     CoinPackedMatrix * matrix = model2.matrix();
314
315     const double * element = matrix->getElements();
316     const int * row = matrix->getIndices();
317     const int * start = matrix->getVectorStarts();
318     const int * length = matrix->getVectorLengths();
319
320     for (iColumn = 0; iColumn < numberColumns; iColumn++) {
321          std::cout << "Column " << iColumn;
322          int j;
323          for (j = start[iColumn]; j < start[iColumn] + length[iColumn]; j++)
324               std::cout << " ( " << row[j] << ", " << element[j] << ")";
325          std::cout << std::endl;
326     }
327     return 0;
328}
Note: See TracBrowser for help on using the repository browser.