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