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

Last change on this file since 1552 was 1552, checked in by mjs, 11 years ago

Format examples with 'astyle -A4 -p'.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.7 KB
Line 
1/* $Id: addColumns.cpp 1552 2010-05-25 01:03:59Z mjs $ */
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               status = model.readMps("../../Data/Sample/p0033.mps");
187          else
188               status = model.readMps(argv[1]);
189          if (status) {
190               printf("errors on input\n");
191               exit(77);
192          }
193          model.initialSolve();
194          int numberRows = model.numberRows();
195          int numberColumns = model.numberColumns();
196          const double * rowLower = model.rowLower();
197          const double * rowUpper = model.rowUpper();
198
199          // Start off model2
200          ClpSimplex model2;
201          model2.addRows(numberRows, rowLower, rowUpper, NULL);
202
203          // Build object
204          CoinBuild buildObject;
205          // Add columns
206          const double * columnLower = model.columnLower();
207          const double * columnUpper = model.columnUpper();
208          const double * objective = model.objective();
209          CoinPackedMatrix * matrix = model.matrix();
210          const int * row = matrix->getIndices();
211          const int * columnLength = matrix->getVectorLengths();
212          const CoinBigIndex * columnStart = matrix->getVectorStarts();
213          const double * elementByColumn = matrix->getElements();
214          for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
215               CoinBigIndex start = columnStart[iColumn];
216               buildObject.addColumn(columnLength[iColumn], row + start, elementByColumn + start,
217                                     columnLower[iColumn], columnUpper[iColumn],
218                                     objective[iColumn]);
219          }
220
221          // add in
222          model2.addColumns(buildObject);
223          model2.initialSolve();
224     }
225     {
226          // and again
227          ClpSimplex  model;
228          int status;
229          if (argc < 2)
230               status = model.readMps("../../Data/Sample/p0033.mps");
231          else
232               status = model.readMps(argv[1]);
233          if (status) {
234               printf("errors on input\n");
235               exit(77);
236          }
237          model.initialSolve();
238          int numberRows = model.numberRows();
239          int numberColumns = model.numberColumns();
240          const double * rowLower = model.rowLower();
241          const double * rowUpper = model.rowUpper();
242
243          // Build object
244          CoinModel buildObject;
245          for (int iRow = 0; iRow < numberRows; iRow++)
246               buildObject.setRowBounds(iRow, rowLower[iRow], rowUpper[iRow]);
247
248          // Add columns
249          const double * columnLower = model.columnLower();
250          const double * columnUpper = model.columnUpper();
251          const double * objective = model.objective();
252          CoinPackedMatrix * matrix = model.matrix();
253          const int * row = matrix->getIndices();
254          const int * columnLength = matrix->getVectorLengths();
255          const CoinBigIndex * columnStart = matrix->getVectorStarts();
256          const double * elementByColumn = matrix->getElements();
257          for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
258               CoinBigIndex start = columnStart[iColumn];
259               buildObject.addColumn(columnLength[iColumn], row + start, elementByColumn + start,
260                                     columnLower[iColumn], columnUpper[iColumn],
261                                     objective[iColumn]);
262          }
263
264          // add in
265          ClpSimplex model2;
266          model2.loadProblem(buildObject);
267          model2.initialSolve();
268     }
269     return 0;
270}
Note: See TracBrowser for help on using the repository browser.