source: trunk/Clp/examples/ekk.cpp @ 1559

Last change on this file since 1559 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: 5.8 KB
Line 
1/* $Id: ekk.cpp 1559 2010-06-05 19:42:36Z stefan $ */
2// Copyright (C) 2002, International Business Machines
3// Corporation and others.  All Rights Reserved.
4
5/*  This can be used to compare OSL and Clp.  The interface functions
6    below (in ekk_interface.cpp) were written so that calls to osl
7    in the middle of complex algorithms could easily be swapped
8    for Clp code.  This was to stress test Clp (and Osl :-)).
9
10    With the addition of ekk_crash it may be used to see if we need
11    a crash in Clp.  With "both" set it can also be used to see which
12    gives better behavior after postSolve.
13
14    However they may be useful as sample code.  Virtuous people would
15    add return code checking.
16
17    This main could just as easily be C code.
18
19*/
20
21#include "ekk_c_api.h"
22// These interface functions are needed
23// Note - This example wastes memory as it has several copies of matrix
24/* As ekk_primalSimplex + postsolve instructions:
25   presolve - 0 , no presolve, 1 presolve but no primal after postsolve,
26                  2 do primal if any infeasibilities,
27                  3 always do primal.
28*/
29extern "C" int ekk_primalClp(EKKModel * model, int  startup, int presolve);
30
31/* As ekk_dualSimplex + postsolve instructions:
32   presolve - 0 , no presolve, 1 presolve but no primal after postsolve,
33                  2 do primal if any infeasibilities,
34                  3 always do primal.
35*/
36extern "C" int ekk_dualClp(EKKModel * model, int presolve);
37
38/* rather like ekk_preSolve (3) plus:
39   keepIntegers - false to treat as if continuous
40   pass   - do this many passes (0==default(5))
41
42   returns 1 if infeasible
43*/
44extern "C" int ekk_preSolveClp(EKKModel * model, bool keepIntegers,
45                               int pass);
46
47#include "ClpSimplex.hpp"
48#include <stdio.h>
49#include <stdarg.h>
50
51int main(int argc, const char *argv[])
52{
53     const char * name;
54     // problem is actually scaled for osl, dynamically for clp (slows clp)
55     // default is primal, no presolve, minimise and use clp
56     bool    primal = true, presolve = false;
57     int useosl = 0;
58     bool freeFormat = false;
59     bool exportIt = false;
60
61     EKKModel * model;
62     EKKContext * context;
63
64     if (argc > 1) {
65          name = argv[1];
66     } else {
67#if defined(COIN_HAS_SAMPLE) && defined(SAMPLEDIR)
68          name = (SAMPLEDIR "/p0033.mps";
69#else
70          fprintf(stderr, "Do not know where to find sample MPS files.\n");
71          exit(1);
72#endif
73             }
74
75             /* initialize OSL environment */
76             context = ekk_initializeContext();
77     model = ekk_newModel(context, "");
78
79     int i;
80     printf("*** Options ");
81     for (i = 2; i < argc; i++) {
82          printf("%s ", argv[i]);
83     }
84     printf("\n");
85
86     // see if free format needed
87
88     for (i = 2; i < argc; i++) {
89          if (!strncmp(argv[i], "free", 4)) {
90               freeFormat = true;
91          }
92     }
93
94     // create model from MPS file
95
96     if (!freeFormat) {
97          ekk_importModel(model, name);
98     } else {
99          ekk_importModelFree(model, name);
100     }
101
102     // other options
103     for (i = 2; i < argc; i++) {
104          if (!strncmp(argv[i], "max", 3)) {
105               if (!strncmp(argv[i], "max2", 4)) {
106                    // This is for testing - it just reverses signs and maximizes
107                    int i, n = ekk_getInumcols(model);
108                    double * objective = ekk_getObjective(model);
109                    for (i = 0; i < n; i++) {
110                         objective[i] = -objective[i];
111                    }
112                    ekk_setObjective(model, objective);
113                    ekk_setMaximize(model);
114               } else {
115                    // maximize
116                    ekk_setMaximize(model);
117               }
118          }
119          if (!strncmp(argv[i], "dual", 4)) {
120               primal = false;
121          }
122          if (!strncmp(argv[i], "presol", 6)) {
123               presolve = true;
124          }
125          if (!strncmp(argv[i], "osl", 3)) {
126               useosl = 1;
127          }
128          if (!strncmp(argv[i], "both", 4)) {
129               useosl = 2;
130          }
131          if (!strncmp(argv[i], "export", 6)) {
132               exportIt = true;
133          }
134     }
135     if (useosl) {
136          // OSL
137          if (presolve)
138               ekk_preSolve(model, 3, NULL);
139          ekk_scale(model);
140
141          if (primal)
142               ekk_primalSimplex(model, 1);
143          else
144               ekk_dualSimplex(model);
145          if (presolve) {
146               ekk_postSolve(model, NULL);
147               ekk_primalSimplex(model, 3);
148          }
149          if (useosl == 2)
150               ekk_allSlackBasis(model);    // otherwise it would be easy
151     }
152     if ((useosl & 2) == 0) {
153          // CLP
154          if (presolve)
155               ekk_preSolveClp(model, true, 5);
156          /* 3 is because it is ignored if no presolve, and we
157             are forcing Clp to re-optimize */
158          if (primal)
159               ekk_primalClp(model, 1, 3);
160          else
161               ekk_dualClp(model, 3);
162     }
163     if (exportIt) {
164          ClpSimplex * clp = new ClpSimplex();;
165          int numberRows = ekk_getInumrows(model);
166          int numberColumns = ekk_getInumcols(model);
167          clp->loadProblem(numberColumns, numberRows, ekk_blockColumn(model, 0),
168                           ekk_blockRow(model, 0), ekk_blockElement(model, 0),
169                           ekk_collower(model), ekk_colupper(model),
170                           ekk_objective(model),
171                           ekk_rowlower(model), ekk_rowupper(model));
172          // Do integer stuff
173          int * which =  ekk_listOfIntegers(model);
174          int numberIntegers =  ekk_getInumints(model);
175          for (int i = 0; i < numberIntegers; i++)
176               clp->setInteger(which[i]);
177          ekk_free(which);
178          clp->writeMps("try1.mps");
179          delete clp;
180     }
181     ekk_deleteModel(model);
182     ekk_endContext(context);
183     return 0;
184}
Note: See TracBrowser for help on using the repository browser.