source: trunk/Clp/examples/defaults.cpp @ 2278

Last change on this file since 2278 was 2278, checked in by forrest, 12 months ago

COIN_BIG_INDEX 2 changes

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