source: trunk/Clp/examples/driver.cpp

Last change on this file was 1662, checked in by lou, 7 years ago

Add EPL license notice in examples.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.9 KB
Line 
1/* $Id: driver.cpp 1662 2011-01-04 17:52:40Z forrest $ */
2// Copyright (C) 2002,2003 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 <iomanip>
8
9int main(int argc, const char *argv[])
10{
11     ClpSimplex  model;
12     int status;
13     // Keep names when reading an mps file
14     if (argc < 2) {
15#if defined(SAMPLEDIR)
16          status = model.readMps(SAMPLEDIR "/p0033.mps", true);
17#else
18          fprintf(stderr, "Do not know where to find sample MPS files.\n");
19          exit(1);
20#endif
21     } else
22          status = model.readMps(argv[1], true);
23
24     if (status) {
25          fprintf(stderr, "Bad readMps %s\n", argv[1]);
26          fprintf(stdout, "Bad readMps %s\n", argv[1]);
27          exit(1);
28     }
29#ifdef STYLE1
30     if (argc < 3 || !strstr(argv[2], "primal")) {
31          // Use the dual algorithm unless user said "primal"
32          model.initialDualSolve();
33     } else {
34          model.initialPrimalSolve();
35     }
36#else
37     ClpSolve solvectl;
38
39
40     if (argc < 3 || (!strstr(argv[2], "primal") && !strstr(argv[2], "barrier"))) {
41          // Use the dual algorithm unless user said "primal" or "barrier"
42          std::cout << std::endl << " Solve using Dual: " << std::endl;
43          solvectl.setSolveType(ClpSolve::useDual);
44          solvectl.setPresolveType(ClpSolve::presolveOn);
45          model.initialSolve(solvectl);
46     } else if (strstr(argv[2], "barrier")) {
47          // Use the barrier algorithm if user said "barrier"
48          std::cout << std::endl << " Solve using Barrier: " << std::endl;
49          solvectl.setSolveType(ClpSolve::useBarrier);
50          solvectl.setPresolveType(ClpSolve::presolveOn);
51          model.initialSolve(solvectl);
52     } else {
53          std::cout << std::endl << " Solve using Primal: " << std::endl;
54          solvectl.setSolveType(ClpSolve::usePrimal);
55          solvectl.setPresolveType(ClpSolve::presolveOn);
56          model.initialSolve(solvectl);
57     }
58#endif
59     std::string modelName;
60     model.getStrParam(ClpProbName, modelName);
61     std::cout << "Model " << modelName << " has " << model.numberRows() << " rows and " <<
62               model.numberColumns() << " columns" << std::endl;
63
64     // remove this to print solution
65
66     exit(0);
67
68     /*
69       Now to print out solution.  The methods used return modifiable
70       arrays while the alternative names return const pointers -
71       which is of course much more virtuous.
72
73       This version just does non-zero columns
74
75      */
76#if 0
77     int numberRows = model.numberRows();
78
79     // Alternatively getRowActivity()
80     double * rowPrimal = model.primalRowSolution();
81     // Alternatively getRowPrice()
82     double * rowDual = model.dualRowSolution();
83     // Alternatively getRowLower()
84     double * rowLower = model.rowLower();
85     // Alternatively getRowUpper()
86     double * rowUpper = model.rowUpper();
87     // Alternatively getRowObjCoefficients()
88     double * rowObjective = model.rowObjective();
89
90     // If we have not kept names (parameter to readMps) this will be 0
91     assert(model.lengthNames());
92
93     // Row names
94     const std::vector<std::string> * rowNames = model.rowNames();
95
96
97     int iRow;
98
99     std::cout << "                       Primal          Dual         Lower         Upper        (Cost)"
100               << std::endl;
101
102     for (iRow = 0; iRow < numberRows; iRow++) {
103          double value;
104          std::cout << std::setw(6) << iRow << " " << std::setw(8) << (*rowNames)[iRow];
105          value = rowPrimal[iRow];
106          if (fabs(value) < 1.0e5)
107               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
108          else
109               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
110          value = rowDual[iRow];
111          if (fabs(value) < 1.0e5)
112               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
113          else
114               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
115          value = rowLower[iRow];
116          if (fabs(value) < 1.0e5)
117               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
118          else
119               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
120          value = rowUpper[iRow];
121          if (fabs(value) < 1.0e5)
122               std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
123          else
124               std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
125          if (rowObjective) {
126               value = rowObjective[iRow];
127               if (fabs(value) < 1.0e5)
128                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
129               else
130                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
131          }
132          std::cout << std::endl;
133     }
134#endif
135     std::cout << "--------------------------------------" << std::endl;
136
137     // Columns
138
139     int numberColumns = model.numberColumns();
140
141     // Alternatively getColSolution()
142     double * columnPrimal = model.primalColumnSolution();
143     // Alternatively getReducedCost()
144     double * columnDual = model.dualColumnSolution();
145     // Alternatively getColLower()
146     double * columnLower = model.columnLower();
147     // Alternatively getColUpper()
148     double * columnUpper = model.columnUpper();
149     // Alternatively getObjCoefficients()
150     double * columnObjective = model.objective();
151
152     // If we have not kept names (parameter to readMps) this will be 0
153     assert(model.lengthNames());
154
155     // Column names
156     const std::vector<std::string> * columnNames = model.columnNames();
157
158
159     int iColumn;
160
161     std::cout << "                       Primal          Dual         Lower         Upper          Cost"
162               << std::endl;
163
164     for (iColumn = 0; iColumn < numberColumns; iColumn++) {
165          double value;
166          value = columnPrimal[iColumn];
167          if (fabs(value) > 1.0e-8) {
168               std::cout << std::setw(6) << iColumn << " " << std::setw(8) << (*columnNames)[iColumn];
169               if (fabs(value) < 1.0e5)
170                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
171               else
172                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
173               value = columnDual[iColumn];
174               if (fabs(value) < 1.0e5)
175                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
176               else
177                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
178               value = columnLower[iColumn];
179               if (fabs(value) < 1.0e5)
180                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
181               else
182                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
183               value = columnUpper[iColumn];
184               if (fabs(value) < 1.0e5)
185                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
186               else
187                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
188               value = columnObjective[iColumn];
189               if (fabs(value) < 1.0e5)
190                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
191               else
192                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
193
194               std::cout << std::endl;
195          }
196     }
197     std::cout << "--------------------------------------" << std::endl;
198
199     return 0;
200}
Note: See TracBrowser for help on using the repository browser.