38 s << sc.
getName() <<
" scaler:" << std::endl;
40 for(
int ci = 0; ci < colscaleExp.
size(); ++ci )
41 s << colscaleExp[ci] <<
" ";
42 s <<
"]" << std::endl;
45 for(
int ri = 0; ri < rowccaleExp.
size(); ++ri )
46 s << rowccaleExp[ri] <<
" ";
47 s <<
"]" << std::endl;
59 , m_activeColscaleExp(0)
60 , m_activeRowscaleExp(0)
61 , m_colFirst(colFirst)
129 m_activeColscaleExp->reSize(lp.
nCols());
132 for(
int i = 0; i < lp.
nCols(); ++i)
133 (*m_activeColscaleExp)[i] = 0;
134 for(
int i = 0; i < lp.
nRows(); ++i)
145 for(
int i = 0; i < vec.
size(); ++i )
164 #ifndef SOPLEX_LEGACY 179 for(
int i = 0; i < lp.
nRows(); ++i )
183 int exp2 = rowscaleExp[i];
185 for(
int j = 0; j < vec.
size(); ++j)
187 exp1 = colscaleExp[vec.
index(j)];
199 MSG_DEBUG( std::cout <<
"DEBUG: rowscaleExp(" << i <<
"): " << exp2 << std::endl; )
202 for(
int i = 0; i < lp.
nCols(); ++i )
206 int exp2 = colscaleExp[i];
208 for(
int j = 0; j < vec.
size(); ++j)
210 exp1 = rowscaleExp[vec.
index(j)];
222 MSG_DEBUG( std::cout <<
"DEBUG: colscaleExp(" << i <<
"): " << exp2 << std::endl; )
237 for(
int i = 0; i < lp.
nRows(); ++i )
242 int exp2 = rowscaleExp[i];
244 for(
int j = 0; j < vec.
size(); ++j)
246 exp1 = colscaleExp[vec.
index(j)];
259 for(
int i = 0; i < lp.
nCols(); ++i )
264 int exp2 = colscaleExp[i];
266 for(
int j = 0; j < vec.
size(); ++j)
268 exp1 = rowscaleExp[vec.
index(j)];
304 assert(i < lp.
nCols());
309 vec = lp.LPColSet::colVector(i);
312 int exp2 = colscaleExp[i];
318 for(
int j = 0; j < col.
size(); j++ )
320 exp1 = rowscaleExp[col.
index(j)];
328 assert(i < lp.
nCols());
333 const SVector& colVec = lp.LPColSet::colVector(i);
337 int exp2 = colscaleExp[i];
339 for(
int j = 0; j < colVec.
size(); j++ )
341 exp1 = rowscaleExp[colVec.
index(j)];
353 assert(i < lp.
nCols());
358 const SVector& colVec = lp.LPColSet::colVector(i);
362 int exp2 = colscaleExp[i];
364 for(
int j = 0; j < colVec.
size(); j++ )
366 exp1 = rowscaleExp[colVec.
index(j)];
380 assert(i < lp.
nCols());
383 if( lp.LPColSet::upper(i) <
infinity )
386 return spxLdexp(lp.LPColSet::upper(i) , colscaleExp[i]);
389 return lp.LPColSet::upper(i);
397 assert(lp.LPColSet::upper().dim() == vec.
dim());
401 for(
int i = 0; i < lp.LPColSet::upper().dim(); i++)
402 vec[i] =
spxLdexp(lp.LPColSet::upper()[i], colscaleExp[i]);
410 assert(i < lp.
nCols());
413 if( lp.LPColSet::lower(i) > -
infinity )
416 return spxLdexp(lp.LPColSet::lower(i), colscaleExp[i]);
419 return lp.LPColSet::lower(i);
427 assert(lp.LPColSet::lower().dim() == vec.
dim());
431 for(
int i = 0; i < lp.LPColSet::lower().dim(); i++)
432 vec[i] =
spxLdexp(lp.LPColSet::lower()[i], colscaleExp[i]);
439 assert(i < lp.
nCols());
444 return spxLdexp(lp.LPColSet::maxObj(i) , -colscaleExp[i]);
452 assert(lp.LPColSet::maxObj().dim() == vec.
dim());
456 for(
int i = 0; i < lp.LPColSet::maxObj().dim(); i++)
457 vec[i] =
spxLdexp(lp.LPColSet::maxObj()[i], -colscaleExp[i]);
464 assert(i < lp.
nRows());
470 int exp2 = rowscaleExp[i];
476 for(
int j = 0; j < row.
size(); j++ )
478 exp1 = colscaleExp[row.
index(j)];
486 assert(i < lp.
nRows());
490 const SVector& rowVec = lp.LPRowSet::rowVector(i);
495 int exp2 = rowscaleExp[i];
497 for(
int j = 0; j < rowVec.
size(); j++ )
499 exp1 = colscaleExp[rowVec.
index(j)];
512 assert(i < lp.
nRows());
516 const SVector& rowVec = lp.LPRowSet::rowVector(i);
521 int exp2 = rowscaleExp[i];
523 for(
int j = 0; j < rowVec.
size(); j++ )
525 exp1 = colscaleExp[rowVec.
index(j)];
539 assert(i < lp.
nRows());
542 if( lp.LPRowSet::rhs(i) <
infinity )
545 return spxLdexp(lp.LPRowSet::rhs(i) , -rowscaleExp[i]);
548 return lp.LPRowSet::rhs(i);
556 assert(lp.LPRowSet::rhs().dim() == vec.
dim());
558 for(
int i = 0; i < lp.LPRowSet::rhs().dim(); i++)
561 vec[i] =
spxLdexp(lp.LPRowSet::rhs()[i], -rowscaleExp[i]);
570 assert(i < lp.
nRows());
573 if( lp.LPRowSet::lhs(i) > -
infinity )
576 return spxLdexp(lp.LPRowSet::lhs(i) , -rowscaleExp[i]);
579 return lp.LPRowSet::lhs(i);
586 assert(lp.LPRowSet::lhs().dim() == vec.
dim());
590 for(
int i = 0; i < lp.LPRowSet::lhs().dim(); i++)
591 vec[i] =
spxLdexp(lp.LPRowSet::lhs()[i], -rowscaleExp[i]);
598 assert(row < lp.
nRows());
599 assert(col < lp.
nCols());
615 assert(x.
dim() == colscaleExp.size());
617 for(
int j = 0; j < x.
dim(); ++j )
618 x[j] =
spxLdexp(x[j], colscaleExp[j]);
627 assert(s.
dim() == rowscaleExp.size());
629 for(
int i = 0; i < s.
dim(); ++i )
630 s[i] =
spxLdexp(s[i], -rowscaleExp[i]);
639 assert(pi.
dim() == rowscaleExp.size());
641 for(
int i = 0; i < pi.
dim(); ++i )
642 pi[i] =
spxLdexp(pi[i], rowscaleExp[i]);
651 assert(r.
dim() == colscaleExp.size());
653 for(
int j = 0; j < r.
dim(); ++j )
654 r[j] =
spxLdexp(r[j], -colscaleExp[j]);
663 assert(ray.
dim() == colscaleExp.size());
665 for(
int j = 0; j < ray.
dim(); ++j )
666 ray[j] =
spxLdexp(ray[j], colscaleExp[j]);
675 assert(ray.
dim() == rowscaleExp.size());
677 for(
int i = 0; i < ray.
dim(); ++i )
678 ray[i] =
spxLdexp(ray[i], rowscaleExp[i]);
687 for(
int i = 0; i < origObj.
dim(); ++i )
689 origObj[i] =
spxLdexp(origObj[i], colscaleExp[i]);
696 assert(i < lp.
nCols());
700 int exp = colscaleExp[i];
708 assert(col < lp.
nCols());
710 assert(row < lp.
nRows());
716 return spxLdexp(val, colscaleExp[col] + rowscaleExp[row]);
722 assert(col < lp.
nCols());
727 return spxLdexp(lower, -colscaleExp[col]);
733 assert(col < lp.
nCols());
738 return spxLdexp(upper, -colscaleExp[col]);
744 assert(row < lp.
nRows());
749 return spxLdexp(lhs, rowscaleExp[row]);
755 assert(row < lp.
nRows());
760 return spxLdexp(rhs, rowscaleExp[row]);
769 for(
int i = 0; i < colscaleExp.
size(); ++i )
782 for(
int i = 0; i < colscaleExp.
size(); ++i )
796 for(
int i = 0; i < rowscaleExp.
size(); ++i )
797 if( rowscaleExp[i] < mini )
798 mini = rowscaleExp[i];
809 for(
int i = 0; i < rowscaleExp.
size(); ++i )
810 if( rowscaleExp[i] > maxi )
811 maxi = rowscaleExp[i];
825 for(
int i = 0; i < lp.
nCols(); ++i )
831 for(
int j = 0; j < vec.
size(); ++j)
842 Real p = maxi / mini;
859 for(
int i = 0; i < lp.
nRows(); ++i )
865 for(
int j = 0; j < vec.
size(); ++j)
876 Real p = maxi / mini;
886 #ifdef ENABLE_CONSISTENCY_CHECKS const VectorBase< R > & rhs() const
Returns right hand side vector.
Rational spxAbs(const Rational &r)
Absolute.
virtual void unscaleDualray(const SPxLPBase< Real > &lp, Vector &ray) const
unscale dual ray given in ray.
virtual void setup(SPxLPBase< Real > &lp)
clear and setup scaling arrays in the LP
virtual void setBoth(bool both)
set wether column and row scaling should be performed
virtual void setOrder(bool colFirst)
set scaling order
bool isConsistent() const
consistency check
virtual void unscalePrimal(const SPxLPBase< Real > &lp, Vector &x) const
unscale dense primal solution vector given in x.
const VectorBase< R > & upper() const
Returns upper bound vector.
THREADLOCAL const Real infinity
bool _isScaled
true, if scaling has been performed
virtual Real lhsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns unscaled left hand side i of lp
virtual void getRowUnscaled(const SPxLPBase< Real > &lp, int i, DSVector &vec) const
returns unscaled row i
virtual Real scaleElement(const SPxLPBase< Real > &lp, int row, int col, Real val) const
returns scaled LP element in row and col.
R & maxObj_w(int i)
Returns objective value of column i for maximization problem.
int size() const
Number of used indices.
bool isScaled() const
Returns true if and only if the LP is scaled.
bool LT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a < b + eps
virtual void getLhsUnscaled(const SPxLPBase< Real > &lp, Vector &vec) const
returns unscaled left hand side vector of lp
virtual void unscaleRedCost(const SPxLPBase< Real > &lp, Vector &r) const
unscale dense reduced cost vector given in r.
virtual Real maxRowRatio(const SPxLPBase< Real > &lp) const
maximum ratio between absolute biggest and smallest element in any row.
virtual void unscaleDual(const SPxLPBase< Real > &lp, Vector &pi) const
unscale dense dual solution vector given in pi.
virtual Real scaleUpper(const SPxLPBase< Real > &lp, int col, Real upper) const
returns scaled upper bound of column col.
R & value(int n)
Reference to value of n 'th nonzero.
virtual ~SPxScaler()
destructor.
virtual bool isConsistent() const
consistency check
R & rhs_w(int i)
Returns right hand side of row i.
virtual Real getRowMaxAbsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns maximum absolute value of unscaled row i
virtual void getUpperUnscaled(const SPxLPBase< Real > &lp, Vector &vec) const
returns unscaled upper bound vector of lp
virtual Real scaleLhs(const SPxLPBase< Real > &lp, int row, Real lhs) const
returns scaled left hand side of row row.
SVectorBase< R > & rowVector_w(int i)
Real spxFrexp(Real y, int *exp)
int nRows() const
Returns number of rows in LP.
void add(const SVectorBase< S > &vec)
Append nonzeros of sv.
DataArray< int > * m_activeColscaleExp
pointer to currently active column scaling factors
virtual void applyScaling(SPxLPBase< Real > &lp)
applies m_colscale and m_rowscale to the lp.
Real spxLdexp(Real x, int exp)
returns x * 2^exp
virtual int computeScaleExp(const SVector &vec, const DataArray< int > &oldScaleExp) const
compute a single scaling vector , e.g. of a newly added row
virtual void unscale(SPxLPBase< Real > &lp)
unscale SPxLP
SPxOut * spxout
message handler
bool GT(Real a, Real b, Real eps=Param::epsilon())
returns true iff a > b + eps
int & index(int n)
Reference to index of n 'th nonzero.
std::ostream & operator<<(std::ostream &s, const VectorBase< R > &vec)
Output operator.
virtual Real upperUnscaled(const SPxLPBase< Real > &lp, int i) const
returns unscaled upper bound i
Wrapper for several output streams. A verbosity level is used to decide which stream to use and wheth...
virtual void getLowerUnscaled(const SPxLPBase< Real > &lp, Vector &vec) const
gets unscaled lower bound vector
const VectorBase< R > & lhs() const
Returns left hand side vector.
R & lower_w(int i)
Returns lower bound of column i.
virtual Real maxAbsColscale() const
absolute biggest column scaling factor
virtual int getColScaleExp(int i) const
returns scaling factor for column i
virtual void scaleObj(const SPxLPBase< Real > &lp, VectorReal &origObj) const
apply scaling to objective function vector origObj.
LPColSetBase(int pmax=-1, int pmemmax=-1)
Default constructor.
virtual void getRhsUnscaled(const SPxLPBase< Real > &lp, Vector &vec) const
gets unscaled right hand side vector
virtual Real minAbsColscale() const
absolute smallest column scaling factor
virtual void setRealParam(Real param, const char *name="realparam")
set real parameter
const VectorBase< R > & maxRowObj() const
virtual Real maxObjUnscaled(const SPxLPBase< Real > &lp, int i) const
returns unscaled objective function coefficient of i
DataArray< int > * m_activeRowscaleExp
pointer to currently active row scaling factors
void setScalingInfo(bool scaled)
set whether the LP is scaled or not
R & maxRowObj_w(int i)
Returns objective function value of row i.
virtual const char * getName() const
get name of scaler
virtual Real minAbsRowscale() const
absolute smallest row scaling factor
virtual Real scaleLower(const SPxLPBase< Real > &lp, int col, Real lower) const
returns scaled lower bound of column col.
int dim() const
Dimension of vector.
Everything should be within this namespace.
virtual Real lowerUnscaled(const SPxLPBase< Real > &lp, int i) const
returns unscaled lower bound i
virtual Real rhsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns unscaled right hand side i
void clear()
Remove all indices.
virtual Real getColMinAbsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns minumum absolute value of unscaled column i
R & upper_w(int i)
Returns upper bound of column i.
SPxScaler * lp_scaler
points to the scaler if the lp has been scaled, to 0 otherwise
bool m_colFirst
do column scaling first
SPxScaler(const char *name, bool colFirst=false, bool doBoth=true, SPxOut *spxout=NULL)
constructor
Saving LPs in a form suitable for SoPlex.
const SVectorBase< R > & rowVector(int i) const
Gets row vector of row i.
LP scaler abstract base class.Instances of classes derived from SPxScaler may be loaded to SoPlex in ...
LPRowSetBase(int pmax=-1, int pmemmax=-1)
Default constructor.
virtual Real getRowMinAbsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns minimum absolute value of unscaled row i
virtual Real maxAbsRowscale() const
absolute biggest row scaling factor
int size() const
return nr. of elements.
bool isConsistent() const
Consistency check.
virtual int getRowScaleExp(int i) const
returns scaling factor for row i
const SVectorBase< R > & colVector(int i) const
Returns column vector of column i.
virtual void getColUnscaled(const SPxLPBase< Real > &lp, int i, DSVector &vec) const
gets unscaled column i
int nCols() const
Returns number of columns in LP.
virtual Real getCoefUnscaled(const SPxLPBase< Real > &lp, int row, int col) const
returns unscaled coefficient of lp
bool isZero(Real a, Real eps=Param::epsilon())
returns true iff |a| <= eps
bool m_doBoth
do columns and rows
virtual Real maxColRatio(const SPxLPBase< Real > &lp) const
maximum ratio between absolute biggest and smallest element in any column.
virtual Real scaleRhs(const SPxLPBase< Real > &lp, int row, Real rhs) const
returns scaled right hand side of row row.
SVectorBase< R > & colVector_w(int i)
Returns the LP as an LPRowSet.
virtual void unscaleSlacks(const SPxLPBase< Real > &lp, Vector &s) const
unscale dense slack vector given in s.
virtual void unscalePrimalray(const SPxLPBase< Real > &lp, Vector &ray) const
unscale primal ray given in ray.
virtual Real getColMaxAbsUnscaled(const SPxLPBase< Real > &lp, int i) const
returns maximum absolute value of unscaled column i
virtual void getMaxObjUnscaled(const SPxLPBase< Real > &lp, Vector &vec) const
gets unscaled objective function
void reSize(int newsize)
reset size to newsize.
const char * m_name
Name of the scaler.
const VectorBase< R > & lower() const
Returns (internal and possibly scaled) lower bound vector.
virtual void setIntParam(int param, const char *name="intparam")
set int parameter
SPxScaler & operator=(const SPxScaler &)
assignment operator
void setMax(int newmax=1)
Reset nonzero memory to >= newmax.
R & lhs_w(int i)
Returns left hand side of row i.