29 const Model& m_primal;
33 std::function<bool(
const Var&)> m_primal_variable_indicator;
34 std::function<bool(
const Ctr&)> m_primal_constraint_indicator;
35 std::function<bool(
const QCtr&)> m_primal_qconstraint_indicator;
38 std::vector<std::optional<Var>> m_dual_variables_for_constraints;
39 std::vector<std::optional<Var>> m_dual_variables_for_qconstraints;
40 std::vector<std::optional<Var>> m_dual_variables_for_lower_bounds;
41 std::vector<std::optional<Var>> m_dual_variables_for_upper_bounds;
42 std::vector<std::optional<std::variant<Ctr, QCtr>>> m_dual_constraints;
44 [[nodiscard]]
bool primal_is_a_linear_problem()
const;
46 void create_dual_variables();
47 [[nodiscard]] std::pair<double, double> bounds_for_dual_variable(idol::CtrType t_type)
const;
48 void create_dual_constraints();
53 KKT(
const Model& t_parent,
55 const std::function<
bool(
const Var&)>& t_primal_variable_indicator = [](
const Var&) {
return true; },
56 const std::function<bool(
const Ctr&)>& t_primal_constraint_indicator = [](
const Ctr&) {
return true; },
57 const std::function<bool(
const QCtr&)>& t_primal_qconstraint_indicator = [](
const QCtr&) {
return true; });
59 explicit KKT(
const Model& t_parent,
60 const std::function<
bool(
const Var&)>& t_primal_variable_indicator = [](
const Var&) {
return true; },
61 const std::function<bool(
const Ctr&)>& t_primal_constraint_indicator = [](
const Ctr&) {
return true; },
62 const std::function<bool(
const QCtr&)>& t_primal_qconstraint_indicator = [](
const QCtr&) {
return true; });
66 void set_prefix(std::string t_prefix) { m_prefix = std::move(t_prefix); }
75 void add_coupling_variables(
Model& t_destination);
76 void add_coupling_constraints(
Model& t_destination);
85 void add_dual_variables(
Model& t_destination);
86 void add_dual_constraints(
Model& t_destination);
87 void add_dual_objective(
Model& t_destination);
95 void add_primal_variables(
idol::Model &t_destination);
96 void add_primal_constraints(
idol::Model &t_destination);
97 void add_primal_objective(
idol::Model &t_destination);
117 [[nodiscard]]
const Var& get_dual_var(
const Ctr& t_ctr)
const;
118 [[nodiscard]]
const Var& get_dual_var_lb(
const Var& t_var)
const;
119 [[nodiscard]]
const Var& get_dual_var_ub(
const Var& t_var)
const;
120 [[nodiscard]]
const std::variant<Ctr, QCtr>& get_dual_ctr(
const Var& t_var)
const;
145 Map<std::string, double> m_ctr_dual;
146 Map<std::string, double> m_ctr_slack;
147 Map<std::string, double> m_var_lb_dual;
148 Map<std::string, double> m_var_lb;
149 Map<std::string, double> m_var_ub_dual;
150 Map<std::string, double> m_var_ub;
152 static void set(Map<std::string, double>& t_map, std::string
const& t_name,
double t_value);
154 double get_ctr_dual_lb(
const Ctr& t_ctr)
override;
155 double get_ctr_dual_ub(
const Ctr& t_ctr)
override;
156 double get_ctr_slack_lb(
const Ctr& t_ctr)
override;
157 double get_ctr_slack_ub(
const Ctr& t_ctr)
override;
158 double get_var_lb_dual_ub(
const Var& t_var)
override;
159 double get_var_ub_dual_lb(
const Var& t_var)
override;
160 double get_var_lb(
const Var& t_var)
override;
161 double get_var_ub(
const Var& t_var)
override;
163 void set_ctr_dual_lb(
const Ctr& t_ctr,
double t_value) { set(m_ctr_dual, t_ctr.
name(), t_value); }
164 void set_ctr_dual_ub(
const Ctr& t_ctr,
double t_value) { set(m_ctr_dual, t_ctr.
name(), t_value); }
165 void set_ctr_slack_lb(
const Ctr& t_ctr,
double t_value) { set(m_ctr_dual, t_ctr.
name(), t_value); }
166 void set_ctr_slack_ub(
const Ctr& t_ctr,
double t_value) { set(m_ctr_dual, t_ctr.
name(), t_value); }
167 void set_var_lb_dual_ub(
const Var& t_var,
double t_value) { set(m_var_lb_dual, t_var.
name(), t_value); }
168 void set_var_ub_dual_lb(
const Var& t_var,
double t_value) { set(m_var_lb_dual, t_var.
name(), t_value); }
169 void set_var_lb(
const Var& t_var,
double t_value) { set(m_var_lb, t_var.
name(), t_value); }
170 void set_var_ub(
const Var& t_var,
double t_value) { set(m_var_lb, t_var.
name(), t_value); }