summaryrefslogtreecommitdiff
path: root/build/Bonmin/include/coin/OsiPresolve.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'build/Bonmin/include/coin/OsiPresolve.hpp')
-rw-r--r--build/Bonmin/include/coin/OsiPresolve.hpp252
1 files changed, 0 insertions, 252 deletions
diff --git a/build/Bonmin/include/coin/OsiPresolve.hpp b/build/Bonmin/include/coin/OsiPresolve.hpp
deleted file mode 100644
index 9ec3d2a..0000000
--- a/build/Bonmin/include/coin/OsiPresolve.hpp
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2003, International Business Machines
-// Corporation and others. All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#ifndef OsiPresolve_H
-#define OsiPresolve_H
-#include "OsiSolverInterface.hpp"
-
-class CoinPresolveAction;
-#include "CoinPresolveMatrix.hpp"
-
-
-/*! \class OsiPresolve
- \brief OSI interface to COIN problem simplification capabilities
-
- COIN provides a number of classes which implement problem simplification
- algorithms (CoinPresolveAction, CoinPrePostsolveMatrix, and derived
- classes). The model of operation is as follows:
- <ul>
- <li>
- Create a copy of the original problem.
- </li>
- <li>
- Subject the copy to a series of transformations (the <i>presolve</i>
- methods) to produce a presolved model. Each transformation is also
- expected to provide a method to reverse the transformation (the
- <i>postsolve</i> method). The postsolve methods are collected in a
- linked list; the postsolve method for the final presolve transformation
- is at the head of the list.
- </li>
- <li>
- Hand the presolved problem to the solver for optimization.
- </li>
- <li>
- Apply the collected postsolve methods to the presolved problem
- and solution, restating the solution in terms of the original problem.
- </li>
- </ul>
-
- The COIN presolve algorithms are unaware of OSI. The OsiPresolve class takes
- care of the interface. Given an OsiSolverInterface \c origModel, it will take
- care of creating a clone properly loaded with the presolved problem and ready
- for optimization. After optimization, it will apply postsolve
- transformations and load the result back into \c origModel.
-
- Assuming a problem has been loaded into an
- \c OsiSolverInterface \c origModel, a bare-bones application looks like this:
- \code
- OsiPresolve pinfo ;
- OsiSolverInterface *presolvedModel ;
- // Return an OsiSolverInterface loaded with the presolved problem.
- presolvedModel = pinfo.presolvedModel(*origModel,1.0e-8,false,numberPasses) ;
- presolvedModel->initialSolve() ;
- // Restate the solution and load it back into origModel.
- pinfo.postsolve(true) ;
- delete presolvedModel ;
- \endcode
-*/
-
-
-
-class OsiPresolve {
-public:
- /// Default constructor (empty object)
- OsiPresolve();
-
- /// Virtual destructor
- virtual ~OsiPresolve();
-
- /*! \brief Create a new OsiSolverInterface loaded with the presolved problem.
-
- This method implements the first two steps described in the class
- documentation. It clones \c origModel and applies presolve
- transformations, storing the resulting list of postsolve
- transformations. It returns a pointer to a new OsiSolverInterface loaded
- with the presolved problem, or NULL if the problem is infeasible or
- unbounded. If \c keepIntegers is true then bounds may be tightened in
- the original. Bounds will be moved by up to \c feasibilityTolerance to
- try and stay feasible. When \c doStatus is true, the current solution will
- be transformed to match the presolved model.
-
- This should be paired with postsolve(). It is up to the client to
- destroy the returned OsiSolverInterface, <i>after</i> calling postsolve().
-
- This method is virtual. Override this method if you need to customize
- the steps of creating a model to apply presolve transformations.
-
- In some sense, a wrapper for presolve(CoinPresolveMatrix*).
- */
- virtual OsiSolverInterface *presolvedModel(OsiSolverInterface & origModel,
- double feasibilityTolerance=0.0,
- bool keepIntegers=true,
- int numberPasses=5,
- const char * prohibited=NULL,
- bool doStatus=true,
- const char * rowProhibited=NULL);
-
- /*! \brief Restate the solution to the presolved problem in terms of the
- original problem and load it into the original model.
-
- postsolve() restates the solution in terms of the original problem and
- updates the original OsiSolverInterface supplied to presolvedModel(). If
- the problem has not been solved to optimality, there are no guarantees.
- If you are using an algorithm like simplex that has a concept of a basic
- solution, then set updateStatus
-
- The advantage of going back to the original problem is that it
- will be exactly as it was, <i>i.e.</i>, 0.0 will not become 1.0e-19.
-
- Note that if you modified the original problem after presolving, then you
- must ``undo'' these modifications before calling postsolve().
-
- In some sense, a wrapper for postsolve(CoinPostsolveMatrix&).
- */
- virtual void postsolve(bool updateStatus=true);
-
- /*! \brief Return a pointer to the presolved model. */
- OsiSolverInterface * model() const;
-
- /// Return a pointer to the original model
- OsiSolverInterface * originalModel() const;
-
- /// Set the pointer to the original model
- void setOriginalModel(OsiSolverInterface *model);
-
- /// Return a pointer to the original columns
- const int * originalColumns() const;
-
- /// Return a pointer to the original rows
- const int * originalRows() const;
-
- /// Return number of rows in original model
- inline int getNumRows() const
- { return nrows_;}
-
- /// Return number of columns in original model
- inline int getNumCols() const
- { return ncols_;}
-
- /** "Magic" number. If this is non-zero then any elements with this value
- may change and so presolve is very limited in what can be done
- to the row and column. This is for non-linear problems.
- */
- inline void setNonLinearValue(double value)
- { nonLinearValue_ = value;}
- inline double nonLinearValue() const
- { return nonLinearValue_;}
- /*! \brief Fine control over presolve actions
-
- Set/clear the following bits to allow or suppress actions:
- - 0x01 allow duplicate column processing on integer columns
- and dual stuff on integers
- - 0x02 switch off actions which can change +1 to something else
- (doubleton, tripleton, implied free)
- - 0x04 allow transfer of costs from singletons and between integer
- variables (when advantageous)
- - 0x08 do not allow x+y+z=1 transform
- - 0x10 allow actions that don't easily unroll
- - 0x20 allow dubious gub element reduction
-
- GUB element reduction is only partially implemented in CoinPresolve (see
- gubrow_action) and willl cause an abort at postsolve. It's not clear
- what's meant by `dual stuff on integers'.
- -- lh, 110605 --
- */
- inline void setPresolveActions(int action)
- { presolveActions_ = (presolveActions_&0xffff0000)|(action&0xffff);}
-
-private:
- /*! Original model (solver interface loaded with the original problem).
-
- Must not be destroyed until after postsolve().
- */
- OsiSolverInterface * originalModel_;
-
- /*! Presolved model (solver interface loaded with the presolved problem)
-
- Must be destroyed by the client (using delete) after postsolve().
- */
- OsiSolverInterface * presolvedModel_;
-
- /*! "Magic" number. If this is non-zero then any elements with this value
- may change and so presolve is very limited in what can be done
- to the row and column. This is for non-linear problems.
- One could also allow for cases where sign of coefficient is known.
- */
- double nonLinearValue_;
-
- /// Original column numbers
- int * originalColumn_;
-
- /// Original row numbers
- int * originalRow_;
-
- /// The list of transformations applied.
- const CoinPresolveAction *paction_;
-
- /*! \brief Number of columns in original model.
-
- The problem will expand back to its former size as postsolve
- transformations are applied. It is efficient to allocate data structures
- for the final size of the problem rather than expand them as needed.
- */
- int ncols_;
-
- /*! \brief Number of rows in original model. */
- int nrows_;
-
- /*! \brief Number of nonzero matrix coefficients in the original model. */
- CoinBigIndex nelems_;
-
- /** Whether we want to skip dual part of presolve etc.
- 1 bit allows duplicate column processing on integer columns
- and dual stuff on integers
- 4 transfers costs to integer variables
- */
- int presolveActions_;
- /// Number of major passes
- int numberPasses_;
-
-protected:
- /*! \brief Apply presolve transformations to the problem.
-
- Handles the core activity of applying presolve transformations.
-
- If you want to apply the individual presolve routines differently, or
- perhaps add your own to the mix, define a derived class and override
- this method
- */
- virtual const CoinPresolveAction *presolve(CoinPresolveMatrix *prob);
-
- /*! \brief Reverse presolve transformations to recover the solution
- to the original problem.
-
- Handles the core activity of applying postsolve transformations.
-
- Postsolving is pretty generic; just apply the transformations in reverse
- order. You will probably only be interested in overriding this method if
- you want to add code to test for consistency while debugging new presolve
- techniques.
- */
- virtual void postsolve(CoinPostsolveMatrix &prob);
-
- /*! \brief Destroys queued postsolve actions.
-
- <i>E.g.</i>, when presolve() determines the problem is infeasible, so that
- it will not be necessary to actually solve the presolved problem and
- convert the result back to the original problem.
- */
- void gutsOfDestroy();
-};
-#endif