Clp  1.17.8
ClpNonLinearCost.hpp
Go to the documentation of this file.
1 /* $Id$ */
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 #ifndef ClpNonLinearCost_H
7 #define ClpNonLinearCost_H
8 
9 #include "CoinPragma.hpp"
10 
11 class ClpSimplex;
12 class CoinIndexedVector;
13 
31 /* status has original status and current status
32  0 - below lower so stored is upper
33  1 - in range
34  2 - above upper so stored is lower
35  4 - (for current) - same as original
36 */
37 #define CLP_BELOW_LOWER 0
38 #define CLP_FEASIBLE 1
39 #define CLP_ABOVE_UPPER 2
40 #define CLP_SAME 4
41 inline int originalStatus(unsigned char status)
42 {
43  return (status & 15);
44 }
45 inline int currentStatus(unsigned char status)
46 {
47  return (status >> 4);
48 }
49 inline void setOriginalStatus(unsigned char &status, int value)
50 {
51  status = static_cast< unsigned char >(status & ~15);
52  status = static_cast< unsigned char >(status | value);
53 }
54 inline void setCurrentStatus(unsigned char &status, int value)
55 {
56  status = static_cast< unsigned char >(status & ~(15 << 4));
57  status = static_cast< unsigned char >(status | (value << 4));
58 }
59 inline void setInitialStatus(unsigned char &status)
60 {
61  status = static_cast< unsigned char >(CLP_FEASIBLE | (CLP_SAME << 4));
62 }
63 inline void setSameStatus(unsigned char &status)
64 {
65  status = static_cast< unsigned char >(status & ~(15 << 4));
66  status = static_cast< unsigned char >(status | (CLP_SAME << 4));
67 }
68 // Use second version to get more speed
69 //#define FAST_CLPNON
70 #ifndef FAST_CLPNON
71 #define CLP_METHOD1 ((method_ & 1) != 0)
72 #define CLP_METHOD2 ((method_ & 2) != 0)
73 #else
74 #define CLP_METHOD1 (false)
75 #define CLP_METHOD2 (true)
76 #endif
78 
79 public:
80 public:
89  ClpNonLinearCost(ClpSimplex *model, int method = 1);
95  ClpNonLinearCost(ClpSimplex *model, const int *starts,
96  const double *lower, const double *cost);
99  // Copy
101  // Assignment
104 
111  void checkInfeasibilities(double oldTolerance = 0.0);
115  void checkInfeasibilities(int numberInArray, const int *index);
122  void checkChanged(int numberInArray, CoinIndexedVector *update);
129  void goThru(int numberInArray, double multiplier,
130  const int *index, const double *work,
131  double *rhs);
134  void goBack(int numberInArray, const int *index,
135  double *rhs);
141  void goBackAll(const CoinIndexedVector *update);
143  void zapCosts();
145  void refreshCosts(const double *columnCosts);
147  void feasibleBounds();
149  void refresh();
151  void refresh(int iSequence);
155  double setOne(int sequence, double solutionValue);
158  void setOne(int sequence, double solutionValue, double lowerValue, double upperValue,
159  double costValue = 0.0);
163  int setOneOutgoing(int sequence, double &solutionValue);
165  double nearest(int sequence, double solutionValue);
169  inline double changeInCost(int sequence, double alpha) const
170  {
171  double returnValue = 0.0;
172  if (CLP_METHOD1) {
173  int iRange = whichRange_[sequence] + offset_[sequence];
174  if (alpha > 0.0)
175  returnValue = cost_[iRange] - cost_[iRange - 1];
176  else
177  returnValue = cost_[iRange] - cost_[iRange + 1];
178  }
179  if (CLP_METHOD2) {
180  returnValue = (alpha > 0.0) ? infeasibilityWeight_ : -infeasibilityWeight_;
181  }
182  return returnValue;
183  }
184  inline double changeUpInCost(int sequence) const
185  {
186  double returnValue = 0.0;
187  if (CLP_METHOD1) {
188  int iRange = whichRange_[sequence] + offset_[sequence];
189  if (iRange + 1 != start_[sequence + 1] && !infeasible(iRange + 1))
190  returnValue = cost_[iRange] - cost_[iRange + 1];
191  else
192  returnValue = -1.0e100;
193  }
194  if (CLP_METHOD2) {
195  returnValue = -infeasibilityWeight_;
196  }
197  return returnValue;
198  }
199  inline double changeDownInCost(int sequence) const
200  {
201  double returnValue = 0.0;
202  if (CLP_METHOD1) {
203  int iRange = whichRange_[sequence] + offset_[sequence];
204  if (iRange != start_[sequence] && !infeasible(iRange - 1))
205  returnValue = cost_[iRange] - cost_[iRange - 1];
206  else
207  returnValue = 1.0e100;
208  }
209  if (CLP_METHOD2) {
210  returnValue = infeasibilityWeight_;
211  }
212  return returnValue;
213  }
215  inline double changeInCost(int sequence, double alpha, double &rhs)
216  {
217  double returnValue = 0.0;
218 #ifdef NONLIN_DEBUG
219  double saveRhs = rhs;
220 #endif
221  if (CLP_METHOD1) {
222  int iRange = whichRange_[sequence] + offset_[sequence];
223  if (alpha > 0.0) {
224  assert(iRange - 1 >= start_[sequence]);
225  offset_[sequence]--;
226  rhs += lower_[iRange] - lower_[iRange - 1];
227  returnValue = alpha * (cost_[iRange] - cost_[iRange - 1]);
228  } else {
229  assert(iRange + 1 < start_[sequence + 1] - 1);
230  offset_[sequence]++;
231  rhs += lower_[iRange + 2] - lower_[iRange + 1];
232  returnValue = alpha * (cost_[iRange] - cost_[iRange + 1]);
233  }
234  }
235  if (CLP_METHOD2) {
236 #ifdef NONLIN_DEBUG
237  double saveRhs1 = rhs;
238  rhs = saveRhs;
239 #endif
240  unsigned char iStatus = status_[sequence];
241  int iWhere = currentStatus(iStatus);
242  if (iWhere == CLP_SAME)
243  iWhere = originalStatus(iStatus);
244  // rhs always increases
245  if (iWhere == CLP_FEASIBLE) {
246  if (alpha > 0.0) {
247  // going below
248  iWhere = CLP_BELOW_LOWER;
249  rhs = COIN_DBL_MAX;
250  } else {
251  // going above
252  iWhere = CLP_ABOVE_UPPER;
253  rhs = COIN_DBL_MAX;
254  }
255  } else if (iWhere == CLP_BELOW_LOWER) {
256  assert(alpha < 0);
257  // going feasible
258  iWhere = CLP_FEASIBLE;
259  rhs += bound_[sequence] - model_->upperRegion()[sequence];
260  } else {
261  assert(iWhere == CLP_ABOVE_UPPER);
262  // going feasible
263  iWhere = CLP_FEASIBLE;
264  rhs += model_->lowerRegion()[sequence] - bound_[sequence];
265  }
266  setCurrentStatus(status_[sequence], iWhere);
267 #ifdef NONLIN_DEBUG
268  assert(saveRhs1 == rhs);
269 #endif
270  returnValue = fabs(alpha) * infeasibilityWeight_;
271  }
272  return returnValue;
273  }
275  inline double lower(int sequence) const
276  {
277  return lower_[whichRange_[sequence] + offset_[sequence]];
278  }
280  inline double upper(int sequence) const
281  {
282  return lower_[whichRange_[sequence] + offset_[sequence] + 1];
283  }
285  inline double cost(int sequence) const
286  {
287  return cost_[whichRange_[sequence] + offset_[sequence]];
288  }
290  inline int fullStatus(int sequence) const
291  {
292  return status_[sequence];
293  }
295  inline bool changed(int sequence) const
296  {
297  return (status_[sequence] & 64) == 0;
298  }
299 
301 
304  inline int numberInfeasibilities() const
306  {
307  return numberInfeasibilities_;
308  }
310  inline double changeInCost() const
311  {
312  return changeCost_;
313  }
315  inline double feasibleCost() const
316  {
317  return feasibleCost_;
318  }
320  double feasibleReportCost() const;
322  inline double sumInfeasibilities() const
323  {
324  return sumInfeasibilities_;
325  }
327  inline double largestInfeasibility() const
328  {
329  return largestInfeasibility_;
330  }
332  inline double averageTheta() const
333  {
334  return averageTheta_;
335  }
336  inline void setAverageTheta(double value)
337  {
338  averageTheta_ = value;
339  }
340  inline void setChangeInCost(double value)
341  {
342  changeCost_ = value;
343  }
344  inline void setMethod(int value)
345  {
346  method_ = value;
347  }
349  inline bool lookBothWays() const
350  {
351  return bothWays_;
352  }
354  inline bool infeasible(int i) const
356  {
357  return ((infeasible_[i >> 5] >> (i & 31)) & 1) != 0;
358  }
359  inline void setInfeasible(int i, bool trueFalse)
360  {
361  unsigned int &value = infeasible_[i >> 5];
362  int bit = i & 31;
363  if (trueFalse)
364  value |= (1 << bit);
365  else
366  value &= ~(1 << bit);
367  }
368  inline unsigned char *statusArray() const
369  {
370  return status_;
371  }
373  void validate();
375 
376 private:
379  double changeCost_;
396  int *start_;
400  int *offset_;
404  double *lower_;
406  double *cost_;
409  // Array to say which regions are infeasible
410  unsigned int *infeasible_;
413  // new stuff
415  unsigned char *status_;
417  double *bound_;
419  double *cost2_;
421  int method_;
423  bool convex_;
425  bool bothWays_;
427 };
428 
429 #endif
430 
431 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
432 */
ClpSimplex
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
ClpNonLinearCost::averageTheta_
double averageTheta_
Average theta - kept here as only for primal.
Definition: ClpNonLinearCost.hpp:390
ClpNonLinearCost::bothWays_
bool bothWays_
If we should look both ways for djs.
Definition: ClpNonLinearCost.hpp:425
ClpNonLinearCost::setChangeInCost
void setChangeInCost(double value)
Definition: ClpNonLinearCost.hpp:340
ClpNonLinearCost::setOneOutgoing
int setOneOutgoing(int sequence, double &solutionValue)
Sets bounds and cost for outgoing variable may change value Returns direction.
ClpNonLinearCost::numberRows_
int numberRows_
Number of rows (mainly for checking and copy)
Definition: ClpNonLinearCost.hpp:392
ClpNonLinearCost::largestInfeasibility_
double largestInfeasibility_
Largest infeasibility.
Definition: ClpNonLinearCost.hpp:386
ClpNonLinearCost::offset_
int * offset_
Temporary range offset for each entry (columns then rows)
Definition: ClpNonLinearCost.hpp:400
ClpNonLinearCost::changeInCost
double changeInCost(int sequence, double alpha) const
Returns change in cost - one down if alpha >0.0, up if <0.0 Value is current - new.
Definition: ClpNonLinearCost.hpp:169
ClpNonLinearCost::validate
void validate()
For debug.
ClpNonLinearCost::infeasible_
unsigned int * infeasible_
Definition: ClpNonLinearCost.hpp:410
ClpNonLinearCost::zapCosts
void zapCosts()
Temporary zeroing of feasible costs.
ClpNonLinearCost::changeUpInCost
double changeUpInCost(int sequence) const
Definition: ClpNonLinearCost.hpp:184
ClpNonLinearCost::lower
double lower(int sequence) const
Returns current lower bound.
Definition: ClpNonLinearCost.hpp:275
ClpNonLinearCost::feasibleBounds
void feasibleBounds()
Puts feasible bounds into lower and upper.
ClpNonLinearCost::statusArray
unsigned char * statusArray() const
Definition: ClpNonLinearCost.hpp:368
ClpNonLinearCost::feasibleReportCost
double feasibleReportCost() const
Feasible cost with offset and direction (i.e. for reporting)
ClpNonLinearCost::averageTheta
double averageTheta() const
Average theta.
Definition: ClpNonLinearCost.hpp:332
ClpNonLinearCost::setOne
double setOne(int sequence, double solutionValue)
Sets bounds and cost for one variable Returns change in cost May need to be inline for speed.
ClpNonLinearCost::~ClpNonLinearCost
~ClpNonLinearCost()
Destructor.
originalStatus
int originalStatus(unsigned char status)
Definition: ClpNonLinearCost.hpp:41
ClpNonLinearCost::numberInfeasibilities
int numberInfeasibilities() const
Number of infeasibilities.
Definition: ClpNonLinearCost.hpp:305
ClpNonLinearCost::checkInfeasibilities
void checkInfeasibilities(double oldTolerance=0.0)
Changes infeasible costs and computes number and cost of infeas Puts all non-basic (non free) variabl...
ClpNonLinearCost::fullStatus
int fullStatus(int sequence) const
Returns full status.
Definition: ClpNonLinearCost.hpp:290
ClpNonLinearCost::whichRange_
int * whichRange_
Range for each entry (columns then rows)
Definition: ClpNonLinearCost.hpp:398
ClpNonLinearCost::numberColumns_
int numberColumns_
Number of columns (mainly for checking and copy)
Definition: ClpNonLinearCost.hpp:394
ClpNonLinearCost::setAverageTheta
void setAverageTheta(double value)
Definition: ClpNonLinearCost.hpp:336
CLP_METHOD1
#define CLP_METHOD1
Definition: ClpNonLinearCost.hpp:71
ClpNonLinearCost::refresh
void refresh()
Refresh - assuming regions OK.
ClpNonLinearCost::upper
double upper(int sequence) const
Returns current upper bound.
Definition: ClpNonLinearCost.hpp:280
ClpNonLinearCost::numberInfeasibilities_
int numberInfeasibilities_
Number of infeasibilities found.
Definition: ClpNonLinearCost.hpp:412
ClpNonLinearCost::cost
double cost(int sequence) const
Returns current cost.
Definition: ClpNonLinearCost.hpp:285
ClpNonLinearCost::setMethod
void setMethod(int value)
Definition: ClpNonLinearCost.hpp:344
CLP_BELOW_LOWER
#define CLP_BELOW_LOWER
Trivial class to deal with non linear costs.
Definition: ClpNonLinearCost.hpp:37
ClpNonLinearCost::feasibleCost
double feasibleCost() const
Feasible cost.
Definition: ClpNonLinearCost.hpp:315
ClpSimplex::upperRegion
double * upperRegion(int section) const
Definition: ClpSimplex.hpp:1159
CLP_FEASIBLE
#define CLP_FEASIBLE
Definition: ClpNonLinearCost.hpp:38
ClpNonLinearCost::operator=
ClpNonLinearCost & operator=(const ClpNonLinearCost &)
ClpNonLinearCost::feasibleCost_
double feasibleCost_
Feasible cost.
Definition: ClpNonLinearCost.hpp:382
ClpNonLinearCost::cost_
double * cost_
Cost for each range.
Definition: ClpNonLinearCost.hpp:406
ClpNonLinearCost::refreshCosts
void refreshCosts(const double *columnCosts)
Refreshes costs always makes row costs zero.
currentStatus
int currentStatus(unsigned char status)
Definition: ClpNonLinearCost.hpp:45
ClpNonLinearCost::nearest
double nearest(int sequence, double solutionValue)
Returns nearest bound.
ClpNonLinearCost::goBackAll
void goBackAll(const CoinIndexedVector *update)
Puts back correct infeasible costs for each variable The input indices are row indices and need conve...
setOriginalStatus
void setOriginalStatus(unsigned char &status, int value)
Definition: ClpNonLinearCost.hpp:49
ClpNonLinearCost::largestInfeasibility
double largestInfeasibility() const
Largest infeasibility.
Definition: ClpNonLinearCost.hpp:327
ClpNonLinearCost::changeDownInCost
double changeDownInCost(int sequence) const
Definition: ClpNonLinearCost.hpp:199
ClpNonLinearCost::lower_
double * lower_
Lower bound for each range (upper bound is next lower).
Definition: ClpNonLinearCost.hpp:404
ClpNonLinearCost::ClpNonLinearCost
ClpNonLinearCost()
Default constructor.
CLP_METHOD2
#define CLP_METHOD2
Definition: ClpNonLinearCost.hpp:72
ClpNonLinearCost::lookBothWays
bool lookBothWays() const
See if may want to look both ways.
Definition: ClpNonLinearCost.hpp:349
ClpNonLinearCost::start_
int * start_
Starts for each entry (columns then rows)
Definition: ClpNonLinearCost.hpp:396
ClpNonLinearCost::changeInCost
double changeInCost() const
Change in cost.
Definition: ClpNonLinearCost.hpp:310
setInitialStatus
void setInitialStatus(unsigned char &status)
Definition: ClpNonLinearCost.hpp:59
ClpNonLinearCost::convex_
bool convex_
If all non-linear costs convex.
Definition: ClpNonLinearCost.hpp:423
CLP_ABOVE_UPPER
#define CLP_ABOVE_UPPER
Definition: ClpNonLinearCost.hpp:39
ClpNonLinearCost::sumInfeasibilities
double sumInfeasibilities() const
Sum of infeasibilities.
Definition: ClpNonLinearCost.hpp:322
ClpNonLinearCost::goBack
void goBack(int numberInArray, const int *index, double *rhs)
Takes off last iteration (i.e.
ClpNonLinearCost::bound_
double * bound_
Bound which has been replaced in lower_ or upper_.
Definition: ClpNonLinearCost.hpp:417
ClpNonLinearCost::model_
ClpSimplex * model_
Model.
Definition: ClpNonLinearCost.hpp:408
ClpNonLinearCost::method_
int method_
Method 1 old, 2 new, 3 both!
Definition: ClpNonLinearCost.hpp:421
ClpNonLinearCost::checkChanged
void checkChanged(int numberInArray, CoinIndexedVector *update)
Puts back correct infeasible costs for each variable The input indices are row indices and need conve...
ClpNonLinearCost::infeasibilityWeight_
double infeasibilityWeight_
Current infeasibility weight.
Definition: ClpNonLinearCost.hpp:384
ClpNonLinearCost::changed
bool changed(int sequence) const
Returns if changed from beginning of iteration.
Definition: ClpNonLinearCost.hpp:295
ClpNonLinearCost::changeCost_
double changeCost_
Change in cost because of infeasibilities.
Definition: ClpNonLinearCost.hpp:380
ClpNonLinearCost::goThru
void goThru(int numberInArray, double multiplier, const int *index, const double *work, double *rhs)
Goes through one bound for each variable.
ClpSimplex::lowerRegion
double * lowerRegion(int section) const
Definition: ClpSimplex.hpp:1152
CLP_SAME
#define CLP_SAME
Definition: ClpNonLinearCost.hpp:40
ClpNonLinearCost::cost2_
double * cost2_
Feasible cost array.
Definition: ClpNonLinearCost.hpp:419
ClpNonLinearCost::sumInfeasibilities_
double sumInfeasibilities_
Sum of infeasibilities.
Definition: ClpNonLinearCost.hpp:388
setCurrentStatus
void setCurrentStatus(unsigned char &status, int value)
Definition: ClpNonLinearCost.hpp:54
ClpNonLinearCost::status_
unsigned char * status_
Contains status at beginning and current.
Definition: ClpNonLinearCost.hpp:415
ClpNonLinearCost::changeInCost
double changeInCost(int sequence, double alpha, double &rhs)
This also updates next bound.
Definition: ClpNonLinearCost.hpp:215
ClpNonLinearCost::setInfeasible
void setInfeasible(int i, bool trueFalse)
Definition: ClpNonLinearCost.hpp:359
ClpNonLinearCost::infeasible
bool infeasible(int i) const
Definition: ClpNonLinearCost.hpp:355
setSameStatus
void setSameStatus(unsigned char &status)
Definition: ClpNonLinearCost.hpp:63
ClpNonLinearCost
Definition: ClpNonLinearCost.hpp:77