LP simplifier for removing uneccessary row/columns.This SPxSimplifier is mainly based on the paper "Presolving in linear programming" by E. Andersen and K. Andersen (Mathematical Programming, 1995). It implements all proposed methods and some other preprocessing techniques for removing redundant rows and columns and bounds. Also infeasibility and unboundedness may be detected. More...
#include <spxmainsm.h>
Classes | |
class | DoubletonEquationPS |
Postsolves doubleton equations combined with a column singleton. More... | |
class | DuplicateColsPS |
Postsolves duplicate columns. More... | |
class | DuplicateRowsPS |
Postsolves duplicate rows. More... | |
struct | ElementCompare |
comparator for class SVector::Element: compare nonzeros according to value More... | |
class | EmptyConstraintPS |
Postsolves empty constraints. More... | |
class | FixBoundsPS |
Postsolves variable bound fixing. More... | |
class | FixVariablePS |
Postsolves variable fixing. More... | |
class | ForceConstraintPS |
Postsolves forcing constraints. More... | |
class | FreeColSingletonPS |
Postsolves free column singletons. More... | |
class | FreeConstraintPS |
Postsolves unconstraint constraints. More... | |
class | FreeZeroObjVariablePS |
Postsolves the case when constraints are removed due to a variable with zero objective that is free in one direction. More... | |
struct | IdxCompare |
comparator for class SVector::Element: compare nonzeros according to index More... | |
class | MultiAggregationPS |
Postsolves multi aggregation. More... | |
class | PostStep |
Base class for postsolving operations.Class PostStep is an abstract base class providing the interface for operations in the postsolving process. More... | |
class | RowObjPS |
Postsolves row objectives. More... | |
class | RowSingletonPS |
Postsolves row singletons. More... | |
class | TightenBoundsPS |
Postsolves variable bound tightening from pseudo objective propagation. More... | |
class | ZeroObjColSingletonPS |
Postsolves column singletons with zero objective. More... | |
Public Member Functions | |
SPxMainSM (Timer::TYPE ttype=Timer::USER_TIME) | |
default constructor. More... | |
SPxMainSM (const SPxMainSM &old) | |
copy constructor. More... | |
SPxMainSM & | operator= (const SPxMainSM &rhs) |
assignment operator More... | |
virtual | ~SPxMainSM () |
destructor. More... | |
virtual SPxSimplifier * | clone () const |
clone function for polymorphism More... | |
virtual Result | simplify (SPxLP &lp, Real eps, Real delta) |
simplify SPxLP lp with identical primal and dual feasibility tolerance. More... | |
virtual Result | simplify (SPxLP &lp, Real eps, Real ftol, Real otol, bool keepbounds=false) |
simplify SPxLP lp with independent primal and dual feasibility tolerance. More... | |
virtual void | unsimplify (const Vector &x, const Vector &y, const Vector &s, const Vector &r, const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[], bool isOptimal=true) |
reconstructs an optimal solution for the unsimplified LP. More... | |
virtual Result | result () const |
returns result status of the simplification More... | |
virtual bool | isUnsimplified () const |
specifies whether an optimal solution has already been unsimplified. More... | |
virtual const Vector & | unsimplifiedPrimal () |
returns a reference to the unsimplified primal solution. More... | |
virtual const Vector & | unsimplifiedDual () |
returns a reference to the unsimplified dual solution. More... | |
virtual const Vector & | unsimplifiedSlacks () |
returns a reference to the unsimplified slack values. More... | |
virtual const Vector & | unsimplifiedRedCost () |
returns a reference to the unsimplified reduced costs. More... | |
virtual SPxSolver::VarStatus | getBasisRowStatus (int i) const |
gets basis status for a single row. More... | |
virtual SPxSolver::VarStatus | getBasisColStatus (int j) const |
gets basis status for a single column. More... | |
virtual void | getBasis (SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[], const int rowsSize=-1, const int colsSize=-1) const |
get optimal basis. More... | |
Public Member Functions inherited from SPxSimplifier | |
virtual const char * | getName () const |
get name of simplifier. More... | |
virtual Real | timeUsed () const |
virtual Real | getObjoffset () const |
get objective offset. More... | |
virtual void | addObjoffset (const Real val) |
add objective offset. More... | |
virtual void | setMinReduction (const Real minRed) |
set minimal reduction threshold to continue simplification More... | |
virtual bool | isConsistent () const |
consistency check More... | |
SPxSimplifier (const char *p_name, Timer::TYPE ttype=Timer::USER_TIME) | |
constructor More... | |
SPxSimplifier (const SPxSimplifier &old) | |
copy constructor More... | |
SPxSimplifier & | operator= (const SPxSimplifier &rhs) |
assignment operator More... | |
virtual | ~SPxSimplifier () |
destructor. More... | |
Private Types | |
enum | SimpleStep { EMPTY_ROW = 0, FREE_ROW = 1, SINGLETON_ROW = 2, FORCE_ROW = 3, EMPTY_COL = 4, FIX_COL = 5, FREE_ZOBJ_COL = 6, ZOBJ_SINGLETON_COL = 7, DOUBLETON_ROW = 8, FREE_SINGLETON_COL = 9, DOMINATED_COL = 10, WEAKLY_DOMINATED_COL = 11, DUPLICATE_ROW = 12, FIX_DUPLICATE_COL = 13, SUB_DUPLICATE_COL = 14, MULTI_AGG = 15 } |
Different simplification steps. More... | |
Private Member Functions | |
void | handleRowObjectives (SPxLP &lp) |
handle row objectives More... | |
void | handleExtremes (SPxLP &lp) |
handles extreme values by setting them to zero or infinity. More... | |
void | computeMinMaxResidualActivity (SPxLP &lp, int rowNumber, int colNumber, Real &minAct, Real &maxAct) |
computes the minimum and maximum residual activity for a given row and column. If colNumber is set to -1, then More... | |
void | computeMinMaxValues (SPxLP &lp, Real side, Real val, Real minRes, Real maxRes, Real &minVal, Real &maxVal) |
calculate min/max value for the multi aggregated variables More... | |
void | trivialHeuristic (SPxLP &lp) |
tries to find good lower bound solutions by applying some trivial heuristics More... | |
bool | checkSolution (SPxLP &lp, DVector sol) |
checks a solution for feasibility More... | |
void | propagatePseudoobj (SPxLP &lp) |
tightens variable bounds by propagating the pseudo objective function value. More... | |
Result | removeEmpty (SPxLP &lp) |
removed empty rows and empty columns. More... | |
Result | removeRowSingleton (SPxLP &lp, const SVector &row, int &i) |
remove row singletons. More... | |
Result | simplifyRows (SPxLP &lp, bool &again) |
performs simplification steps on the rows of the LP. More... | |
Result | simplifyCols (SPxLP &lp, bool &again) |
performs simplification steps on the columns of the LP. More... | |
Result | simplifyDual (SPxLP &lp, bool &again) |
performs simplification steps on the LP based on dual concepts. More... | |
Result | multiaggregation (SPxLP &lp, bool &again) |
performs multi-aggregations of variable based upon constraint activitu. More... | |
Result | duplicateRows (SPxLP &lp, bool &again) |
removes duplicate rows. More... | |
Result | duplicateCols (SPxLP &lp, bool &again) |
removes duplicate columns More... | |
void | fixColumn (SPxLP &lp, int i, bool correctIdx=true) |
handles the fixing of a variable. correctIdx is true iff the index mapping has to be updated. More... | |
void | removeRow (SPxLP &lp, int i) |
removes a row in the LP. More... | |
void | removeCol (SPxLP &lp, int j) |
removes a column in the LP. More... | |
int | rIdx (int i) const |
returns for a given row index of the (reduced) LP the corresponding row index in the unsimplified LP. More... | |
int | cIdx (int j) const |
returns for a given column index of the (reduced) LP the corresponding column index in the unsimplified LP. More... | |
Real | epsZero () const |
Real | feastol () const |
Real | opttol () const |
Private Attributes | |
DVector | m_prim |
unsimplified primal solution vector. More... | |
DVector | m_slack |
unsimplified slack vector. More... | |
DVector | m_dual |
unsimplified dual solution vector. More... | |
DVector | m_redCost |
unsimplified reduced cost vector. More... | |
DataArray< SPxSolver::VarStatus > | m_cBasisStat |
basis status of columns. More... | |
DataArray< SPxSolver::VarStatus > | m_rBasisStat |
basis status of rows. More... | |
DataArray< int > | m_cIdx |
column index vector in original LP. More... | |
DataArray< int > | m_rIdx |
row index vector in original LP. More... | |
DataArray< PostStep * > | m_hist |
vector of presolve history. More... | |
Array< DSVector > | m_classSetRows |
stores parallel classes with non-zero colum entry More... | |
Array< DSVector > | m_classSetCols |
stores parallel classes with non-zero row entry More... | |
Array< DSVector > | m_dupRows |
arrange duplicate rows using bucket sort w.r.t. their pClass values More... | |
Array< DSVector > | m_dupCols |
arrange duplicate columns w.r.t. their pClass values More... | |
bool | m_postsolved |
status of postsolving. More... | |
Real | m_epsilon |
epsilon zero. More... | |
Real | m_feastol |
primal feasibility tolerance. More... | |
Real | m_opttol |
dual feasibility tolerance. More... | |
DataArray< int > | m_stat |
preprocessing history. More... | |
SPxLP::SPxSense | m_thesense |
optimization sense. More... | |
bool | m_keepbounds |
keep some bounds (for boundflipping) More... | |
int | m_addedcols |
columns added by handleRowObjectives() More... | |
Result | m_result |
result of the simplification. More... | |
Real | m_cutoffbound |
the cutoff bound that is found by heuristics More... | |
Real | m_pseudoobj |
the pseudo objective function value More... | |
Friends | |
class | FreeConstraintPS |
class | EmptyConstraintPS |
class | RowSingletonPS |
class | ForceConstraintPS |
class | FixVariablePS |
class | FixBoundsPS |
class | FreeZeroObjVariablePS |
class | ZeroObjColSingletonPS |
class | FreeColSingletonPS |
class | DoubletonEquationPS |
class | DuplicateRowsPS |
class | DuplicateColsPS |
Additional Inherited Members | |
Public Types inherited from SPxSimplifier | |
enum | Result { OKAY = 0, INFEASIBLE = 1, DUAL_INFEASIBLE = 2, UNBOUNDED = 3, VANISHED = 4 } |
Result of the simplification. More... | |
Protected Attributes inherited from SPxSimplifier | |
const char * | m_name |
name of the simplifier More... | |
Timer * | m_timeUsed |
user time used for simplification More... | |
Timer::TYPE | m_timerType |
int | m_remRows |
number of removed rows More... | |
int | m_remCols |
number of removed columns More... | |
int | m_remNzos |
number of removed nonzero coefficients More... | |
int | m_chgBnds |
number of changed bounds More... | |
int | m_chgLRhs |
number of change right-hand sides More... | |
int | m_keptBnds |
number of kept bounds More... | |
int | m_keptLRhs |
number of kept left- and right-hand sides More... | |
Real | m_objoffset |
objective offset More... | |
Real | m_minReduction |
minimal reduction (sum of removed rows/cols) to continue simplification More... | |
SPxOut * | spxout |
message handler More... | |
LP simplifier for removing uneccessary row/columns.
This SPxSimplifier is mainly based on the paper "Presolving in linear programming" by E. Andersen and K. Andersen (Mathematical Programming, 1995). It implements all proposed methods and some other preprocessing techniques for removing redundant rows and columns and bounds. Also infeasibility and unboundedness may be detected.
Removed are:
Definition at line 60 of file spxmainsm.h.
|
private |
Different simplification steps.
Definition at line 1173 of file spxmainsm.h.
SPxMainSM | ( | Timer::TYPE | ttype = Timer::USER_TIME | ) |
copy constructor.
Definition at line 1337 of file spxmainsm.h.
References DataArray< T >::append(), SPxMainSM::m_hist, and DataArray< T >::reSize().
|
virtual |
destructor.
Definition at line 1417 of file spxmainsm.h.
References DataArray< T >::size(), and soplex::spx_free().
checks a solution for feasibility
Definition at line 1798 of file spxmainsm.cpp.
References SPxMainSM::feastol(), soplex::GE(), SVectorBase< R >::index(), soplex::LE(), SPxLPBase< R >::lhs(), SPxLPBase< R >::nRows(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), and SVectorBase< R >::value().
Referenced by SPxMainSM::trivialHeuristic().
|
private |
returns for a given column index of the (reduced) LP the corresponding column index in the unsimplified LP.
Definition at line 1295 of file spxmainsm.h.
Referenced by SPxMainSM::ForceConstraintPS::execute(), and SPxMainSM::DuplicateColsPS::execute().
|
virtual |
clone function for polymorphism
Implements SPxSimplifier.
Definition at line 1430 of file spxmainsm.h.
References SPxMainSM::SPxMainSM().
|
private |
computes the minimum and maximum residual activity for a given row and column. If colNumber is set to -1, then
computes the minimum and maximum residual activity for a given variable
Definition at line 1588 of file spxmainsm.cpp.
References soplex::GE(), soplex::GT(), SVectorBase< R >::index(), soplex::infinity, soplex::LE(), SPxLPBase< R >::lower(), soplex::LT(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::multiaggregation().
|
private |
calculate min/max value for the multi aggregated variables
Definition at line 1646 of file spxmainsm.cpp.
References soplex::GE(), soplex::GT(), soplex::infinity, soplex::LE(), and soplex::LT().
Referenced by SPxMainSM::multiaggregation().
|
private |
removes duplicate columns
Definition at line 3982 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeUpper(), SPxLPBase< R >::colVector(), SPxMainSM::DuplicateColsPS, SPxMainSM::epsZero(), soplex::EQrel(), SPxMainSM::feastol(), SPxMainSM::FIX_DUPLICATE_COL, SPxMainSM::FixBoundsPS, SPxMainSM::fixColumn(), soplex::GErel(), SVectorBase< R >::index(), soplex::infinity, soplex::isNotZero(), soplex::isZero(), soplex::LErel(), SPxLPBase< R >::lower(), SPxMainSM::m_cIdx, SPxMainSM::m_classSetCols, SPxMainSM::m_dupCols, SPxMainSM::m_hist, SPxSimplifier::m_minReduction, SPxSimplifier::m_remCols, SPxSimplifier::m_remNzos, SPxMainSM::m_stat, SPxLPBase< R >::maxObj(), MSG_DEBUG, MSG_INFO2, SPxLPBase< R >::nCols(), soplex::NErel(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxLPBase< R >::removeCols(), SPxMainSM::removeEmpty(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), soplex::spx_free(), SPxSimplifier::spxout, soplex::SPxQuicksort(), SPxMainSM::SUB_DUPLICATE_COL, SPxSimplifier::UNBOUNDED, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
|
private |
removes duplicate rows.
Definition at line 3628 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeRange(), SPxLPBase< R >::colVector(), SPxMainSM::DUPLICATE_ROW, SPxMainSM::DuplicateRowsPS, SPxMainSM::epsZero(), soplex::EQrel(), SPxMainSM::feastol(), SVectorBase< R >::index(), SPxSimplifier::INFEASIBLE, soplex::infinity, soplex::isNotZero(), SPxLPBase< R >::lhs(), soplex::LTrel(), SPxMainSM::m_classSetRows, SPxMainSM::m_dupRows, SPxMainSM::m_hist, SPxSimplifier::m_minReduction, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_rIdx, SPxMainSM::m_stat, MSG_DEBUG, MSG_INFO2, SPxLPBase< R >::nCols(), soplex::NErel(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxMainSM::removeEmpty(), SPxLPBase< R >::removeRows(), SPxMainSM::removeRowSingleton(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), soplex::spx_free(), SPxSimplifier::spxout, soplex::SPxQuicksort(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
|
private |
Definition at line 1300 of file spxmainsm.h.
References SPxMainSM::m_epsilon.
Referenced by SPxMainSM::duplicateCols(), SPxMainSM::duplicateRows(), SPxMainSM::fixColumn(), SPxMainSM::handleExtremes(), SPxMainSM::removeEmpty(), SPxMainSM::removeRowSingleton(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyRows(), and SPxMainSM::unsimplify().
|
private |
Definition at line 1305 of file spxmainsm.h.
References SPxMainSM::m_feastol.
Referenced by SPxMainSM::checkSolution(), SPxMainSM::duplicateCols(), SPxMainSM::duplicateRows(), SPxMainSM::fixColumn(), SPxMainSM::handleExtremes(), SPxMainSM::multiaggregation(), SPxMainSM::removeEmpty(), SPxMainSM::removeRowSingleton(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), SPxMainSM::simplifyRows(), and SPxMainSM::trivialHeuristic().
|
private |
handles the fixing of a variable. correctIdx is true iff the index mapping has to be updated.
Definition at line 4358 of file spxmainsm.cpp.
References SPxLPBase< R >::changeLhs(), SPxLPBase< R >::changeRhs(), SPxLPBase< R >::colVector(), SPxMainSM::epsZero(), soplex::EQrel(), SPxMainSM::feastol(), SPxMainSM::FixVariablePS, SVectorBase< R >::index(), soplex::infinity, soplex::isNotZero(), soplex::isZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), SPxMainSM::m_hist, soplex::maxAbs(), MSG_DEBUG, soplex::NE(), SPxLPBase< R >::rhs(), SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::duplicateCols(), SPxMainSM::simplifyCols(), and SPxMainSM::simplifyDual().
|
virtual |
get optimal basis.
Implements SPxSimplifier.
Definition at line 1499 of file spxmainsm.h.
References DataArray< T >::size().
|
virtual |
gets basis status for a single column.
Implements SPxSimplifier.
Definition at line 1493 of file spxmainsm.h.
|
virtual |
gets basis status for a single row.
Implements SPxSimplifier.
Definition at line 1487 of file spxmainsm.h.
|
private |
handles extreme values by setting them to zero or infinity.
Definition at line 1390 of file spxmainsm.cpp.
References SPxLPBase< R >::changeLhs(), SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeObj(), SPxLPBase< R >::changeRhs(), SPxLPBase< R >::changeUpper(), SPxLPBase< R >::colVector_w(), SPxMainSM::epsZero(), SPxMainSM::feastol(), SPxMainSM::FREE_ROW, SPxMainSM::FreeConstraintPS, SVectorBase< R >::index(), soplex::infinity, SPxLPBase< R >::isConsistent(), soplex::isZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), SPxSimplifier::m_chgBnds, SPxSimplifier::m_chgLRhs, SPxMainSM::m_hist, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, MSG_DEBUG, MSG_INFO2, MSG_WARNING, SPxLPBase< R >::nCols(), soplex::NE(), SPxLPBase< R >::nRows(), SPxLPBase< R >::obj(), SVectorBase< R >::pos(), SVectorBase< R >::remove(), SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector_w(), SVectorBase< R >::size(), soplex::spx_alloc(), soplex::spxAbs(), SPxSimplifier::spxout, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
|
private |
handle row objectives
Definition at line 1373 of file spxmainsm.cpp.
References SPxLPBase< R >::addCol(), SPxLPBase< R >::changeRange(), SPxLPBase< R >::changeRowObj(), SPxLPBase< R >::lhs(), SPxMainSM::m_addedcols, SPxMainSM::m_hist, SPxLPBase< R >::maxRowObj(), SPxLPBase< R >::nCols(), SPxLPBase< R >::nRows(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowObj(), and soplex::spx_alloc().
Referenced by SPxMainSM::simplify().
|
virtual |
specifies whether an optimal solution has already been unsimplified.
Reimplemented from SPxSimplifier.
Definition at line 1458 of file spxmainsm.h.
References SPxMainSM::m_postsolved.
|
private |
performs multi-aggregations of variable based upon constraint activitu.
Definition at line 3384 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeElement(), SPxLPBase< R >::changeLhs(), SPxLPBase< R >::changeMaxObj(), SPxLPBase< R >::changeRhs(), SPxLPBase< R >::colVector(), SPxMainSM::computeMinMaxResidualActivity(), SPxMainSM::computeMinMaxValues(), soplex::EQ(), SPxMainSM::feastol(), soplex::GT(), SVectorBase< R >::index(), soplex::infinity, soplex::isNotZero(), soplex::LE(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), SPxMainSM::m_hist, SPxSimplifier::m_minReduction, SPxSimplifier::m_remCols, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, SPxLPBase< R >::maxObj(), MSG_DEBUG, MSG_INFO2, SPxMainSM::MULTI_AGG, SPxLPBase< R >::nCols(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SVectorBase< R >::pos(), SPxMainSM::removeCol(), SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
assignment operator
Definition at line 1370 of file spxmainsm.h.
References DataArray< T >::append(), DataArray< T >::clear(), SPxMainSM::m_addedcols, SPxMainSM::m_cBasisStat, SPxMainSM::m_cIdx, SPxMainSM::m_cutoffbound, SPxMainSM::m_dual, SPxMainSM::m_epsilon, SPxMainSM::m_feastol, SPxMainSM::m_hist, SPxMainSM::m_keepbounds, SPxMainSM::m_opttol, SPxMainSM::m_postsolved, SPxMainSM::m_prim, SPxMainSM::m_pseudoobj, SPxMainSM::m_rBasisStat, SPxMainSM::m_redCost, SPxMainSM::m_result, SPxMainSM::m_rIdx, SPxMainSM::m_slack, SPxMainSM::m_stat, SPxMainSM::m_thesense, SPxSimplifier::operator=(), DataArray< T >::size(), and soplex::spx_free().
|
private |
Definition at line 1310 of file spxmainsm.h.
References SPxMainSM::m_opttol.
Referenced by SPxMainSM::simplifyDual().
|
private |
tightens variable bounds by propagating the pseudo objective function value.
Definition at line 1818 of file spxmainsm.cpp.
References SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeUpper(), soplex::EQ(), soplex::GT(), soplex::infinity, SPxLPBase< R >::lower(), soplex::LT(), SPxMainSM::m_cutoffbound, SPxMainSM::m_hist, SPxSimplifier::m_objoffset, SPxMainSM::m_pseudoobj, SPxLPBase< R >::maxObj(), SPxLPBase< R >::nCols(), soplex::spx_alloc(), and SPxLPBase< R >::upper().
Referenced by SPxMainSM::simplify().
|
private |
removes a column in the LP.
Definition at line 1284 of file spxmainsm.h.
References SPxLPBase< R >::nCols(), and SPxLPBase< R >::removeCol().
Referenced by SPxMainSM::multiaggregation(), SPxMainSM::removeEmpty(), SPxMainSM::simplifyCols(), and SPxMainSM::simplifyDual().
|
private |
removed empty rows and empty columns.
Definition at line 1880 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::colVector(), SPxMainSM::EMPTY_COL, SPxMainSM::EMPTY_ROW, SPxMainSM::EmptyConstraintPS, SPxMainSM::epsZero(), SPxMainSM::feastol(), SPxMainSM::FixBoundsPS, SPxMainSM::FixVariablePS, soplex::GT(), SPxSimplifier::INFEASIBLE, soplex::infinity, soplex::isZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), SPxMainSM::m_hist, SPxSimplifier::m_remCols, SPxSimplifier::m_remRows, SPxMainSM::m_stat, SPxLPBase< R >::maxObj(), MSG_DEBUG, MSG_INFO2, SPxLPBase< R >::nCols(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxMainSM::removeCol(), SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, SPxSimplifier::UNBOUNDED, and SPxLPBase< R >::upper().
Referenced by SPxMainSM::duplicateCols(), and SPxMainSM::duplicateRows().
|
private |
removes a row in the LP.
Definition at line 1278 of file spxmainsm.h.
References SPxLPBase< R >::nRows(), and SPxLPBase< R >::removeRow().
Referenced by SPxMainSM::handleExtremes(), SPxMainSM::multiaggregation(), SPxMainSM::removeEmpty(), SPxMainSM::removeRowSingleton(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), and SPxMainSM::simplifyRows().
|
private |
remove row singletons.
Definition at line 1988 of file spxmainsm.cpp.
References SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeUpper(), SPxMainSM::epsZero(), SPxMainSM::feastol(), soplex::GT(), soplex::GTrel(), SVectorBase< R >::index(), SPxSimplifier::INFEASIBLE, soplex::infinity, soplex::isZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), soplex::LTrel(), SPxMainSM::m_hist, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, MSG_DEBUG, SPxSimplifier::OKAY, SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxMainSM::RowSingletonPS, SPxMainSM::SINGLETON_ROW, SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::duplicateRows(), and SPxMainSM::simplifyRows().
|
virtual |
returns result status of the simplification
Implements SPxSimplifier.
Definition at line 1452 of file spxmainsm.h.
References SPxMainSM::m_result.
|
private |
returns for a given row index of the (reduced) LP the corresponding row index in the unsimplified LP.
Definition at line 1290 of file spxmainsm.h.
Referenced by SPxMainSM::FreeZeroObjVariablePS::execute(), and SPxMainSM::DuplicateRowsPS::execute().
simplify SPxLP lp
with identical primal and dual feasibility tolerance.
Implements SPxSimplifier.
Definition at line 1440 of file spxmainsm.h.
References SPxMainSM::PostStep::eps(), and SPxMainSM::unsimplify().
|
virtual |
simplify SPxLP lp
with independent primal and dual feasibility tolerance.
Implements SPxSimplifier.
Definition at line 4434 of file spxmainsm.cpp.
References SPxMainSM::DOMINATED_COL, SPxMainSM::DOUBLETON_ROW, SPxMainSM::DUPLICATE_ROW, SPxMainSM::duplicateCols(), SPxMainSM::duplicateRows(), SPxMainSM::EMPTY_COL, SPxMainSM::EMPTY_ROW, SPxMainSM::PostStep::eps(), SPxMainSM::FIX_COL, SPxMainSM::FIX_DUPLICATE_COL, SPxMainSM::FORCE_ROW, SPxMainSM::FREE_ROW, SPxMainSM::FREE_SINGLETON_COL, SPxMainSM::FREE_ZOBJ_COL, SPxMainSM::handleExtremes(), SPxMainSM::handleRowObjectives(), soplex::infinity, SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), SPxMainSM::m_addedcols, SPxMainSM::m_cBasisStat, SPxSimplifier::m_chgBnds, SPxSimplifier::m_chgLRhs, SPxMainSM::m_cIdx, SPxMainSM::m_classSetCols, SPxMainSM::m_classSetRows, SPxMainSM::m_cutoffbound, SPxMainSM::m_dual, SPxMainSM::m_dupCols, SPxMainSM::m_dupRows, SPxMainSM::m_epsilon, SPxMainSM::m_feastol, SPxMainSM::m_hist, SPxMainSM::m_keepbounds, SPxSimplifier::m_keptBnds, SPxSimplifier::m_keptLRhs, SPxSimplifier::m_objoffset, SPxMainSM::m_opttol, SPxMainSM::m_postsolved, SPxMainSM::m_prim, SPxMainSM::m_pseudoobj, SPxMainSM::m_rBasisStat, SPxMainSM::m_redCost, SPxSimplifier::m_remCols, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_result, SPxMainSM::m_rIdx, SPxMainSM::m_slack, SPxMainSM::m_stat, SPxMainSM::m_thesense, SPxSimplifier::m_timeUsed, MSG_INFO1, MSG_INFO2, SPxMainSM::MULTI_AGG, SPxMainSM::multiaggregation(), SPxLPBase< R >::nCols(), SPxLPBase< R >::nNzos(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxMainSM::propagatePseudoobj(), DVectorBase< R >::reDim(), Timer::reset(), DataArray< T >::reSize(), SPxLPBase< R >::rhs(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), SPxMainSM::simplifyRows(), SPxMainSM::SINGLETON_ROW, DataArray< T >::size(), soplex::spx_free(), SPxSimplifier::spxout, SPxLPBase< R >::spxout, SPxLPBase< R >::spxSense(), Timer::start(), Timer::stop(), SPxMainSM::SUB_DUPLICATE_COL, SPxMainSM::trivialHeuristic(), SPxLPBase< R >::upper(), SPxSimplifier::VANISHED, SPxMainSM::WEAKLY_DOMINATED_COL, and SPxMainSM::ZOBJ_SINGLETON_COL.
|
private |
performs simplification steps on the columns of the LP.
Definition at line 2597 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeBounds(), SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeObj(), SPxLPBase< R >::changeRange(), SPxLPBase< R >::changeUpper(), SPxLPBase< R >::colVector(), SPxMainSM::DOUBLETON_ROW, SPxMainSM::DoubletonEquationPS, SPxMainSM::EMPTY_COL, SPxMainSM::epsZero(), soplex::EQrel(), SPxMainSM::feastol(), SPxMainSM::FIX_COL, SPxMainSM::FixBoundsPS, SPxMainSM::fixColumn(), SPxMainSM::FixVariablePS, SPxMainSM::FREE_ROW, SPxMainSM::FREE_SINGLETON_COL, SPxMainSM::FREE_ZOBJ_COL, SPxMainSM::FreeColSingletonPS, SPxMainSM::FreeConstraintPS, SPxMainSM::FreeZeroObjVariablePS, soplex::GT(), soplex::GTrel(), SVectorBase< R >::index(), SPxSimplifier::INFEASIBLE, soplex::infinity, soplex::isNotZero(), soplex::isZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), soplex::LTrel(), SPxSimplifier::m_chgBnds, SPxMainSM::m_hist, SPxSimplifier::m_minReduction, SPxSimplifier::m_remCols, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, soplex::maxAbs(), SPxLPBase< R >::maxObj(), MSG_DEBUG, MSG_INFO2, SPxLPBase< R >::nCols(), soplex::NErel(), SPxLPBase< R >::nRows(), SPxLPBase< R >::obj(), SPxSimplifier::OKAY, SPxMainSM::removeCol(), SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, soplex::SPxQuicksort(), SPxSimplifier::UNBOUNDED, SPxLPBase< R >::upper(), SVectorBase< R >::value(), SPxMainSM::ZeroObjColSingletonPS, and SPxMainSM::ZOBJ_SINGLETON_COL.
Referenced by SPxMainSM::simplify().
|
private |
performs simplification steps on the LP based on dual concepts.
Definition at line 3126 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeUpper(), SPxLPBase< R >::colVector(), SPxMainSM::DOMINATED_COL, SPxSimplifier::DUAL_INFEASIBLE, soplex::EQrel(), SPxMainSM::feastol(), SPxMainSM::FIX_COL, SPxMainSM::FixBoundsPS, SPxMainSM::fixColumn(), SPxMainSM::FREE_ROW, SPxMainSM::FreeConstraintPS, soplex::GTrel(), SVectorBase< R >::index(), soplex::infinity, soplex::isNotZero(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LTrel(), SPxMainSM::m_hist, SPxSimplifier::m_minReduction, SPxSimplifier::m_remCols, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, SPxLPBase< R >::maxObj(), MSG_DEBUG, MSG_INFO2, SPxLPBase< R >::nCols(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxMainSM::opttol(), SPxMainSM::removeCol(), SPxMainSM::removeRow(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), SPxSimplifier::spxout, SPxSimplifier::UNBOUNDED, SPxLPBase< R >::upper(), SVectorBase< R >::value(), and SPxMainSM::WEAKLY_DOMINATED_COL.
Referenced by SPxMainSM::simplify().
|
private |
performs simplification steps on the rows of the LP.
Definition at line 2061 of file spxmainsm.cpp.
References ASSERT_WARN, SPxLPBase< R >::changeLhs(), SPxLPBase< R >::changeLower(), SPxLPBase< R >::changeRhs(), SPxLPBase< R >::changeUpper(), SPxMainSM::EMPTY_ROW, SPxMainSM::EmptyConstraintPS, Param::epsilon(), SPxMainSM::epsZero(), soplex::EQrel(), SPxMainSM::feastol(), SPxMainSM::FORCE_ROW, SPxMainSM::ForceConstraintPS, SPxMainSM::FREE_ROW, SPxMainSM::FreeConstraintPS, soplex::GErel(), soplex::GT(), soplex::GTrel(), SVectorBase< R >::index(), SPxSimplifier::INFEASIBLE, soplex::infinity, soplex::isNotZero(), soplex::isZero(), soplex::LErel(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), soplex::LTrel(), SPxSimplifier::m_chgBnds, SPxSimplifier::m_chgLRhs, SPxMainSM::m_epsilon, SPxMainSM::m_hist, SPxMainSM::m_keepbounds, SPxSimplifier::m_keptBnds, SPxSimplifier::m_keptLRhs, SPxSimplifier::m_minReduction, SPxSimplifier::m_remNzos, SPxSimplifier::m_remRows, SPxMainSM::m_stat, soplex::maxAbs(), MSG_DEBUG, MSG_INFO2, MSG_WARNING, soplex::NErel(), SPxLPBase< R >::nRows(), SPxSimplifier::OKAY, SPxMainSM::removeRow(), SPxMainSM::removeRowSingleton(), SPxLPBase< R >::rhs(), SPxLPBase< R >::rowVector(), SVectorBase< R >::size(), soplex::spx_alloc(), soplex::spxAbs(), SPxSimplifier::spxout, SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
|
private |
tries to find good lower bound solutions by applying some trivial heuristics
Definition at line 1679 of file spxmainsm.cpp.
References ASSERT_WARN, SPxMainSM::checkSolution(), SPxLPBase< R >::colVector(), SPxMainSM::feastol(), soplex::GE(), soplex::GT(), SVectorBase< R >::index(), soplex::infinity, soplex::isNotZero(), soplex::LE(), SPxLPBase< R >::lhs(), SPxLPBase< R >::lower(), soplex::LT(), SPxMainSM::m_cutoffbound, SPxSimplifier::m_objoffset, MAXIMUM, SPxLPBase< R >::maxObj(), MINIMUM, SPxLPBase< R >::nCols(), SPxLPBase< R >::rhs(), SVectorBase< R >::size(), SPxLPBase< R >::upper(), and SVectorBase< R >::value().
Referenced by SPxMainSM::simplify().
|
virtual |
returns a reference to the unsimplified dual solution.
Implements SPxSimplifier.
Definition at line 1469 of file spxmainsm.h.
References SPxMainSM::m_dual.
|
virtual |
returns a reference to the unsimplified primal solution.
Implements SPxSimplifier.
Definition at line 1463 of file spxmainsm.h.
References SPxMainSM::m_prim.
|
virtual |
returns a reference to the unsimplified reduced costs.
Implements SPxSimplifier.
Definition at line 1481 of file spxmainsm.h.
References SPxMainSM::m_redCost.
|
virtual |
returns a reference to the unsimplified slack values.
Implements SPxSimplifier.
Definition at line 1475 of file spxmainsm.h.
References SPxMainSM::m_slack.
|
virtual |
reconstructs an optimal solution for the unsimplified LP.
Implements SPxSimplifier.
Definition at line 4664 of file spxmainsm.cpp.
References SPxSolver::BASIC, VectorBase< R >::dim(), SPxMainSM::epsZero(), SPxMainSM::PostStep::getName(), soplex::isZero(), SPxMainSM::m_addedcols, SPxMainSM::m_cBasisStat, SPxMainSM::m_cIdx, SPxMainSM::m_dual, SPxMainSM::m_hist, SPxMainSM::m_postsolved, SPxMainSM::m_prim, SPxMainSM::m_rBasisStat, SPxMainSM::m_redCost, SPxMainSM::m_slack, SPxMainSM::m_thesense, SPxLPBase< Real >::MAXIMIZE, MSG_DEBUG, MSG_INFO1, DVectorBase< R >::reDim(), DataArray< T >::reSize(), DataArray< T >::size(), soplex::spx_free(), SPxSimplifier::spxout, and SPxException::what().
Referenced by SPxMainSM::simplify().
|
friend |
Definition at line 1164 of file spxmainsm.h.
Referenced by SPxMainSM::DoubletonEquationPS::clone(), and SPxMainSM::simplifyCols().
|
friend |
Definition at line 1166 of file spxmainsm.h.
Referenced by SPxMainSM::DuplicateColsPS::clone(), and SPxMainSM::duplicateCols().
|
friend |
Definition at line 1165 of file spxmainsm.h.
Referenced by SPxMainSM::DuplicateRowsPS::clone(), and SPxMainSM::duplicateRows().
|
friend |
Definition at line 1156 of file spxmainsm.h.
Referenced by SPxMainSM::EmptyConstraintPS::clone(), SPxMainSM::removeEmpty(), and SPxMainSM::simplifyRows().
|
friend |
Definition at line 1160 of file spxmainsm.h.
Referenced by SPxMainSM::FixBoundsPS::clone(), SPxMainSM::duplicateCols(), SPxMainSM::removeEmpty(), SPxMainSM::simplifyCols(), and SPxMainSM::simplifyDual().
|
friend |
Definition at line 1159 of file spxmainsm.h.
Referenced by SPxMainSM::FixVariablePS::clone(), SPxMainSM::fixColumn(), SPxMainSM::removeEmpty(), and SPxMainSM::simplifyCols().
|
friend |
Definition at line 1158 of file spxmainsm.h.
Referenced by SPxMainSM::ForceConstraintPS::clone(), and SPxMainSM::simplifyRows().
|
friend |
Definition at line 1163 of file spxmainsm.h.
Referenced by SPxMainSM::FreeColSingletonPS::clone(), and SPxMainSM::simplifyCols().
|
friend |
Definition at line 1155 of file spxmainsm.h.
Referenced by SPxMainSM::FreeConstraintPS::clone(), SPxMainSM::handleExtremes(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), and SPxMainSM::simplifyRows().
|
friend |
Definition at line 1161 of file spxmainsm.h.
Referenced by SPxMainSM::FreeZeroObjVariablePS::clone(), and SPxMainSM::simplifyCols().
|
friend |
Definition at line 1157 of file spxmainsm.h.
Referenced by SPxMainSM::RowSingletonPS::clone(), and SPxMainSM::removeRowSingleton().
|
friend |
Definition at line 1162 of file spxmainsm.h.
Referenced by SPxMainSM::ZeroObjColSingletonPS::clone(), and SPxMainSM::simplifyCols().
|
private |
columns added by handleRowObjectives()
Definition at line 1218 of file spxmainsm.h.
Referenced by SPxMainSM::handleRowObjectives(), SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().
|
private |
basis status of columns.
Definition at line 1202 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().
|
private |
column index vector in original LP.
Definition at line 1204 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateCols(), SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().
stores parallel classes with non-zero row entry
Definition at line 1208 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateCols(), and SPxMainSM::simplify().
stores parallel classes with non-zero colum entry
Definition at line 1207 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateRows(), and SPxMainSM::simplify().
|
private |
the cutoff bound that is found by heuristics
Definition at line 1220 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::propagatePseudoobj(), SPxMainSM::simplify(), and SPxMainSM::trivialHeuristic().
|
private |
unsimplified dual solution vector.
Definition at line 1200 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), SPxMainSM::unsimplifiedDual(), and SPxMainSM::unsimplify().
arrange duplicate columns w.r.t. their pClass values
Definition at line 1210 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateCols(), and SPxMainSM::simplify().
arrange duplicate rows using bucket sort w.r.t. their pClass values
Definition at line 1209 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateRows(), and SPxMainSM::simplify().
|
private |
epsilon zero.
Definition at line 1212 of file spxmainsm.h.
Referenced by SPxMainSM::epsZero(), SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::simplifyRows().
|
private |
primal feasibility tolerance.
Definition at line 1213 of file spxmainsm.h.
Referenced by SPxMainSM::feastol(), SPxMainSM::operator=(), and SPxMainSM::simplify().
vector of presolve history.
Definition at line 1206 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateCols(), SPxMainSM::duplicateRows(), SPxMainSM::fixColumn(), SPxMainSM::handleExtremes(), SPxMainSM::handleRowObjectives(), SPxMainSM::multiaggregation(), SPxMainSM::operator=(), SPxMainSM::propagatePseudoobj(), SPxMainSM::removeEmpty(), SPxMainSM::removeRowSingleton(), SPxMainSM::simplify(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), SPxMainSM::simplifyRows(), SPxMainSM::SPxMainSM(), and SPxMainSM::unsimplify().
|
private |
keep some bounds (for boundflipping)
Definition at line 1217 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::simplifyRows().
|
private |
dual feasibility tolerance.
Definition at line 1214 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::opttol(), and SPxMainSM::simplify().
|
private |
status of postsolving.
Definition at line 1211 of file spxmainsm.h.
Referenced by SPxMainSM::isUnsimplified(), SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().
|
private |
unsimplified primal solution vector.
Definition at line 1198 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), SPxMainSM::unsimplifiedPrimal(), and SPxMainSM::unsimplify().
|
private |
the pseudo objective function value
Definition at line 1221 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::propagatePseudoobj(), and SPxMainSM::simplify().
|
private |
basis status of rows.
Definition at line 1203 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().
|
private |
unsimplified reduced cost vector.
Definition at line 1201 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), SPxMainSM::unsimplifiedRedCost(), and SPxMainSM::unsimplify().
|
private |
result of the simplification.
Definition at line 1219 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::result(), and SPxMainSM::simplify().
|
private |
row index vector in original LP.
Definition at line 1205 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateRows(), SPxMainSM::operator=(), and SPxMainSM::simplify().
|
private |
unsimplified slack vector.
Definition at line 1199 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), SPxMainSM::unsimplifiedSlacks(), and SPxMainSM::unsimplify().
|
private |
preprocessing history.
Definition at line 1215 of file spxmainsm.h.
Referenced by SPxMainSM::duplicateCols(), SPxMainSM::duplicateRows(), SPxMainSM::handleExtremes(), SPxMainSM::multiaggregation(), SPxMainSM::operator=(), SPxMainSM::removeEmpty(), SPxMainSM::removeRowSingleton(), SPxMainSM::simplify(), SPxMainSM::simplifyCols(), SPxMainSM::simplifyDual(), and SPxMainSM::simplifyRows().
|
private |
optimization sense.
Definition at line 1216 of file spxmainsm.h.
Referenced by SPxMainSM::operator=(), SPxMainSM::simplify(), and SPxMainSM::unsimplify().