Idiot.hpp
Go to the documentation of this file.
1 /* $Id: Idiot.hpp 2143 2015-05-20 15:49:17Z forrest $ */
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 // "Idiot" as the name of this algorithm is copylefted. If you want to change
7 // the name then it should be something equally stupid (but not "Stupid") or
8 // even better something witty.
9 
10 #ifndef Idiot_H
11 #define Idiot_H
12 #ifndef OSI_IDIOT
13 #include "ClpSimplex.hpp"
14 #define OsiSolverInterface ClpSimplex
15 #else
16 #include "OsiSolverInterface.hpp"
17 typedef int CoinBigIndex;
18 #endif
19 class CoinMessageHandler;
20 class CoinMessages;
22 typedef struct {
23  double infeas;
24  double objval;
25  double dropThis;
26  double weighted;
27  double sumSquared;
28  double djAtBeginning;
29  double djAtEnd;
30  int iteration;
31 } IdiotResult;
48 class Idiot {
49 
50 public:
51 
56  Idiot ( );
59  Idiot ( OsiSolverInterface & model );
60 
62  Idiot(const Idiot &);
64  Idiot & operator=(const Idiot & rhs);
66  ~Idiot ( );
68 
69 
73  void solve();
76  void crash(int numberPass, CoinMessageHandler * handler,
77  const CoinMessages * messages, bool doCrossover = true);
87  void crossOver(int mode);
89 
90 
96  inline double getStartingWeight() const {
97  return mu_;
98  }
99  inline void setStartingWeight(double value) {
100  mu_ = value;
101  }
104  inline double getWeightFactor() const {
105  return muFactor_;
106  }
107  inline void setWeightFactor(double value) {
108  muFactor_ = value;
109  }
113  inline double getFeasibilityTolerance() const {
114  return smallInfeas_;
115  }
116  inline void setFeasibilityTolerance(double value) {
117  smallInfeas_ = value;
118  }
122  inline double getReasonablyFeasible() const {
123  return reasonableInfeas_;
124  }
125  inline void setReasonablyFeasible(double value) {
126  reasonableInfeas_ = value;
127  }
130  inline double getExitInfeasibility() const {
131  return exitFeasibility_;
132  }
133  inline void setExitInfeasibility(double value) {
134  exitFeasibility_ = value;
135  }
138  inline int getMajorIterations() const {
139  return majorIterations_;
140  }
141  inline void setMajorIterations(int value) {
142  majorIterations_ = value;
143  }
150  inline int getMinorIterations() const {
151  return maxIts2_;
152  }
153  inline void setMinorIterations(int value) {
154  maxIts2_ = value;
155  }
156  // minor iterations for first time
157  inline int getMinorIterations0() const {
158  return maxIts_;
159  }
160  inline void setMinorIterations0(int value) {
161  maxIts_ = value;
162  }
166  inline int getReduceIterations() const {
167  return maxBigIts_;
168  }
169  inline void setReduceIterations(int value) {
170  maxBigIts_ = value;
171  }
173  inline int getLogLevel() const {
174  return logLevel_;
175  }
176  inline void setLogLevel(int value) {
177  logLevel_ = value;
178  }
180  inline int getLightweight() const {
181  return lightWeight_;
182  }
183  inline void setLightweight(int value) {
184  lightWeight_ = value;
185  }
187  inline int getStrategy() const {
188  return strategy_;
189  }
190  inline void setStrategy(int value) {
191  strategy_ = value;
192  }
194  inline double getDropEnoughFeasibility() const {
195  return dropEnoughFeasibility_;
196  }
197  inline void setDropEnoughFeasibility(double value) {
198  dropEnoughFeasibility_ = value;
199  }
201  inline double getDropEnoughWeighted() const {
202  return dropEnoughWeighted_;
203  }
204  inline void setDropEnoughWeighted(double value) {
205  dropEnoughWeighted_ = value;
206  }
208  inline void setModel(OsiSolverInterface * model) {
209  model_ = model;
210  };
212 
213 
215 private:
216 
218  // allow public!
219 public:
220  void solve2(CoinMessageHandler * handler, const CoinMessages *messages);
221 private:
223  int nrows, int ncols, double * rowsol , double * colsol,
224  double * pi, double * djs, const double * origcost ,
225  double * rowlower,
226  double * rowupper, const double * lower,
227  const double * upper, const double * element,
228  const int * row, const CoinBigIndex * colcc,
229  const int * length, double * lambda,
230  int maxIts, double mu, double drop,
231  double maxmin, double offset,
232  int strategy, double djTol, double djExit, double djFlag,
233  CoinThreadRandom * randomNumberGenerator);
234  int dropping(IdiotResult result,
235  double tolerance,
236  double small,
237  int *nbad);
238  IdiotResult objval(int nrows, int ncols, double * rowsol , double * colsol,
239  double * pi, double * djs, const double * cost ,
240  const double * rowlower,
241  const double * rowupper, const double * lower,
242  const double * upper, const double * elemnt,
243  const int * row, const CoinBigIndex * columnStart,
244  const int * length, int extraBlock, int * rowExtra,
245  double * solExtra, double * elemExtra, double * upperExtra,
246  double * costExtra, double weight);
247  // Deals with whenUsed and slacks
248  int cleanIteration(int iteration, int ordinaryStart, int ordinaryEnd,
249  double * colsol, const double * lower, const double * upper,
250  const double * rowLower, const double * rowUpper,
251  const double * cost, const double * element, double fixTolerance, double & objChange,
252  double & infChange, double & maxInfeasibility);
253 private:
256 
257  double djTolerance_;
258  double mu_; /* starting mu */
259  double drop_; /* exit if drop over 5 checks less than this */
260  double muFactor_; /* reduce mu by this */
261  double stopMu_; /* exit if mu gets smaller than this */
262  double smallInfeas_; /* feasibility tolerance */
263  double reasonableInfeas_; /* use lambdas if feasibility less than this */
264  double exitDrop_; /* candidate for stopping after a major iteration */
265  double muAtExit_; /* mu on exit */
266  double exitFeasibility_; /* exit if infeasibility less than this */
267  double dropEnoughFeasibility_; /* okay if feasibility drop this factor */
268  double dropEnoughWeighted_; /* okay if weighted obj drop this factor */
269  int * whenUsed_; /* array to say what was used */
270  int maxBigIts_; /* always reduce mu after this */
271  int maxIts_; /* do this many iterations on first go */
274  int logFreq_;
275  int checkFrequency_; /* can exit after 5 * this iterations (on drop) */
276  int lambdaIterations_; /* do at least this many lambda iterations */
277  int maxIts2_; /* do this many iterations on subsequent goes */
278  int strategy_; /* 0 - default strategy
279  1 - do accelerator step but be cautious
280  2 - do not do accelerator step
281  4 - drop, exitDrop and djTolerance all relative
282  8 - keep accelerator step to theta=10.0
283 
284  32 - Scale
285  512 - crossover
286  2048 - keep lambda across mu change
287  4096 - return best solution (not last found)
288  8192 - always do a presolve in crossover
289  16384 - costed slacks found - so whenUsed_ longer
290  32768 - experimental 1
291  65536 - experimental 2
292  131072 - experimental 3
293  262144 - just values pass etc
294  524288 - don't treat structural slacks as slacks */
295 
296  int lightWeight_; // 0 - normal, 1 lightweight
297 };
298 #endif
int lightWeight_
Definition: Idiot.hpp:296
int CoinBigIndex
Idiot()
Default constructor.
double getFeasibilityTolerance() const
Feasibility tolerance - problem essentially feasible if individual infeasibilities less than this...
Definition: Idiot.hpp:113
double mu_
Definition: Idiot.hpp:258
int getMajorIterations() const
Major iterations.
Definition: Idiot.hpp:138
double djAtEnd
Definition: Idiot.hpp:29
for use internally
Definition: Idiot.hpp:22
Base class for message handling.
double sumSquared
Definition: Idiot.hpp:27
int getMinorIterations() const
Minor iterations.
Definition: Idiot.hpp:150
void setExitInfeasibility(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:133
int getReduceIterations() const
Reduce weight after this many major iterations.
Definition: Idiot.hpp:166
double drop_
Definition: Idiot.hpp:259
double djAtBeginning
Definition: Idiot.hpp:28
void setDropEnoughWeighted(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:204
int dropping(IdiotResult result, double tolerance, double small, int *nbad)
void setReduceIterations(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:169
void setStartingWeight(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:99
void setFeasibilityTolerance(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:116
double exitFeasibility_
Definition: Idiot.hpp:266
void setMajorIterations(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:141
double exitDrop_
Definition: Idiot.hpp:264
double muFactor_
Definition: Idiot.hpp:260
double getDropEnoughWeighted() const
Fine tuning - okay if weighted obj drop this factor.
Definition: Idiot.hpp:201
void setReasonablyFeasible(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:125
double dropEnoughWeighted_
Definition: Idiot.hpp:268
double getStartingWeight() const
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:96
void setLogLevel(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:176
~Idiot()
Destructor.
void setMinorIterations(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:153
int cleanIteration(int iteration, int ordinaryStart, int ordinaryEnd, double *colsol, const double *lower, const double *upper, const double *rowLower, const double *rowUpper, const double *cost, const double *element, double fixTolerance, double &objChange, double &infChange, double &maxInfeasibility)
int getMinorIterations0() const
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:157
double weighted
Definition: Idiot.hpp:26
void solve()
Get an approximate solution with the idiot code.
int lambdaIterations_
Definition: Idiot.hpp:276
void crossOver(int mode)
Use simplex to get an optimal solution mode is how many steps the simplex crossover should take to ar...
int maxIts_
Definition: Idiot.hpp:271
int logLevel_
Definition: Idiot.hpp:273
double reasonableInfeas_
Definition: Idiot.hpp:263
int majorIterations_
Definition: Idiot.hpp:272
void setWeightFactor(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:107
double getDropEnoughFeasibility() const
Fine tuning - okay if feasibility drop this factor.
Definition: Idiot.hpp:194
int * whenUsed_
Definition: Idiot.hpp:269
void setLightweight(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:183
double muAtExit_
Definition: Idiot.hpp:265
double smallInfeas_
Definition: Idiot.hpp:262
double dropEnoughFeasibility_
Definition: Idiot.hpp:267
int getStrategy() const
strategy
Definition: Idiot.hpp:187
void crash(int numberPass, CoinMessageHandler *handler, const CoinMessages *messages, bool doCrossover=true)
Lightweight "crash".
int iteration
Definition: Idiot.hpp:30
double dropThis
Definition: Idiot.hpp:25
Abstract Base Class for describing an interface to a solver.
void setDropEnoughFeasibility(double value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:197
IdiotResult objval(int nrows, int ncols, double *rowsol, double *colsol, double *pi, double *djs, const double *cost, const double *rowlower, const double *rowupper, const double *lower, const double *upper, const double *elemnt, const int *row, const CoinBigIndex *columnStart, const int *length, int extraBlock, int *rowExtra, double *solExtra, double *elemExtra, double *upperExtra, double *costExtra, double weight)
int strategy_
Definition: Idiot.hpp:278
IdiotResult IdiSolve(int nrows, int ncols, double *rowsol, double *colsol, double *pi, double *djs, const double *origcost, double *rowlower, double *rowupper, const double *lower, const double *upper, const double *element, const int *row, const CoinBigIndex *colcc, const int *length, double *lambda, int maxIts, double mu, double drop, double maxmin, double offset, int strategy, double djTol, double djExit, double djFlag, CoinThreadRandom *randomNumberGenerator)
int getLogLevel() const
Amount of information - default of 1 should be okay.
Definition: Idiot.hpp:173
void solve2(CoinMessageHandler *handler, const CoinMessages *messages)
Stuff for internal use.
Idiot & operator=(const Idiot &rhs)
Assignment operator. This copies the data.
void setStrategy(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:190
double djTolerance_
Definition: Idiot.hpp:257
Class to hold and manipulate an array of massaged messages.
double objval
Definition: Idiot.hpp:24
int maxIts2_
Definition: Idiot.hpp:277
Class for thread specific random numbers.
double stopMu_
Definition: Idiot.hpp:261
int maxBigIts_
Definition: Idiot.hpp:270
OsiSolverInterface * model_
Underlying model.
Definition: Idiot.hpp:255
double infeas
Definition: Idiot.hpp:23
int checkFrequency_
Definition: Idiot.hpp:275
This class implements a very silly algorithm.
Definition: Idiot.hpp:48
double getReasonablyFeasible() const
Reasonably feasible.
Definition: Idiot.hpp:122
void setMinorIterations0(int value)
Starting weight - small emphasizes feasibility, default 1.0e-4.
Definition: Idiot.hpp:160
double getExitInfeasibility() const
Exit infeasibility - exit if sum of infeasibilities less than this.
Definition: Idiot.hpp:130
double getWeightFactor() const
Weight factor - weight multiplied by this when changes, default 0.333.
Definition: Idiot.hpp:104
int getLightweight() const
How lightweight - 0 not, 1 yes, 2 very lightweight.
Definition: Idiot.hpp:180
int logFreq_
Definition: Idiot.hpp:274
void setModel(OsiSolverInterface *model)
Set model.
Definition: Idiot.hpp:208