Loading...
Searching...
No Matches
OsiIdolSolverInterface.h
1//
2// Created by henri on 05.02.24.
3//
4
5#ifndef IDOL_OSIIDOLSOLVERINTERFACE_H
6#define IDOL_OSIIDOLSOLVERINTERFACE_H
7
8#ifdef IDOL_USE_OSI
9
10#include <OsiSolverInterface.hpp>
11#include "idol/mixed-integer/modeling/models/Model.h"
12
13class OsiIdolSolverInterface : public OsiSolverInterface {
14 idol::Model* m_model = nullptr;
15 const bool m_model_has_to_be_destroy;
16 std::list<std::pair<idol::Var, idol::VarType>> m_relaxed_variables;
17 std::vector<int> m_variable_indices_in_mibs;
18 std::vector<int> m_constraint_indices_in_mibs;
19 //double m_objective_sense = 1.; // 1. is minimization, -1. is maximization.
20 std::unique_ptr<idol::OptimizerFactory> m_optimizer;
21
22 mutable double* m_col_lower = nullptr;
23 mutable double* m_col_upper = nullptr;
24 mutable double* m_col_obj = nullptr;
25 mutable char* m_row_sense = nullptr;
26 mutable double* m_row_rhs = nullptr;
27 mutable double* m_row_range = nullptr;
28 mutable double *m_row_lower = nullptr;
29 mutable double *m_row_upper = nullptr;
30 mutable CoinPackedMatrix *m_matrix_by_row = nullptr;
31 mutable CoinPackedMatrix *m_matrix_by_col = nullptr;
32 mutable double *m_col_solution = nullptr;
33 mutable double *m_row_price = nullptr;
34 mutable double* m_reduced_cost = nullptr;
35 mutable double* m_row_activity = nullptr;
36
37 void relax();
38 void unrelax();
39public:
40 OsiIdolSolverInterface(idol::Env& t_env, const idol::OptimizerFactory& t_optimizer);
41 OsiIdolSolverInterface(idol::Model& t_model);
42
43 ~OsiIdolSolverInterface() override;
44
45 //OsiIdolSolverInterface(const OsiIdolSolverInterface& t_src);
46
47 void set_optimizer_if_not_exists();
48
49 void initialSolve() override;
50 void resolve() override;
51 void branchAndBound() override;
52 bool isAbandoned() const override;
53 bool isProvenOptimal() const override;
54 bool isProvenPrimalInfeasible() const override;
55 bool isProvenDualInfeasible() const override;
56 bool isIterationLimitReached() const override;
57 CoinWarmStart *getEmptyWarmStart() const override;
58 CoinWarmStart *getWarmStart() const override;
59 bool setWarmStart(const CoinWarmStart *warmstart) override;
60 int getNumCols() const override;
61 int getNumRows() const override;
62 CoinBigIndex getNumElements() const override;
63 const double *getColLower() const override;
64 const double *getColUpper() const override;
65 const char *getRowSense() const override;
66 const double *getRightHandSide() const override;
67 const double *getRowRange() const override;
68 const double *getRowLower() const override;
69 const double *getRowUpper() const override;
70 const double *getObjCoefficients() const override;
71 double getObjSense() const override;
72 bool isContinuous(int colIndex) const override;
73 const CoinPackedMatrix *getMatrixByRow() const override;
74 const CoinPackedMatrix *getMatrixByCol() const override;
75 double getInfinity() const override;
76 const double *getColSolution() const override;
77 const double *getRowPrice() const override;
78 const double *getReducedCost() const override;
79 const double *getRowActivity() const override;
80 double getObjValue() const override;
81 int getIterationCount() const override;
82 std::vector<double *> getDualRays(int maxNumRays, bool fullRay) const override;
83 std::vector<double *> getPrimalRays(int maxNumRays) const override;
84 void setObjCoeff(int elementIndex, double elementValue) override;
85 void setObjSense(double s) override;
86 void setColLower(int elementIndex, double elementValue) override;
87 void setColUpper(int elementIndex, double elementValue) override;
88 void setRowLower(int elementIndex, double elementValue) override;
89 void setRowUpper(int elementIndex, double elementValue) override;
90 void setRowType(int index, char sense, double rightHandSide, double range) override;
91 void setColSolution(const double *colsol) override;
92 void setRowPrice(const double *rowprice) override;
93 void setContinuous(int index) override;
94 void setInteger(int index) override;
95 void addCol(const CoinPackedVectorBase &vec, const double collb, const double colub, const double obj) override;
96 void deleteCols(const int num, const int *colIndices) override;
97 void addRow(const CoinPackedVectorBase &vec, const double rowlb, const double rowub) override;
98 void addRow(const CoinPackedVectorBase &vec, const char rowsen, const double rowrhs, const double rowrng) override;
99 void loadProblem(const CoinPackedMatrix &matrix, const double *collb, const double *colub, const double *obj,
100 const double *rowlb, const double *rowub) override;
101 void assignProblem(CoinPackedMatrix *&matrix, double *&collb, double *&colub, double *&obj, double *&rowlb,
102 double *&rowub) override;
103 void loadProblem(const CoinPackedMatrix &matrix, const double *collb, const double *colub, const double *obj,
104 const char *rowsen, const double *rowrhs, const double *rowrng) override;
105 void assignProblem(CoinPackedMatrix *&matrix, double *&collb, double *&colub, double *&obj, char *&rowsen,
106 double *&rowrhs, double *&rowrng) override;
107 void
108 loadProblem(const int numcols, const int numrows, const CoinBigIndex *start, const int *index, const double *value,
109 const double *collb, const double *colub, const double *obj, const double *rowlb,
110 const double *rowub) override;
111 void
112 loadProblem(const int numcols, const int numrows, const CoinBigIndex *start, const int *index, const double *value,
113 const double *collb, const double *colub, const double *obj, const char *rowsen, const double *rowrhs,
114 const double *rowrng) override;
115 void writeMps(const char *filename, const char *extension, double objSense) const override;
116 void writeLp(const char *filename,
117 const char *extension = "lp",
118 double epsilon = 1e-5,
119 int numberAcross = 10,
120 int decimals = 9,
121 double objSense = 0.0,
122 bool useRowNames = true) const override;
123 OsiSolverInterface *clone(bool copyData = true) const override;
124 void deleteRows(const int num, const int *rowIndices) override;
125protected:
126 void applyRowCut(const OsiRowCut &rc) override;
127 void applyColCut(const OsiColCut &cc) override;
128};
129
130#endif
131
132#endif //IDOL_OSIIDOLSOLVERINTERFACE_H