source: trunk/Clp/examples/testBasis.cpp @ 2278

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

COIN_BIG_INDEX 2 changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1/* $Id: testBasis.cpp 2278 2017-10-02 09:51:14Z forrest $ */
2// Copyright (C) 2003, 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#include "ClpSimplex.hpp"
7#include "CoinHelperFunctions.hpp"
8#include <iomanip>
9#include <cassert>
10
11int main(int argc, const char *argv[])
12{
13     ClpSimplex  model;
14     int status;
15     // Keep names
16     if (argc < 2) {
17          status = model.readMps("small.mps", true);
18     } else {
19          status = model.readMps(argv[1], true);
20     }
21     if (status)
22          exit(10);
23     /*
24       This driver turns a problem into all equalities, solves it and
25       then creates optimal basis.
26     */
27
28     // copy of original
29     ClpSimplex model2(model);
30     // And another
31     ClpSimplex model3(model);
32
33     int originalNumberColumns = model.numberColumns();
34     int numberRows = model.numberRows();
35
36     CoinBigIndex * addStarts = new CoinBigIndex [numberRows+1];
37     int * addRow = new int[numberRows];
38     double * addElement = new double[numberRows];
39     double * newUpper = new double[numberRows];
40     double * newLower = new double[numberRows];
41
42     double * lower = model2.rowLower();
43     double * upper = model2.rowUpper();
44     int iRow;
45     // Simplest is to change all rhs to zero
46     // One should skip E rows but this is simpler coding
47     for (iRow = 0; iRow < numberRows; iRow++) {
48          newUpper[iRow] = upper[iRow];
49          upper[iRow] = 0.0;
50          newLower[iRow] = lower[iRow];
51          lower[iRow] = 0.0;
52          addRow[iRow] = iRow;
53          addElement[iRow] = -1.0;
54          addStarts[iRow] = iRow;
55     }
56     addStarts[numberRows] = numberRows;
57     model2.addColumns(numberRows, newLower, newUpper, NULL,
58                       addStarts, addRow, addElement);
59     delete [] addStarts;
60     delete [] addRow;
61     delete [] addElement;
62     delete [] newLower;
63     delete [] newUpper;
64
65     // Modify costs
66     double * randomArray = new double[numberRows];
67     for (iRow = 0; iRow < numberRows; iRow++)
68          randomArray[iRow] = CoinDrand48();
69
70     model2.transposeTimes(1.0, randomArray, model2.objective());
71     delete [] randomArray;
72     // solve
73     model2.primal();
74     // first check okay if solution values back
75     memcpy(model.primalColumnSolution(), model2.primalColumnSolution(),
76            originalNumberColumns * sizeof(double));
77     memcpy(model.primalRowSolution(), model2.primalRowSolution(),
78            numberRows * sizeof(double));
79     int iColumn;
80     for (iColumn = 0; iColumn < originalNumberColumns; iColumn++)
81          model.setColumnStatus(iColumn, model2.getColumnStatus(iColumn));
82
83     for (iRow = 0; iRow < numberRows; iRow++) {
84          if (model2.getRowStatus(iRow) == ClpSimplex::basic) {
85               model.setRowStatus(iRow, ClpSimplex::basic);
86          } else {
87               model.setRowStatus(iRow, model2.getColumnStatus(iRow + originalNumberColumns));
88          }
89     }
90     model.primal(0);
91     // and now without solution values
92
93     for (iColumn = 0; iColumn < originalNumberColumns; iColumn++)
94          model3.setColumnStatus(iColumn, model2.getColumnStatus(iColumn));
95
96     for (iRow = 0; iRow < numberRows; iRow++)
97          model3.setRowStatus(iRow, model2.getColumnStatus(iRow + originalNumberColumns));
98     model3.primal(0);
99     return 0;
100}
Note: See TracBrowser for help on using the repository browser.