source: trunk/Clp/examples/rowColumn.cpp

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

COIN_BIG_INDEX 2 changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1/* $Id: rowColumn.cpp 2278 2017-10-02 09:51:14Z unxusr $ */
2/* Copyright (C) 2004, International Business Machines Corporation
3   and others.  All Rights Reserved.
4
5   This sample program is designed to illustrate programming
6   techniques using CoinLP, has not been thoroughly tested
7   and comes without any warranty whatsoever.
8
9   You may copy, modify and distribute this sample program without
10   any restrictions whatsoever and without any payment to anyone.
11*/
12
13#include "ClpSimplex.hpp"
14#include <cstdio>
15#include <cassert>
16
17int main(int argc, const char *argv[])
18{
19     ClpSimplex  modelByRow, modelByColumn;
20
21     // This very simple example shows how to create a model by row and by column
22     int numberRows = 3;
23     int numberColumns = 5;
24     // Rim of problem is same in both cases
25     double objective [] = {1000.0, 400.0, 500.0, 10000.0, 10000.0};
26     double columnLower[] = {0.0, 0.0, 0.0, 0.0, 0.0};
27     double columnUpper[] = {COIN_DBL_MAX, COIN_DBL_MAX, COIN_DBL_MAX, 20.0, 20.0};
28     double rowLower[] = {20.0, -COIN_DBL_MAX, 8.0};
29     double rowUpper[] = {COIN_DBL_MAX, 30.0, 8.0};
30     // Matrix by row
31     CoinBigIndex rowStart[] = {0, 5, 10, 13};
32     int column[] = {0, 1, 2, 3, 4,
33                     0, 1, 2, 3, 4,
34                     0, 1, 2
35                    };
36     double elementByRow[] = {8.0, 5.0, 4.0, 4.0, -4.0,
37                              8.0, 4.0, 5.0, 5.0, -5.0,
38                              1.0, -1.0, -1.0
39                             };
40     // Matrix by column
41     CoinBigIndex columnStart[] = {0, 3, 6, 9, 11, 13};
42     int row[] = {0, 1, 2,
43                  0, 1, 2,
44                  0, 1, 2,
45                  0, 1,
46                  0, 1
47                 };
48     double elementByColumn[] = {8.0, 8.0, 1.0,
49                                 5.0, 4.0, -1.0,
50                                 4.0, 5.0, -1.0,
51                                 4.0, 5.0,
52                                 -4.0, -5.0
53                                };
54     CoinBigIndex numberElements;
55     // Do column version first as it can be done two ways
56     // a) As one step using matrix as stored
57     modelByColumn.loadProblem(numberColumns, numberRows, columnStart, row, elementByColumn,
58                               columnLower, columnUpper, objective,
59                               rowLower, rowUpper);
60     // Solve
61     modelByColumn.dual();
62     // check value of objective
63     assert(fabs(modelByColumn.objectiveValue() - 76000.0) < 1.0e-7);
64     // b) As two steps - first creating a CoinPackedMatrix
65     // NULL for column lengths indicate they are stored without gaps
66     // Look at CoinPackedMatrix.hpp for other ways to create a matrix
67     numberElements = columnStart[numberColumns];
68     CoinPackedMatrix byColumn(true, numberRows, numberColumns, numberElements,
69                               elementByColumn, row, columnStart, NULL);
70     // now load matrix and rim
71     modelByColumn.loadProblem(byColumn,
72                               columnLower, columnUpper, objective,
73                               rowLower, rowUpper);
74     // Solve
75     modelByColumn.dual();
76     // check value of objective
77     assert(fabs(modelByColumn.objectiveValue() - 76000.0) < 1.0e-7);
78     // Now do by row
79     // The false says row ordered so numberRows and numberColumns swapped - see CoinPackedMatrix.hpp
80     assert(numberElements == rowStart[numberRows]);    // check same number of elements in each copy
81     CoinPackedMatrix byRow(false, numberColumns, numberRows, numberElements,
82                            elementByRow, column, rowStart, NULL);
83     // now load matrix and rim
84     modelByRow.loadProblem(byRow,
85                            columnLower, columnUpper, objective,
86                            rowLower, rowUpper);
87     // Solve
88     modelByRow.dual();
89     // check value of objective
90     assert(fabs(modelByRow.objectiveValue() - 76000.0) < 1.0e-7);
91     // write solution
92     const double * solution = modelByRow.primalColumnSolution();
93     for (int i = 0; i < numberColumns; i++) {
94          if (solution[i])
95               printf("Column %d has value %g\n",
96                      i, solution[i]);
97     }
98     modelByRow.writeMps("Tiny.mps");
99     return 0;
100}
Note: See TracBrowser for help on using the repository browser.