source: trunk/Clp/examples/ekk.cpp

Last change on this file was 1662, checked in by lou, 8 years ago

Add EPL license notice in examples.

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