source: trunk/Clp/examples/makeDual.cpp @ 778

Last change on this file since 778 was 778, checked in by andreasw, 13 years ago

corrected Externals to exclude MSDevStudio; made Clp examples to work

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.6 KB
Line 
1// Copyright (C) 2005, International Business Machines
2// Corporation and others.  All Rights Reserved.
3
4#include "ClpSimplex.hpp"
5#include "CoinHelperFunctions.hpp"
6#include "CoinBuild.hpp"
7int main (int argc, const char *argv[])
8{
9  ClpSimplex  model;
10  int status;
11  if (argc<2)
12    status=model.readMps("../../Data/Sample/p0033.mps");
13  else
14    status=model.readMps(argv[1]);
15  if (status) {
16    printf("errors on input\n");
17    exit(77);
18  }
19  {
20    // check if we need to change bounds to rows
21    int numberColumns = model.numberColumns();
22    const double * columnLower = model.columnLower();
23    const double * columnUpper = model.columnUpper();
24    int iColumn;
25    CoinBuild build;
26    double one=1.0;
27    for (iColumn=0;iColumn<numberColumns;iColumn++) {
28      if (columnUpper[iColumn]<1.0e20&&
29          columnLower[iColumn]>-1.0e20) {
30        if (fabs(columnLower[iColumn])<fabs(columnUpper[iColumn])) {
31          double value = columnUpper[iColumn];
32          model.setColumnUpper(iColumn,COIN_DBL_MAX);
33          build.addRow(1,&iColumn,&one,-COIN_DBL_MAX,value);
34        } else {
35          double value = columnLower[iColumn];
36          model.setColumnLower(iColumn,-COIN_DBL_MAX);
37          build.addRow(1,&iColumn,&one,value,COIN_DBL_MAX);
38        }
39      }
40    }
41    if (build.numberRows())
42      model.addRows(build);
43  }
44  int numberColumns = model.numberColumns();
45  const double * columnLower = model.columnLower();
46  const double * columnUpper = model.columnUpper();
47  int numberRows = model.numberRows();
48  double * rowLower = CoinCopyOfArray(model.rowLower(),numberRows);
49  double * rowUpper = CoinCopyOfArray(model.rowUpper(),numberRows);
50
51  const double * objective = model.objective();
52  CoinPackedMatrix * matrix = model.matrix();
53  // get transpose
54  CoinPackedMatrix rowCopy = *matrix;
55  int iRow,iColumn;
56  int numberExtraRows=0;
57  for (iRow=0;iRow<numberRows;iRow++) {
58    if (rowLower[iRow]<-1.0e20) {
59    } else if (rowUpper[iRow]>1.0e20) {
60    } else {
61      if (rowUpper[iRow]!=rowLower[iRow])
62         numberExtraRows++;
63    }
64  }
65  const int * row = matrix->getIndices();
66  const int * columnLength = matrix->getVectorLengths();
67  const CoinBigIndex * columnStart = matrix->getVectorStarts();
68  const double * elementByColumn = matrix->getElements();
69  double objOffset=0.0;
70  for (iColumn=0;iColumn<numberColumns;iColumn++) {
71    double offset=0.0;
72    if (columnUpper[iColumn]>1.0e20) {
73      if (columnLower[iColumn]>-1.0e20)
74        offset=columnLower[iColumn];
75    } else if (columnLower[iColumn]<-1.0e20) {
76      offset=columnUpper[iColumn];
77    } else {
78      // taken care of before
79      abort();
80    }
81    if (offset) {
82      objOffset += offset*objective[iColumn];
83      for (CoinBigIndex j=columnStart[iColumn];
84           j<columnStart[iColumn]+columnLength[iColumn];j++) {
85        int iRow = row[j];
86        if (rowLower[iRow]>-1.0e20)
87          rowLower[iRow] -= offset*elementByColumn[j];
88        if (rowUpper[iRow]<1.0e20)
89          rowUpper[iRow] -= offset*elementByColumn[j];
90      }
91    }
92  }
93  int * which = new int[numberRows+numberExtraRows];
94  rowCopy.reverseOrdering();
95  rowCopy.transpose();
96  double * fromRowsLower = new double[numberRows+numberExtraRows];
97  double * fromRowsUpper = new double[numberRows+numberExtraRows];
98  double * newObjective = new double[numberRows+numberExtraRows];
99  double * fromColumnsLower = new double[numberColumns];
100  double * fromColumnsUpper = new double[numberColumns];
101  for (iColumn=0;iColumn<numberColumns;iColumn++) {
102    // Offset is already in
103    if (columnUpper[iColumn]>1.0e20) {
104      if (columnLower[iColumn]>-1.0e20) {
105        fromColumnsLower[iColumn]=-COIN_DBL_MAX;
106        fromColumnsUpper[iColumn]=objective[iColumn];
107      } else {
108        // free
109        fromColumnsLower[iColumn]=objective[iColumn];
110        fromColumnsUpper[iColumn]=objective[iColumn];
111      }
112    } else if (columnLower[iColumn]<-1.0e20) {
113      fromColumnsLower[iColumn]=objective[iColumn];
114      fromColumnsUpper[iColumn]=COIN_DBL_MAX;
115    } else {
116      abort();
117    }
118  }
119  int kRow=0;
120  for (iRow=0;iRow<numberRows;iRow++) {
121    if (rowLower[iRow]<-1.0e20) {
122      assert (rowUpper[iRow]<1.0e20);
123      newObjective[kRow]=-rowUpper[iRow];
124      fromRowsLower[kRow]=-COIN_DBL_MAX;
125      fromRowsUpper[kRow]=0.0;
126      which[kRow]=iRow;
127      kRow++;
128    } else if (rowUpper[iRow]>1.0e20) {
129      newObjective[kRow]=-rowLower[iRow];
130      fromRowsLower[kRow]=0.0;
131      fromRowsUpper[kRow]=COIN_DBL_MAX;
132      which[kRow]=iRow;
133      kRow++;
134    } else {
135      if (rowUpper[iRow]==rowLower[iRow]) {
136        newObjective[kRow]=-rowLower[iRow];
137        fromRowsLower[kRow]=-COIN_DBL_MAX;;
138        fromRowsUpper[kRow]=COIN_DBL_MAX;
139        which[kRow]=iRow;
140        kRow++;
141      } else {
142        // range
143        newObjective[kRow]=-rowUpper[iRow];
144        fromRowsLower[kRow]=-COIN_DBL_MAX;
145        fromRowsUpper[kRow]=0.0;
146        which[kRow]=iRow;
147        kRow++;
148        newObjective[kRow]=-rowLower[iRow];
149        fromRowsLower[kRow]=0.0;
150        fromRowsUpper[kRow]=COIN_DBL_MAX;
151        which[kRow]=iRow;
152        kRow++;
153      }
154    }
155  }
156  if (numberExtraRows) {
157    CoinPackedMatrix newCopy;
158    newCopy.submatrixOfWithDuplicates(rowCopy,kRow,which);
159    rowCopy=newCopy;
160  }
161  ClpSimplex modelDual;
162  modelDual.loadProblem(rowCopy,fromRowsLower,fromRowsUpper,newObjective,
163                        fromColumnsLower,fromColumnsUpper);
164  modelDual.setObjectiveOffset(objOffset);
165  delete [] fromRowsLower;
166  delete [] fromRowsUpper;
167  delete [] fromColumnsLower;
168  delete [] fromColumnsUpper;
169  delete [] newObjective;
170  delete [] which;
171  delete [] rowLower;
172  delete [] rowUpper;
173  modelDual.writeMps("dual.mps");
174  return 0;
175}   
Note: See TracBrowser for help on using the repository browser.