source: trunk/Clp/examples/addColumns.cpp

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

COIN_BIG_INDEX 2 changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.2 KB
Line 
1/* $Id: addColumns.cpp 2278 2017-10-02 09:51:14Z stefan $ */
2// Copyright (C) 2005, 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
7// This is a simple example to create a model by column
8#include "ClpSimplex.hpp"
9#include "CoinHelperFunctions.hpp"
10#include "CoinTime.hpp"
11#include "CoinBuild.hpp"
12#include "CoinModel.hpp"
13#include <iomanip>
14#include <cassert>
15
16int main(int argc, const char *argv[])
17{
18#if COIN_BIG_INDEX<2
19     {
20          // Empty model
21          ClpSimplex  model;
22
23          // Bounds on rows - as dense vector
24          double lower[] = {2.0, 1.0};
25          double upper[] = {COIN_DBL_MAX, 1.0};
26
27          // Create space for 2 rows
28          model.resize(2, 0);
29          // Fill in
30          int i;
31          // Now row bounds
32          for (i = 0; i < 2; i++) {
33               model.setRowLower(i, lower[i]);
34               model.setRowUpper(i, upper[i]);
35          }
36          // Now add column 1
37          int column1Index[] = {0, 1};
38          double column1Value[] = {1.0, 1.0};
39          model.addColumn(2, column1Index, column1Value,
40                          0.0, 2, 1.0);
41          // Now add column 2
42          int column2Index[] = {1};
43          double column2Value[] = { -5.0};
44          model.addColumn(1, column2Index, column2Value,
45                          0.0, COIN_DBL_MAX, 0.0);
46          // Now add column 3
47          int column3Index[] = {0, 1};
48          double column3Value[] = {1.0, 1.0};
49          model.addColumn(2, column3Index, column3Value,
50                          0.0, 4.0, 4.0);
51          // solve
52          model.dual();
53
54          /*
55            Adding one column at a time has a significant overhead so let's
56            try a more complicated but faster way
57
58            First time adding in 10000 columns one by one
59
60          */
61          model.allSlackBasis();
62          ClpSimplex modelSave = model;
63          double time1 = CoinCpuTime();
64          int k;
65          for (k = 0; k < 10000; k++) {
66               int column2Index[] = {0, 1};
67               double column2Value[] = {1.0, -5.0};
68               model.addColumn(2, column2Index, column2Value,
69                               0.0, 1.0, 10000.0);
70          }
71          printf("Time for 10000 addColumn is %g\n", CoinCpuTime() - time1);
72          model.dual();
73          model = modelSave;
74          // Now use build
75          CoinBuild buildObject;
76          time1 = CoinCpuTime();
77          for (k = 0; k < 100000; k++) {
78               int column2Index[] = {0, 1};
79               double column2Value[] = {1.0, -5.0};
80               buildObject.addColumn(2, column2Index, column2Value,
81                                     0.0, 1.0, 10000.0);
82          }
83          model.addColumns(buildObject);
84          printf("Time for 100000 addColumn using CoinBuild is %g\n", CoinCpuTime() - time1);
85          model.dual();
86          model = modelSave;
87          // Now use build +-1
88          int del[] = {0, 1, 2};
89          model.deleteColumns(3, del);
90          CoinBuild buildObject2;
91          time1 = CoinCpuTime();
92          for (k = 0; k < 10000; k++) {
93               int column2Index[] = {0, 1};
94               double column2Value[] = {1.0, 1.0, -1.0};
95               int bias = k & 1;
96               buildObject2.addColumn(2, column2Index, column2Value + bias,
97                                      0.0, 1.0, 10000.0);
98          }
99          model.addColumns(buildObject2, true);
100          printf("Time for 10000 addColumn using CoinBuild+-1 is %g\n", CoinCpuTime() - time1);
101          model.dual();
102          model = modelSave;
103          // Now use build +-1
104          model.deleteColumns(3, del);
105          CoinModel modelObject2;
106          time1 = CoinCpuTime();
107          for (k = 0; k < 10000; k++) {
108               int column2Index[] = {0, 1};
109               double column2Value[] = {1.0, 1.0, -1.0};
110               int bias = k & 1;
111               modelObject2.addColumn(2, column2Index, column2Value + bias,
112                                      0.0, 1.0, 10000.0);
113          }
114          model.addColumns(modelObject2, true);
115          printf("Time for 10000 addColumn using CoinModel+-1 is %g\n", CoinCpuTime() - time1);
116          //model.writeMps("xx.mps");
117          model.dual();
118          model = modelSave;
119          // Now use model
120          CoinModel modelObject;
121          time1 = CoinCpuTime();
122          for (k = 0; k < 100000; k++) {
123               int column2Index[] = {0, 1};
124               double column2Value[] = {1.0, -5.0};
125               modelObject.addColumn(2, column2Index, column2Value,
126                                     0.0, 1.0, 10000.0);
127          }
128          model.addColumns(modelObject);
129          printf("Time for 100000 addColumn using CoinModel is %g\n", CoinCpuTime() - time1);
130          model.dual();
131          // Print column solution Just first 3 columns
132          int numberColumns = model.numberColumns();
133          numberColumns = CoinMin(3, numberColumns);
134
135          // Alternatively getColSolution()
136          double * columnPrimal = model.primalColumnSolution();
137          // Alternatively getReducedCost()
138          double * columnDual = model.dualColumnSolution();
139          // Alternatively getColLower()
140          double * columnLower = model.columnLower();  // Alternatively getColUpper()
141          double * columnUpper = model.columnUpper();
142          // Alternatively getObjCoefficients()
143          double * columnObjective = model.objective();
144
145          int iColumn;
146
147          std::cout << "               Primal          Dual         Lower         Upper          Cost"
148                    << std::endl;
149
150          for (iColumn = 0; iColumn < numberColumns; iColumn++) {
151               double value;
152               std::cout << std::setw(6) << iColumn << " ";
153               value = columnPrimal[iColumn];
154               if (fabs(value) < 1.0e5)
155                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
156               else
157                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
158               value = columnDual[iColumn];
159               if (fabs(value) < 1.0e5)
160                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
161               else
162                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
163               value = columnLower[iColumn];
164               if (fabs(value) < 1.0e5)
165                    std::cout << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(14) << value;
166               else
167                    std::cout << std::setiosflags(std::ios::scientific) << std::setw(14) << value;
168               value = columnUpper[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 = columnObjective[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
179               std::cout << std::endl;
180          }
181          std::cout << "--------------------------------------" << std::endl;
182     }
183     {
184          // Now copy a model
185          ClpSimplex  model;
186          int status;
187          if (argc < 2) {
188#if defined(SAMPLEDIR)
189               status = model.readMps(SAMPLEDIR "/p0033.mps", true);
190#else
191               fprintf(stderr, "Do not know where to find sample MPS files.\n");
192               exit(1);
193#endif
194          } else
195               status = model.readMps(argv[1]);
196          if (status) {
197               printf("errors on input\n");
198               exit(77);
199          }
200          model.initialSolve();
201          int numberRows = model.numberRows();
202          int numberColumns = model.numberColumns();
203          const double * rowLower = model.rowLower();
204          const double * rowUpper = model.rowUpper();
205
206          // Start off model2
207          ClpSimplex model2;
208          model2.addRows(numberRows, rowLower, rowUpper, NULL);
209
210          // Build object
211          CoinBuild buildObject;
212          // Add columns
213          const double * columnLower = model.columnLower();
214          const double * columnUpper = model.columnUpper();
215          const double * objective = model.objective();
216          CoinPackedMatrix * matrix = model.matrix();
217          const int * row = matrix->getIndices();
218          const int * columnLength = matrix->getVectorLengths();
219          const CoinBigIndex * columnStart = matrix->getVectorStarts();
220          const double * elementByColumn = matrix->getElements();
221          for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
222               CoinBigIndex start = columnStart[iColumn];
223               buildObject.addColumn(columnLength[iColumn], row + start, elementByColumn + start,
224                                     columnLower[iColumn], columnUpper[iColumn],
225                                     objective[iColumn]);
226          }
227
228          // add in
229          model2.addColumns(buildObject);
230          model2.initialSolve();
231     }
232     {
233          // and again
234          ClpSimplex  model;
235          int status;
236          if (argc < 2) {
237#if defined(SAMPLEDIR)
238               status = model.readMps(SAMPLEDIR "/p0033.mps", true);
239#else
240               fprintf(stderr, "Do not know where to find sample MPS files.\n");
241               exit(1);
242#endif
243          } else
244               status = model.readMps(argv[1]);
245          if (status) {
246               printf("errors on input\n");
247               exit(77);
248          }
249          model.initialSolve();
250          int numberRows = model.numberRows();
251          int numberColumns = model.numberColumns();
252          const double * rowLower = model.rowLower();
253          const double * rowUpper = model.rowUpper();
254
255          // Build object
256          CoinModel buildObject;
257          for (int iRow = 0; iRow < numberRows; iRow++)
258               buildObject.setRowBounds(iRow, rowLower[iRow], rowUpper[iRow]);
259
260          // Add columns
261          const double * columnLower = model.columnLower();
262          const double * columnUpper = model.columnUpper();
263          const double * objective = model.objective();
264          CoinPackedMatrix * matrix = model.matrix();
265          const int * row = matrix->getIndices();
266          const int * columnLength = matrix->getVectorLengths();
267          const CoinBigIndex * columnStart = matrix->getVectorStarts();
268          const double * elementByColumn = matrix->getElements();
269          for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
270               CoinBigIndex start = columnStart[iColumn];
271               buildObject.addColumn(columnLength[iColumn], row + start, elementByColumn + start,
272                                     columnLower[iColumn], columnUpper[iColumn],
273                                     objective[iColumn]);
274          }
275
276          // add in
277          ClpSimplex model2;
278          model2.loadProblem(buildObject);
279          model2.initialSolve();
280     }
281#else
282     printf("addColumns not available with COIN_BIG_INDEX=2\n");
283#endif
284     return 0;
285}
Note: See TracBrowser for help on using the repository browser.