MAiNGO
lbpClp.h
Go to the documentation of this file.
1 /**********************************************************************************
2  * Copyright (c) 2019 Process Systems Engineering (AVT.SVT), RWTH Aachen University
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License 2.0 which is available at
6  * http://www.eclipse.org/legal/epl-2.0.
7  *
8  * SPDX-License-Identifier: EPL-2.0
9  *
10  * @file lbpClp.h
11  *
12  * @brief File containing declaration of lbpClp class used for solving the
13  * lower bounding problems.
14  *
15  **********************************************************************************/
16 
17 #pragma once
18 
19 #include "lbp.h"
20 
21 #include "ClpFactorization.hpp"
22 #include "ClpNetworkMatrix.hpp"
23 #include "ClpSimplex.hpp"
24 
25 
26 namespace maingo {
27 
28 
29 namespace lbp {
30 
31 
39 class LbpClp: public LowerBoundingSolver {
40 
41  public:
58  LbpClp(mc::FFGraph &DAG, const std::vector<mc::FFVar> &DAGvars, const std::vector<mc::FFVar> &DAGfunctions,
59  const std::vector<babBase::OptimizationVariable> &variables, const unsigned nineqIn, const unsigned neqIn,
60  const unsigned nineqRelaxationOnlyIn, const unsigned neqRelaxationOnlyIn, const unsigned nineqSquashIn,
61  Settings *settingsIn, Logger *loggerIn, std::vector<Constraint> *constraintPropertiesIn);
62 
66  ~LbpClp();
67 
71  void activate_more_scaling();
72 
73  protected:
80  void _set_variable_bounds(const std::vector<double> &lowerVarBounds, const std::vector<double> &upperVarBounds);
81 
92  void _update_LP_obj(const MC &resultRelaxation, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
93  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iObj);
94 
105  void _update_LP_ineq(const MC &resultRelaxation, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
106  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iIneq);
107 
119  void _update_LP_eq(const MC &resultRelaxationCv, const MC &resultRelaxationCc, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
120  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iEq);
121 
132  void _update_LP_ineqRelaxationOnly(const MC &resultRelaxation, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
133  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iIneqRelaxationOnly);
134 
146  void _update_LP_eqRelaxationOnly(const MC &resultRelaxationCv, const MC &resultRelaxationCc, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
147  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iEqRelaxationOnly);
148 
160  void _update_LP_ineq_squash(const MC &resultRelaxation, const std::vector<double> &linearizationPoint, const std::vector<double> &lowerVarBounds,
161  const std::vector<double> &upperVarBounds, unsigned const &iLin, unsigned const &iIneqSquash);
162 
172  void _update_LP_obj(const vMC &resultRelaxationVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
173  const std::vector<double> &upperVarBounds, unsigned const &iObj);
174 
184  void _update_LP_ineq(const vMC &resultRelaxationVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
185  const std::vector<double> &upperVarBounds, unsigned const &iIneq);
186 
197  void _update_LP_eq(const vMC &resultRelaxationCvVMC, const vMC &resultRelaxationCcVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
198  const std::vector<double> &upperVarBounds, unsigned const &iEq);
199 
209  void _update_LP_ineqRelaxationOnly(const vMC &resultRelaxationVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
210  const std::vector<double> &upperVarBounds, unsigned const &iIneqRelaxationOnly);
211 
222  void _update_LP_eqRelaxationOnly(const vMC &resultRelaxationCvVMC, const vMC &resultRelaxationCcVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
223  const std::vector<double> &upperVarBounds, unsigned const &iEqRelaxationOnly);
224 
235  void _update_LP_ineq_squash(const vMC &resultRelaxationVMC, const std::vector<std::vector<double>> &linearizationPoint, const std::vector<double> &lowerVarBounds,
236  const std::vector<double> &upperVarBounds, unsigned const &iIneqSquash);
242  void _solve_LP(const babBase::BabNode &currentNode);
243 
250 
257  void _get_solution_point(std::vector<double> &solution, double &etaVal);
258 
265 
271  void _get_multipliers(std::vector<double> &multipliers);
272 
277 
285  void _modify_LP_for_feasopt_OBBT(const double &currentUBD, std::list<unsigned> &toTreatMax, std::list<unsigned> &toTreatMin);
286 
293  void _set_optimization_sense_of_variable(const unsigned &iVar, const int &optimizationSense);
294 
301  void _fix_variable(const unsigned &iVar, const bool fixToLowerBound);
302 
307 
314 
319 
320 #ifdef LP__OPTIMALITY_CHECK
321 
328 
335  SUBSOLVER_RETCODE _check_feasibility(const std::vector<double> &solution);
336 
347  SUBSOLVER_RETCODE _check_optimality(const babBase::BabNode &currentNode, const double newLBD, const std::vector<double> &solution, const double etaVal, const std::vector<double> &multipliers);
348 
349 #endif
350 
351 #ifdef LP__WRITE_CHECK_FILES
352 
357  virtual void _write_LP_to_file(std::string &fileName);
358 #endif
359 
360  private:
364  void _terminate_Clp();
365 
369  void _initialize_matrix();
370 
376  ClpSimplex _clp;
377  CoinPackedMatrix _matrix;
379  unsigned _numrows;
380  unsigned _numcolumns;
382  double *_objective;
383  double *_lowerRowBounds;
384  double *_upperRowBounds;
386  double _eta;
387  double _etaCoeff;
389 #ifdef LP__OPTIMALITY_CHECK
390  std::vector<std::vector<double>> _dualValsObj;
391  std::vector<std::vector<double>> _dualValsIneq;
392  std::vector<std::vector<double>> _dualValsEq1;
393  std::vector<std::vector<double>> _dualValsEq2;
394  std::vector<std::vector<double>> _dualValsIneqRelaxationOnly;
395  std::vector<std::vector<double>> _dualValsEqRelaxationOnly1;
396  std::vector<std::vector<double>> _dualValsEqRelaxationOnly2;
397  std::vector<std::vector<double>> _dualValsIneqSquash;
398 #endif
399 
400 };
401 
402 
403 } // end of namespace lbp
404 
405 
406 } // end of namespace maingo
LbpClp(mc::FFGraph &DAG, const std::vector< mc::FFVar > &DAGvars, const std::vector< mc::FFVar > &DAGfunctions, const std::vector< babBase::OptimizationVariable > &variables, const unsigned nineqIn, const unsigned neqIn, const unsigned nineqRelaxationOnlyIn, const unsigned neqRelaxationOnlyIn, const unsigned nineqSquashIn, Settings *settingsIn, Logger *loggerIn, std::vector< Constraint > *constraintPropertiesIn)
Constructor, stores information on the problem and initializes the CLP problem and solver instances.
Definition: lbpClp.cpp:29
Wrapper for handling the lower bounding problems as well as optimization-based bounds tightening (OBB...
Definition: lbp.h:60
ClpSimplex _clp
Definition: lbpClp.h:376
double _get_objective_value_solver()
Function returning the objective value of the lastly solved LP.
Definition: lbpClp.cpp:956
std::vector< std::vector< double > > _dualValsEq1
Definition: lbpClp.h:392
Class representing a node in the Branch-and-Bound tree.
Definition: babNode.h:35
std::vector< std::vector< double > > _dualValsIneq
Definition: lbpClp.h:391
void _deactivate_objective_function_for_OBBT()
Function deactivating all objective rows in the LP for feasibility OBBT.
Definition: lbpClp.cpp:985
void _update_LP_ineqRelaxationOnly(const MC &resultRelaxation, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iIneqRelaxationOnly)
Auxiliary function for updating LP relaxation only inequalities, i.e., processing the linearization o...
Definition: lbpClp.cpp:359
CoinPackedMatrix _matrix
Definition: lbpClp.h:377
Struct for storing settings for MAiNGO.
Definition: settings.h:143
void _set_optimization_sense_of_variable(const unsigned &iVar, const int &optimizationSense)
Function for setting the optimization sense of variable iVar in OBBT.
Definition: lbpClp.cpp:1040
std::vector< std::vector< double > > _dualValsIneqSquash
Definition: lbpClp.h:397
mc::vMcCormick< I > vMC
A type definition for a vector McCormick variable.
Definition: intervalLibrary.h:64
void _restore_LP_coefficients_after_OBBT()
Function for restoring proper coefficients and options in the LP after OBBT.
Definition: lbpClp.cpp:1062
std::vector< std::vector< double > > _dualValsObj
Definition: lbpClp.h:390
void activate_more_scaling()
Function called by the B&B solver to heuristically activate more scaling in the LBS.
Definition: lbpClp.cpp:200
void _update_LP_eqRelaxationOnly(const MC &resultRelaxationCv, const MC &resultRelaxationCc, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iEqRelaxationOnly)
Auxiliary function for updating LP relaxation only equalities, i.e., processing the linearization of ...
Definition: lbpClp.cpp:396
std::vector< std::vector< double > > _dualValsEq2
Definition: lbpClp.h:393
std::vector< std::vector< double > > _dualValsEqRelaxationOnly2
Definition: lbpClp.h:396
void _modify_LP_for_feasopt_OBBT(const double &currentUBD, std::list< unsigned > &toTreatMax, std::list< unsigned > &toTreatMin)
Function modifying the LP for feasibility-optimality OBBT.
Definition: lbpClp.cpp:1004
This class contains all logging and output information.
Definition: logger.h:100
double _eta
Definition: lbpClp.h:386
SUBSOLVER_RETCODE _check_optimality(const babBase::BabNode &currentNode, const double newLBD, const std::vector< double > &solution, const double etaVal, const std::vector< double > &multipliers)
Function for checking if the solution point returned by CLP solver is really optimal using strong dua...
void _get_solution_point(std::vector< double > &solution, double &etaVal)
Function for setting the solution to the solution point of the lastly solved LP.
Definition: lbpClp.cpp:933
void _initialize_matrix()
Function for initializing the CLP-internal matrix.
Definition: lbpClp.cpp:138
void _update_LP_eq(const MC &resultRelaxationCv, const MC &resultRelaxationCc, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iEq)
Auxiliary function for updating LP equalities, i.e., processing the linearization of the equality.
Definition: lbpClp.cpp:299
double * _objective
Definition: lbpClp.h:382
void _terminate_Clp()
Function for taking care of memory management by terminating CLP (either called from destructor or wh...
Definition: lbpClp.cpp:1654
void _update_LP_ineq(const MC &resultRelaxation, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iIneq)
Auxiliary function for updating LP inequalities, i.e., processing the linearization of the inequality...
Definition: lbpClp.cpp:262
void _update_LP_ineq_squash(const MC &resultRelaxation, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iIneqSquash)
Auxiliary function for updating LP squash inequalities, i.e., processing the linearization of the squ...
Definition: lbpClp.cpp:460
SUBSOLVER_RETCODE
Enum for representing the return codes returned by the different sub-solvers (UpperBoundingSolver,...
Definition: returnCodes.h:40
namespace holding all essentials of MAiNGO
Definition: aleModel.h:31
mc::McCormick< I > MC
A type definition for a McCormick variable.
Definition: intervalLibrary.h:57
unsigned _numrows
Definition: lbpClp.h:379
void _update_LP_obj(const MC &resultRelaxation, const std::vector< double > &linearizationPoint, const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds, unsigned const &iLin, unsigned const &iObj)
Auxiliary function for updating LP objective, i.e., processing the linearization of the objective fun...
Definition: lbpClp.cpp:224
SUBSOLVER_RETCODE _check_infeasibility(const babBase::BabNode &currentNode)
Function for checking if the solution point returned CLP is really infeasible using Farkas' Lemma.
void _set_variable_bounds(const std::vector< double > &lowerVarBounds, const std::vector< double > &upperVarBounds)
Function for setting the bounds of variables.
Definition: lbpClp.cpp:211
void _solve_LP(const babBase::BabNode &currentNode)
Function for solving the currently constructed linear program.
Definition: lbpClp.cpp:794
double * _upperRowBounds
Definition: lbpClp.h:384
SUBSOLVER_RETCODE _check_feasibility(const std::vector< double > &solution)
Function for checking if the solution point returned by CLP solver is really feasible.
unsigned _numcolumns
Definition: lbpClp.h:380
std::vector< std::vector< double > > _dualValsIneqRelaxationOnly
Definition: lbpClp.h:394
LP_RETCODE
Enum for representing the return codes returned when a linear program is solved.
Definition: returnCodes.h:73
double _etaCoeff
Definition: lbpClp.h:387
double * _lowerRowBounds
Definition: lbpClp.h:383
void _get_multipliers(std::vector< double > &multipliers)
Function for setting the multipliers of the lastly solved LP.
Definition: lbpClp.cpp:965
Wrapper for handling the lower bounding problems by interfacing CLP.
Definition: lbpClp.h:39
~LbpClp()
Destructor.
Definition: lbpClp.cpp:128
bool _check_if_LP_really_infeasible()
Function for checking if the current linear program is really infeasible by, e.g.,...
Definition: lbpClp.cpp:1080
void _fix_variable(const unsigned &iVar, const bool fixToLowerBound)
Function for fixing a variable to one of its bounds.
Definition: lbpClp.cpp:1049
void _turn_off_specific_options()
Function for checking if a specific option has to be turned off for a given lower bounding solver....
Definition: lbpClp.h:318
LP_RETCODE _get_LP_status()
Function returning the current status of the lastly solved linear program.
Definition: lbpClp.cpp:914
std::vector< std::vector< double > > _dualValsEqRelaxationOnly1
Definition: lbpClp.h:395