diff options
Diffstat (limited to 'newstructure/thirdparty/linux/include/coin/ClpNonLinearCost.hpp')
-rw-r--r-- | newstructure/thirdparty/linux/include/coin/ClpNonLinearCost.hpp | 401 |
1 files changed, 0 insertions, 401 deletions
diff --git a/newstructure/thirdparty/linux/include/coin/ClpNonLinearCost.hpp b/newstructure/thirdparty/linux/include/coin/ClpNonLinearCost.hpp deleted file mode 100644 index 1007865..0000000 --- a/newstructure/thirdparty/linux/include/coin/ClpNonLinearCost.hpp +++ /dev/null @@ -1,401 +0,0 @@ -/* $Id: ClpNonLinearCost.hpp 1769 2011-07-26 09:31:51Z forrest $ */ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#ifndef ClpNonLinearCost_H -#define ClpNonLinearCost_H - - -#include "CoinPragma.hpp" - -class ClpSimplex; -class CoinIndexedVector; - -/** Trivial class to deal with non linear costs - - I don't make any explicit assumptions about convexity but I am - sure I do make implicit ones. - - One interesting idea for normal LP's will be to allow non-basic - variables to come into basis as infeasible i.e. if variable at - lower bound has very large positive reduced cost (when problem - is infeasible) could it reduce overall problem infeasibility more - by bringing it into basis below its lower bound. - - Another feature would be to automatically discover when problems - are convex piecewise linear and re-formulate to use non-linear. - I did some work on this many years ago on "grade" problems, but - while it improved primal interior point algorithms were much better - for that particular problem. -*/ -/* status has original status and current status - 0 - below lower so stored is upper - 1 - in range - 2 - above upper so stored is lower - 4 - (for current) - same as original -*/ -#define CLP_BELOW_LOWER 0 -#define CLP_FEASIBLE 1 -#define CLP_ABOVE_UPPER 2 -#define CLP_SAME 4 -inline int originalStatus(unsigned char status) -{ - return (status & 15); -} -inline int currentStatus(unsigned char status) -{ - return (status >> 4); -} -inline void setOriginalStatus(unsigned char & status, int value) -{ - status = static_cast<unsigned char>(status & ~15); - status = static_cast<unsigned char>(status | value); -} -inline void setCurrentStatus(unsigned char &status, int value) -{ - status = static_cast<unsigned char>(status & ~(15 << 4)); - status = static_cast<unsigned char>(status | (value << 4)); -} -inline void setInitialStatus(unsigned char &status) -{ - status = static_cast<unsigned char>(CLP_FEASIBLE | (CLP_SAME << 4)); -} -inline void setSameStatus(unsigned char &status) -{ - status = static_cast<unsigned char>(status & ~(15 << 4)); - status = static_cast<unsigned char>(status | (CLP_SAME << 4)); -} -// Use second version to get more speed -//#define FAST_CLPNON -#ifndef FAST_CLPNON -#define CLP_METHOD1 ((method_&1)!=0) -#define CLP_METHOD2 ((method_&2)!=0) -#else -#define CLP_METHOD1 (false) -#define CLP_METHOD2 (true) -#endif -class ClpNonLinearCost { - -public: - -public: - - /**@name Constructors, destructor */ - //@{ - /// Default constructor. - ClpNonLinearCost(); - /** Constructor from simplex. - This will just set up wasteful arrays for linear, but - later may do dual analysis and even finding duplicate columns . - */ - ClpNonLinearCost(ClpSimplex * model, int method = 1); - /** Constructor from simplex and list of non-linearities (columns only) - First lower of each column has to match real lower - Last lower has to be <= upper (if == then cost ignored) - This could obviously be changed to make more user friendly - */ - ClpNonLinearCost(ClpSimplex * model, const int * starts, - const double * lower, const double * cost); - /// Destructor - ~ClpNonLinearCost(); - // Copy - ClpNonLinearCost(const ClpNonLinearCost&); - // Assignment - ClpNonLinearCost& operator=(const ClpNonLinearCost&); - //@} - - - /**@name Actual work in primal */ - //@{ - /** Changes infeasible costs and computes number and cost of infeas - Puts all non-basic (non free) variables to bounds - and all free variables to zero if oldTolerance is non-zero - - but does not move those <= oldTolerance away*/ - void checkInfeasibilities(double oldTolerance = 0.0); - /** Changes infeasible costs for each variable - The indices are row indices and need converting to sequences - */ - void checkInfeasibilities(int numberInArray, const int * index); - /** Puts back correct infeasible costs for each variable - The input indices are row indices and need converting to sequences - for costs. - On input array is empty (but indices exist). On exit just - changed costs will be stored as normal CoinIndexedVector - */ - void checkChanged(int numberInArray, CoinIndexedVector * update); - /** Goes through one bound for each variable. - If multiplier*work[iRow]>0 goes down, otherwise up. - The indices are row indices and need converting to sequences - Temporary offsets may be set - Rhs entries are increased - */ - void goThru(int numberInArray, double multiplier, - const int * index, const double * work, - double * rhs); - /** Takes off last iteration (i.e. offsets closer to 0) - */ - void goBack(int numberInArray, const int * index, - double * rhs); - /** Puts back correct infeasible costs for each variable - The input indices are row indices and need converting to sequences - for costs. - At the end of this all temporary offsets are zero - */ - void goBackAll(const CoinIndexedVector * update); - /// Temporary zeroing of feasible costs - void zapCosts(); - /// Refreshes costs always makes row costs zero - void refreshCosts(const double * columnCosts); - /// Puts feasible bounds into lower and upper - void feasibleBounds(); - /// Refresh - assuming regions OK - void refresh(); - /** Sets bounds and cost for one variable - Returns change in cost - May need to be inline for speed */ - double setOne(int sequence, double solutionValue); - /** Sets bounds and infeasible cost and true cost for one variable - This is for gub and column generation etc */ - void setOne(int sequence, double solutionValue, double lowerValue, double upperValue, - double costValue = 0.0); - /** Sets bounds and cost for outgoing variable - may change value - Returns direction */ - int setOneOutgoing(int sequence, double &solutionValue); - /// Returns nearest bound - double nearest(int sequence, double solutionValue); - /** Returns change in cost - one down if alpha >0.0, up if <0.0 - Value is current - new - */ - inline double changeInCost(int sequence, double alpha) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (alpha > 0.0) - returnValue = cost_[iRange] - cost_[iRange-1]; - else - returnValue = cost_[iRange] - cost_[iRange+1]; - } - if (CLP_METHOD2) { - returnValue = (alpha > 0.0) ? infeasibilityWeight_ : -infeasibilityWeight_; - } - return returnValue; - } - inline double changeUpInCost(int sequence) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (iRange + 1 != start_[sequence+1] && !infeasible(iRange + 1)) - returnValue = cost_[iRange] - cost_[iRange+1]; - else - returnValue = -1.0e100; - } - if (CLP_METHOD2) { - returnValue = -infeasibilityWeight_; - } - return returnValue; - } - inline double changeDownInCost(int sequence) const { - double returnValue = 0.0; - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (iRange != start_[sequence] && !infeasible(iRange - 1)) - returnValue = cost_[iRange] - cost_[iRange-1]; - else - returnValue = 1.0e100; - } - if (CLP_METHOD2) { - returnValue = infeasibilityWeight_; - } - return returnValue; - } - /// This also updates next bound - inline double changeInCost(int sequence, double alpha, double &rhs) { - double returnValue = 0.0; -#ifdef NONLIN_DEBUG - double saveRhs = rhs; -#endif - if (CLP_METHOD1) { - int iRange = whichRange_[sequence] + offset_[sequence]; - if (alpha > 0.0) { - assert(iRange - 1 >= start_[sequence]); - offset_[sequence]--; - rhs += lower_[iRange] - lower_[iRange-1]; - returnValue = alpha * (cost_[iRange] - cost_[iRange-1]); - } else { - assert(iRange + 1 < start_[sequence+1] - 1); - offset_[sequence]++; - rhs += lower_[iRange+2] - lower_[iRange+1]; - returnValue = alpha * (cost_[iRange] - cost_[iRange+1]); - } - } - if (CLP_METHOD2) { -#ifdef NONLIN_DEBUG - double saveRhs1 = rhs; - rhs = saveRhs; -#endif - unsigned char iStatus = status_[sequence]; - int iWhere = currentStatus(iStatus); - if (iWhere == CLP_SAME) - iWhere = originalStatus(iStatus); - // rhs always increases - if (iWhere == CLP_FEASIBLE) { - if (alpha > 0.0) { - // going below - iWhere = CLP_BELOW_LOWER; - rhs = COIN_DBL_MAX; - } else { - // going above - iWhere = CLP_ABOVE_UPPER; - rhs = COIN_DBL_MAX; - } - } else if (iWhere == CLP_BELOW_LOWER) { - assert (alpha < 0); - // going feasible - iWhere = CLP_FEASIBLE; - rhs += bound_[sequence] - model_->upperRegion()[sequence]; - } else { - assert (iWhere == CLP_ABOVE_UPPER); - // going feasible - iWhere = CLP_FEASIBLE; - rhs += model_->lowerRegion()[sequence] - bound_[sequence]; - } - setCurrentStatus(status_[sequence], iWhere); -#ifdef NONLIN_DEBUG - assert(saveRhs1 == rhs); -#endif - returnValue = fabs(alpha) * infeasibilityWeight_; - } - return returnValue; - } - /// Returns current lower bound - inline double lower(int sequence) const { - return lower_[whichRange_[sequence] + offset_[sequence]]; - } - /// Returns current upper bound - inline double upper(int sequence) const { - return lower_[whichRange_[sequence] + offset_[sequence] + 1]; - } - /// Returns current cost - inline double cost(int sequence) const { - return cost_[whichRange_[sequence] + offset_[sequence]]; - } - //@} - - - /**@name Gets and sets */ - //@{ - /// Number of infeasibilities - inline int numberInfeasibilities() const { - return numberInfeasibilities_; - } - /// Change in cost - inline double changeInCost() const { - return changeCost_; - } - /// Feasible cost - inline double feasibleCost() const { - return feasibleCost_; - } - /// Feasible cost with offset and direction (i.e. for reporting) - double feasibleReportCost() const; - /// Sum of infeasibilities - inline double sumInfeasibilities() const { - return sumInfeasibilities_; - } - /// Largest infeasibility - inline double largestInfeasibility() const { - return largestInfeasibility_; - } - /// Average theta - inline double averageTheta() const { - return averageTheta_; - } - inline void setAverageTheta(double value) { - averageTheta_ = value; - } - inline void setChangeInCost(double value) { - changeCost_ = value; - } - inline void setMethod(int value) { - method_ = value; - } - /// See if may want to look both ways - inline bool lookBothWays() const { - return bothWays_; - } - //@} - ///@name Private functions to deal with infeasible regions - inline bool infeasible(int i) const { - return ((infeasible_[i>>5] >> (i & 31)) & 1) != 0; - } - inline void setInfeasible(int i, bool trueFalse) { - unsigned int & value = infeasible_[i>>5]; - int bit = i & 31; - if (trueFalse) - value |= (1 << bit); - else - value &= ~(1 << bit); - } - inline unsigned char * statusArray() const { - return status_; - } - /// For debug - void validate(); - //@} - -private: - /**@name Data members */ - //@{ - /// Change in cost because of infeasibilities - double changeCost_; - /// Feasible cost - double feasibleCost_; - /// Current infeasibility weight - double infeasibilityWeight_; - /// Largest infeasibility - double largestInfeasibility_; - /// Sum of infeasibilities - double sumInfeasibilities_; - /// Average theta - kept here as only for primal - double averageTheta_; - /// Number of rows (mainly for checking and copy) - int numberRows_; - /// Number of columns (mainly for checking and copy) - int numberColumns_; - /// Starts for each entry (columns then rows) - int * start_; - /// Range for each entry (columns then rows) - int * whichRange_; - /// Temporary range offset for each entry (columns then rows) - int * offset_; - /** Lower bound for each range (upper bound is next lower). - For various reasons there is always an infeasible range - at bottom - even if lower bound is - infinity */ - double * lower_; - /// Cost for each range - double * cost_; - /// Model - ClpSimplex * model_; - // Array to say which regions are infeasible - unsigned int * infeasible_; - /// Number of infeasibilities found - int numberInfeasibilities_; - // new stuff - /// Contains status at beginning and current - unsigned char * status_; - /// Bound which has been replaced in lower_ or upper_ - double * bound_; - /// Feasible cost array - double * cost2_; - /// Method 1 old, 2 new, 3 both! - int method_; - /// If all non-linear costs convex - bool convex_; - /// If we should look both ways for djs - bool bothWays_; - //@} -}; - -#endif |