source: trunk/Clp/examples/addColumns.cpp @ 1559

Last change on this file since 1559 was 1559, checked in by stefan, 8 years ago

merge split branch into trunk

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