13#ifndef OsiTMINLPInterface_H
14#define OsiTMINLPInterface_H
33 class RegisteredOptions;
34 class StrongBranchingSolver;
69 std::string f = std::string(),
78#define SimpleError(x, y) SimpleError((x), (y), __FILE__, __LINE__)
83 return app_->newUnsolvedError(num,
problem, name);
144 const std::string &
prefix,
189 return app_->prefix();
227 throw SimpleError(
"Function not implemented for OsiTMINLPInterface",
"branchAndBound()");
254 hasContinuedAfterNlpFailure_ =
true;
262 return newCutoffDecr;
274 return hasContinuedAfterNlpFailure_;
279 pretendFailIsInfeasible_ = 2;
284 problem_->set_obj_value(1e200);
289 problem_->set_obj_value(-1e200);
290 problem_->force_fractionnal_sol();
484 return nCallOptimizeTNLP_;
489 return totalNlpSolveTime_;
494 return totalIterations_;
506 virtual void setColLower(
int elementIndex,
double elementValue );
510 virtual void setColUpper(
int elementIndex,
double elementValue );
525 virtual void setRowLower(
int elementIndex,
double elementValue );
529 virtual void setRowUpper(
int elementIndex,
double elementValue );
532 virtual void setRowType(
int index,
char sense,
double rightHandSide,
580 return warmStartMode_;
589 throw SimpleError(
"Needs coding for this interface",
"basisIsAvailable");
607 numIterationSuspect_ = value;
649 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
656 const double collb,
const double colub,
659 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
664 virtual void deleteCols(
const int num,
const int * colIndices)
666 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
673 const double rowlb,
const double rowub)
675 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
681 const char rowsen,
const double rowrhs,
684 throw SimpleError(
"OsiTMINLPInterface model does not implement this function.",
689 virtual void deleteRows(
const int num,
const int * rowIndices)
693 problem_->removeCuts(num, rowIndices);
700 const double* collb,
const double* colub,
702 const double* rowlb,
const double* rowub)
704 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
712 double*& collb,
double*& colub,
double*& obj,
713 double*& rowlb,
double*& rowub)
715 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
722 const double* collb,
const double* colub,
724 const char* rowsen,
const double* rowrhs,
725 const double* rowrng)
727 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
734 double*& collb,
double*& colub,
double*& obj,
735 char*& rowsen,
double*& rowrhs,
738 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
746 const int* start,
const int* index,
748 const double* collb,
const double* colub,
750 const double* rowlb,
const double* rowub)
752 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
759 const int* start,
const int* index,
761 const double* collb,
const double* colub,
763 const char* rowsen,
const double* rowrhs,
764 const double* rowrng)
766 throw SimpleError(
"OsiTMINLPInterface model does not implement this function.",
773 const char *extension =
"mps")
775 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
783 const char *extension =
"mps",
784 double objSense=0.0)
const
786 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
791 virtual std::vector<double*>
getDualRays(
int maxNumRays,
bool fullRay =
false)
const
793 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
800 throw SimpleError(
"OsiTMINLPInterface does not implement this function.",
816 app_->setOutputToDefault();}
818 app_->forceSolverOutput(log_level);}
854 const std::list<Ipopt::SmartPtr<TNLPSolver> >&
debug_apps()
const{
886 app_->enableWarmStart();
910 double theta,
bool global);
915 const double * x2,
bool global);
919 const double * x2,
bool global){
950 void switchToFeasibilityProblem(
size_t n,
const double * x_bar,
const int* ind,
double a,
double s,
int L);
954 void switchToFeasibilityProblem(
size_t n,
const double * x_bar,
const int* ind,
955 double rhs_local_branching_constraint);
958 void switchToOriginalProblem();
961 void round_and_check(
double tolerance,
963 if(!problem_->check_solution(
objects, nObjects)){
973 enum OaMessagesTypes {
974 CUT_NOT_VIOLATED_ENOUGH = 0,
975 VIOLATED_OA_CUT_GENERATED,
977 OA_MESSAGES_DUMMY_END};
994 virtual ~OaMessageHandler(){
997 OaMessageHandler(
const OaMessageHandler &other):
1003 OaMessageHandler & operator=(
const OaMessageHandler &rhs){
1008 return new OaMessageHandler(*
this);}
1014 oaHandler_ =
new OaMessageHandler(handler);
1022 double effectivenessLb = 0.0){
1024 problem_->addCuts(cs);
1025 ApplyCutsReturnCode rc;
1037 problem_->addCuts(numberCuts, cuts);
1042 double getConstraintsViolation(
const double * x,
double & obj);
1046 double getNonLinearitiesViolation(
const double *x,
const double obj);
1050 void extractInterfaceParams();
1061 return app_->roptions();
1083 void get_tolerances(
double &tiny,
double&very_tiny,
double &rhsRelax,
double &infty){
1085 very_tiny = veryTiny_;
1086 rhsRelax = rhsRelax_;
1097 enum RandomGenerationType{
1098 uniform =0, perturb=1, perturb_suffix=2};
1100 int initializeJacobianArrays();
1104 virtual std::string appName()
1113 void solveAndCheckErrors(
bool doResolve,
bool throwOnFailure,
1114 const char * whereFrom);
1122 problem_->addCuts(1, &
cut);
1128 throw SimpleError(
"Ipopt model does not implement this function.",
1146 bool feasibility_mode_;
1151 std::list<Ipopt::SmartPtr<TNLPSolver> > debug_apps_;
1162 void freeCachedColRim();
1164 void freeCachedRowRim();
1166 void freeCachedData();
1169 void extractSenseRhsAndRange()
const;
1171 mutable char *rowsense_;
1174 mutable double *rhs_;
1177 mutable double *rowrange_;
1180 mutable double *reducedCosts_;
1182 double OsiDualObjectiveLimit_;
1184 mutable bool hasVarNamesFile_;
1187 int nCallOptimizeTNLP_;
1189 double totalNlpSolveTime_;
1191 int totalIterations_;
1193 double maxRandomRadius_;
1195 int randomGenerationType_;
1197 double max_perturbation_;
1201 int numRetryInitial_;
1203 int numRetryResolve_;
1205 int numRetryInfeasibles_;
1207 int numRetryUnsolved_;
1209 double infeasibility_epsilon_;
1216 double coeff_var_threshold_;
1218 double first_perc_for_cutoff_decr_;
1220 double second_perc_for_cutoff_decr_;
1228 int pretendFailIsInfeasible_;
1230 mutable int pretendSucceededNext_;
1233 bool hasContinuedAfterNlpFailure_;
1236 int numIterationSuspect_ ;
1240 bool hasBeenOptimized_;
1244 mutable double * obj_;
1246 static bool hasPrintedOptions;
1292 OaMessages oaMessages_;
1294 OaMessageHandler * oaHandler_;
1297 double newCutoffDecr;
1303 const std::string &
prefix);
1321static const char * OPT_SYMB;
1322static const char * FAILED_SYMB;
1323static const char * INFEAS_SYMB;
1324static const char * TIME_SYMB;
1325static const char * UNBOUND_SYMB;
1331 return INFEAS_SYMB;}
1333 return UNBOUND_SYMB;}
1336 else return FAILED_SYMB;
1338 const char * statusAsString(){
1339 return statusAsString(optimizationStatus_);}
Messages written by an OsiTMINLPInterface.
Error class to throw exceptions from OsiTMINLPInterface.
SimpleError(std::string message, std::string methodName, std::string f=std::string(), int l=-1)
Alternate constructor using strings.
This is class provides an Osi interface for a Mixed Integer Linear Program expressed as a TMINLP (so ...
void forceBranchable()
Force current solution to be branched on (make it fractionnal with small objective)
MessagesTypes
Type of the messages specifically written by OsiTMINLPInterface.
@ WARN_SUCCESS_WS
Problem not solved with warm start but solved without.
@ UNSOLVED_PROBLEM_FOUND
found an unsolved problem
@ INFEASIBLE_SOLUTION_FOUND
found an infeasible problem
@ WARN_SUCCESS_RANDOM
Subproblem not solve with warm start but solved with random point.
@ SUSPECT_PROBLEM2
Output the number of the problem.
@ ERROR_NO_TNLPSOLVER
Trying to access non-existent TNLPSolver.
@ WARNING_NON_CONVEX_OA
Warn that there are equality or ranged constraints and OA may works bad.
@ SOLVER_DISAGREE_STATUS
Different solver gives different status for problem.
@ WARN_RESOLVE_BEFORE_INITIAL_SOLVE
resolve() has been called but there was no previous call to initialSolve().
@ SUSPECT_PROBLEM
Output the number of the problem.
@ IPOPT_SUMMARY
Output summary statistics on Ipopt solution.
@ SOLVER_DISAGREE_VALUE
Different solver gives different optimal value for problem.
@ WARNING_RESOLVING
Warn that a problem is resolved.
@ LOG_HEAD
Head of "civilized" log.
@ WARN_CONTINUING_ON_FAILURE
a failure occurred but is continuing
@ SOLUTION_FOUND
found a feasible solution
@ LOG_FIRST_LINE
First line (first solve) of log.
@ OSITMINLPINTERFACE_DUMMY_END
@ LOG_LINE
standard line (retry solving) of log.
@ BETTER_SOL
Found a better solution with random values.
@ ALTERNATE_OBJECTIVE
Recomputed integer feasible with alternate objective function.
virtual void setObjSense(double s)
Set the objective function sense (disabled).
virtual const CoinPackedMatrix * getMatrixByRow() const
We have to keep this but it will return NULL.
virtual void addCol(const CoinPackedVectorBase &vec, const double collb, const double colub, const double obj)
We have to keep this but it will throw an error.
void setNumIterationSuspect(int value)
void use(Ipopt::SmartPtr< TMINLP2TNLP > tminlp2tnlp)
Sets the TMINLP2TNLP to be used by the interface.
const std::list< Ipopt::SmartPtr< TNLPSolver > > & debug_apps() const
virtual void setInteger(int index)
Set the index-th variable to be an integer variable.
virtual const char * getRowSense() const
Get pointer to array[getNumRows()] of row constraint senses.
virtual void resolve()
Resolve the continuous relaxation after problem modification.
virtual const double * getColLower() const
Get pointer to array[getNumCols()] of column lower bounds.
const Bonmin::TNLPSolver * solver() const
virtual bool isFreeBinary(int columnNumber) const
Return true if column is binary and not fixed at either bound.
const int * getBranchingDirections() const
get prefered branching directions
virtual bool isPrimalObjectiveLimitReached() const
Is the given primal objective limit reached?
virtual bool isIntegerNonBinary(int columnNumber) const
Return true if column is general integer.
virtual bool isContinuous(int colNumber) const
Return true if column is continuous.
bool setStrParam(OsiStrParam key, const std::string &value)
virtual void loadProblem(const int numcols, const int numrows, const int *start, const int *index, const double *value, const double *collb, const double *colub, const double *obj, const char *rowsen, const double *rowrhs, const double *rowrng)
We have to keep this but it will throw an error.
virtual void resolve(const char *whereFrom)
Resolve the continuous relaxation after problem modification.
virtual void resolveForRobustness(int numretry)
Method to be called when a problem has failed to be solved.
int nCallOptimizeTNLP()
get total number of calls to solve.
const int * getPriorities() const
Get priorities on integer variables.
Ipopt::SmartPtr< Ipopt::OptionsList > options()
Retrieve OsiTMINLPApplication option list.
const double * getUpPsCosts() const
virtual const double * getObjCoefficients() const
This returns the objective function gradient at the current point.
double totalNlpSolveTime()
get total time taken to solve NLP's.
virtual void extractLinearRelaxation(OsiSolverInterface &si, bool getObj=1, bool solveNlp=1)
Extract a linear relaxation of the MINLP.
virtual void addRow(const CoinPackedVectorBase &vec, const double rowlb, const double rowub)
We have to keep this but it will throw an error.
virtual void extractLinearRelaxation(OsiSolverInterface &si, const double *x, bool getObj=1)
Extract a linear relaxation of the MINLP.
virtual int getNumCols() const
Get number of columns.
virtual const double * getRightHandSide() const
Get pointer to array[getNumRows()] of rows right-hand sides.
void initialize(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions, Ipopt::SmartPtr< Ipopt::OptionsList > options, Ipopt::SmartPtr< Ipopt::Journalist > journalist, const std::string &prefix, Ipopt::SmartPtr< TMINLP > tminlp)
Facilitator to initialize interface.
bool getIntParam(OsiIntParam key, int &value) const
double solveFeasibilityProblem(size_t n, const double *x_bar, const int *ind, double a, double s, int L)
Given a point x_bar this solves the problem of finding the point which minimize a convex combination ...
virtual const double * getRowPrice() const
Get pointer to array[getNumRows()] of dual prices.
void forceSolverOutput(int log_level)
virtual ~OsiTMINLPInterface()
Destructor.
bool setIntParam(OsiIntParam key, int value)
virtual void writeMps(const char *filename, const char *extension="mps", double objSense=0.0) const
We have to keep this but it will throw an error.
virtual int readMps(const char *filename, const char *extension="mps")
We have to keep this but it will throw an error.
virtual void getConstraintOuterApproximation(OsiCuts &cs, int constraintNumber, const double *x, const double *x2, bool global)
Get the outer approximation at provided point for given constraint.
virtual void setColSolution(const double *colsol)
Set the primal solution variable values Set the values for the starting point.
virtual CoinWarmStart * getWarmStart() const
Get warmstarting information.
virtual void initialSolve()
Solve initial continuous relaxation.
virtual std::vector< double * > getDualRays(int maxNumRays, bool fullRay=false) const
Throws an error.
void setSolver(Ipopt::SmartPtr< TNLPSolver > app)
Set the solver to be used by interface.
virtual bool isProvenOptimal() const
Is optimality proven?
virtual void setRowUpper(int elementIndex, double elementValue)
Set a single row upper bound.
void ignoreFailures()
tell to ignore the failures (don't throw, don't fathom, don't report)
void getOuterApproximation(OsiCuts &cs, int getObj, const double *x2, bool global)
Get the outer approximation constraints at the current optimal point.
void setSolverOutputToDefault()
virtual bool isAbandoned() const
Are there a numerical difficulties?
void initialize(Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions, Ipopt::SmartPtr< Ipopt::OptionsList > options, Ipopt::SmartPtr< Ipopt::Journalist > journalist, Ipopt::SmartPtr< TMINLP > tminlp)
Facilitator to initialize interface.
virtual void setColLower(int elementIndex, double elementValue)
Set a single column lower bound.
virtual void setContinuous(int index)
Set the index-th variable to be a continuous variable.
OsiTMINLPInterface()
Default Constructor.
void continuingOnAFailure()
Warn solver that branch-and-bound is continuing after a failure.
virtual void setRowPrice(const double *rowprice)
Set dual solution variable values.
virtual void loadProblem(const CoinPackedMatrix &matrix, const double *collb, const double *colub, const double *obj, const double *rowlb, const double *rowub)
We have to keep this but it will throw an error.
virtual bool isDualObjectiveLimitReached() const
Is the given dual objective limit reached?
virtual void loadProblem(const CoinPackedMatrix &matrix, const double *collb, const double *colub, const double *obj, const char *rowsen, const double *rowrhs, const double *rowrng)
We have to keep this but it will throw an error.
void getOuterApproximation(OsiCuts &cs, const double *x, int getObj, const double *x2, bool global)
Get the outer approximation constraints at provided point.
virtual void setObjCoeff(int elementIndex, double elementValue)
We have to keep this but it will throw an error.
OsiSolverInterface * clone(bool copyData=true) const
Virtual copy constructor.
virtual void setColUpper(int elementIndex, double elementValue)
Set a single column upper bound.
virtual bool isIterationLimitReached() const
Iteration limit reached?
virtual double getObjValue() const
Get objective function value (can't use default)
virtual const double * getRowActivity() const
Get pointer to array[getNumRows()] of row activity levels (constraint matrix times the solution vecto...
void setNewCutoffDecr(double d)
virtual void setRowLower(int elementIndex, double elementValue)
Set a single row lower bound.
virtual bool setWarmStart(const CoinWarmStart *warmstart)
Set warmstarting information.
virtual const double * getRowLower() const
Get pointer to array[getNumRows()] of row lower bounds.
void readOptionFile(const std::string &fileName)
Read parameter file.
double getNewCutoffDecr()
TNLPSolver::UnsolvedError * newUnsolvedError(int num, Ipopt::SmartPtr< TMINLP2TNLP > problem, std::string name)
void getBendersCut(OsiCuts &cs, bool global)
Get a benders cut from solution.
OsiTMINLPInterface(const OsiTMINLPInterface &)
Copy constructor.
virtual void setRowType(int index, char sense, double rightHandSide, double range)
Set the type of a single row.
double getPushFact() const
WarmStartModes getWarmStartMode()
virtual std::vector< double * > getPrimalRays(int maxNumRays) const
Throws an error.
virtual void addObjectiveFunction(OsiSolverInterface &si, const double *x)
Add constraint corresponding to objective function.
virtual const double * getColSolution() const
Get pointer to array[getNumCols()] of primal solution vector.
virtual void loadProblem(const int numcols, const int numrows, const int *start, const int *index, const double *value, const double *collb, const double *colub, const double *obj, const double *rowlb, const double *rowub)
We have to keep this but it will throw an error.
OsiTMINLPInterface & operator=(const OsiTMINLPInterface &rhs)
Assignment operator.
virtual bool isInteger(int columnNumber) const
Return true if column is integer.
virtual bool isBinary(int columnNumber) const
Return true if column is binary.
const char * prefix() const
virtual void deleteCols(const int num, const int *colIndices)
We have to keep this but it will throw an error.
const Ipopt::SmartPtr< Ipopt::OptionsList > options() const
Retrieve OsiTMINLPApplication option list.
void setWarmStartMode(int mode)
virtual CoinWarmStart * getEmptyWarmStart() const
Get an empty warm start object.
virtual const double * getReducedCost() const
Get a pointer to array[getNumCols()] of reduced costs.
virtual bool basisIsAvailable() const
virtual void setColLower(const double *array)
Set the lower bounds for all columns array [getNumCols()] is an array of values for the objective.
bool getDblParam(OsiDblParam key, double &value) const
virtual void resolveForCost(int numretry, bool keepWs)
Resolve the problem with different random starting points to try to find a better solution (only make...
virtual int getNumElements() const
Cbc will understand that no matrix exsits if return -1.
virtual void deleteRows(const int num, const int *rowIndices)
We have to keep this but it will throw an error.
const double * getDownPsCosts() const
virtual int getIterationCount() const
Get how many iterations it took to solve the problem (whatever "iteration" mean to the solver.
const OsiSolverInterface::OsiNameVec & getVarNames()
get name of variables
bool setDblParam(OsiDblParam key, double value)
virtual void assignProblem(CoinPackedMatrix *&matrix, double *&collb, double *&colub, double *&obj, double *&rowlb, double *&rowub)
We have to keep this but it will throw an error.
const TMINLP2TNLP * problem() const
get pointer to the TMINLP2TNLP adapter
virtual void addRow(const CoinPackedVectorBase &vec, const char rowsen, const double rowrhs, const double rowrng)
We have to keep this but it will throw an error.
int totalIterations()
get total number of iterations
virtual void branchAndBound()
Nescessary for compatibility with OsiSolverInterface but does nothing.
virtual const double * getRowUpper() const
Get pointer to array[getNumRows()] of row upper bounds.
virtual double getInfinity() const
Get solver's value for infinity.
virtual void setColUpper(const double *array)
Set the upper bounds for all columns array [getNumCols()] is an array of values for the objective.
virtual void assignProblem(CoinPackedMatrix *&matrix, double *&collb, double *&colub, double *&obj, char *&rowsen, double *&rowrhs, double *&rowrng)
We have to keep this but it will throw an error.
virtual bool isProvenPrimalInfeasible() const
Is primal infeasiblity proven?
void forceInfeasible()
Force current solution to be infeasible.
virtual void initialSolve(const char *whereFrom)
Solve initial continuous relaxation (precising from where)
virtual double getObjSense() const
Get objective function sense (1 for min (default), -1 for max) Always minimizes.
virtual const CoinPackedMatrix * getMatrixByCol() const
We have to keep this but it will return NULL.
void setModel(Ipopt::SmartPtr< TMINLP > tminlp)
Set the model to be solved by interface.
virtual const double * getRowRange() const
Get pointer to array[getNumRows()] of row ranges.
virtual int getNumRows() const
Get number of rows.
bool getStrParam(OsiStrParam key, std::string &value) const
void randomStartingPoint()
virtual void getOuterApproximation(OsiCuts &cs, const double *x, int getObj, const double *x2, double theta, bool global)
Get the outer approximation constraints at provided point.
bool hasContinuedOnAFailure()
Did we continue on a failure.
const TMINLP * model() const
void getConstraintOuterApproximation(OsiCuts &cs, int constraintNumber, const double *x2, bool global)
Get the outer approximation at current optimal point for given constraint.
virtual bool isProvenDualInfeasible() const
Is dual infeasiblity proven?
virtual const double * getColUpper() const
Get pointer to array[getNumCols()] of column upper bounds.
This is an adapter class that converts a TMINLP to a TNLP to be solved by Ipopt.
Base class for all MINLPs that use a standard triplet matrix form and dense vectors.
We will throw this error when a problem is not solved.
This is a generic class for calling an NLP solver to solve a TNLP.
ReturnStatus
Standard return statuses for a solver.
const std::string & methodName() const
const std::string & message() const
CoinMessageHandler & operator=(const CoinMessageHandler &)
CoinMessageHandler & message(int messageNumber, const CoinMessages &messages)
virtual void unmarkHotStart()
OsiObject ** objects() const
CoinMessageHandler * messageHandler() const
virtual void applyRowCuts(int numberCuts, const OsiRowCut *cuts)
virtual void applyColCut(const OsiColCut &cc)=0
virtual ApplyCutsReturnCode applyCuts(const OsiCuts &cs, double effectivenessLb=0.0)
virtual void markHotStart()
virtual void applyRowCut(const OsiRowCut &rc)=0
virtual void solveFromHotStart()
std::vector< std::string > OsiNameVec
(C) Copyright International Business Machines Corporation 2007
Solver
Solvers for solving nonlinear programs.
@ EFilterSQP
filterSQP Sequential Quadratic Programming algorithm.
bool IsValid(const SmartPtr< U > &smart_ptr)
U * GetRawPtr(const SmartPtr< U > &smart_ptr)
Stores branching priorities information.
int * branchingDirections
User set preferered branching direction.
double * downPsCosts
User set down pseudo costs.
int * priorities
User set priorities on variables.
double * upPsCosts
User set up pseudo costs.