source: stable/1.13/Clp/examples/testBasis.cpp @ 1898

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

merge split branch into trunk

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