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

Last change on this file since 755 was 579, checked in by forrest, 13 years ago

add stuff

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