1#ifndef LP_CPLEX_SOLVER_INTERFACE_H
2#define LP_CPLEX_SOLVER_INTERFACE_H
4#include "downward/lp/lp_solver.h"
5#include "downward/lp/solver_interface.h"
7#include "downward/algorithms/named_vector.h"
8#include "downward/utils/memory.h"
17static T* to_cplex_array(std::vector<T>& v)
32class CplexSolverInterface :
public SolverInterface {
36 int num_permanent_constraints;
53 int num_unsatisfiable_constraints;
54 int num_unsatisfiable_temp_constraints;
70 std::vector<double> coefficients;
81 std::vector<int> indices;
87 std::vector<int> starts;
93 std::vector<int> counts;
100 void assign_column_by_column(
101 std::span<const LPConstraint> constraints,
109 void assign_row_by_row(std::span<const LPConstraint> constraints);
111 double* get_coefficients() {
return to_cplex_array(coefficients); }
112 int* get_indices() {
return to_cplex_array(indices); }
113 int* get_starts() {
return to_cplex_array(starts); }
114 int* get_counts() {
return to_cplex_array(counts); }
115 int get_num_nonzeros() {
return coefficients.size(); }
118 class CplexColumnsInfo {
120 std::vector<double> lb;
122 std::vector<double> ub;
124 std::vector<char> type;
126 std::vector<double> objective;
129 void assign(
const named_vector::NamedVector<LPVariable>& variables);
130 double* get_lb() {
return to_cplex_array(lb); }
131 double* get_ub() {
return to_cplex_array(ub); }
132 char* get_type() {
return to_cplex_array(type); }
133 double* get_objective() {
return to_cplex_array(objective); }
136 class CplexRowsInfo {
138 std::vector<double> rhs;
140 std::vector<char> sense;
145 std::vector<double> range_values;
150 std::vector<int> range_indices;
154 std::span<const LPConstraint> constraints,
156 bool dense_range_values =
true);
157 double* get_rhs() {
return to_cplex_array(rhs); }
158 char* get_sense() {
return to_cplex_array(sense); }
159 double* get_range_values() {
return to_cplex_array(range_values); }
160 int* get_range_indices() {
return to_cplex_array(range_indices); }
161 int get_num_ranged_rows() {
return range_indices.size(); }
164 class CplexNameData {
165 std::vector<char*> names;
166 std::vector<int> indices;
169 template <
typename T>
170 explicit CplexNameData(
const named_vector::NamedVector<T>& values)
172 if (values.has_names()) {
173 names.reserve(values.size());
174 indices.reserve(values.size());
175 int num_values = values.size();
176 for (
int i = 0; i < num_values; ++i) {
177 const std::string& name = values.get_name(i);
181 names.push_back(
const_cast<char*
>(name.data()));
182 indices.push_back(i);
188 int size() {
return names.size(); }
191 if (indices.empty()) {
194 return indices.data();
214 CplexColumnsInfo columns;
216 std::vector<int> objective_indices;
227 std::vector<double> constraint_lower_bounds;
228 std::vector<double> constraint_upper_bounds;
230 bool is_trivially_unsolvable()
const;
231 void change_constraint_bounds(
int index,
double lb,
double ub);
234 CplexSolverInterface();
235 virtual ~CplexSolverInterface()
override;
237 virtual void load_problem(
const LinearProgram& lp)
override;
238 virtual void add_temporary_constraints(
239 const named_vector::NamedVector<LPConstraint>& constraints)
override;
240 virtual void clear_temporary_constraints()
override;
241 virtual double get_infinity()
const override;
242 virtual void set_objective_coefficients(
243 const std::vector<double>& coefficients)
override;
245 set_objective_coefficient(
int index,
double coefficient)
override;
246 virtual void set_constraint_lower_bound(
int index,
double bound)
override;
247 virtual void set_constraint_upper_bound(
int index,
double bound)
override;
248 virtual void set_variable_lower_bound(
int index,
double bound)
override;
249 virtual void set_variable_upper_bound(
int index,
double bound)
override;
250 virtual void set_mip_gap(
double gap)
override;
251 virtual void solve()
override;
252 virtual void write_lp(
const std::string& filename)
const override;
253 virtual void print_failure_analysis()
const override;
254 virtual bool is_infeasible()
const override;
255 virtual bool is_unbounded()
const override;
256 virtual bool has_optimal_solution()
const override;
257 virtual double get_objective_value()
const override;
258 virtual std::vector<double> extract_solution()
const override;
259 virtual int get_num_variables()
const override;
260 virtual int get_num_constraints()
const override;
261 virtual bool has_temporary_constraints()
const override;
262 virtual void print_statistics()
const override;
264 virtual std::vector<double> extract_dual_solution()
const override;
266 virtual void add_variable(
267 const LPVariable& var,
268 const std::vector<int>& ids,
269 const std::vector<double>& coefs,
270 std::string_view name =
"")
override;
273 add_constraint(
const LPConstraint& constraint, std::string_view name =
"")