5#ifndef IDOL_IMPL_MIBS_FROM_API_H
6#define IDOL_IMPL_MIBS_FROM_API_H
8#include "idol/mixed-integer/modeling/models/Model.h"
9#include "idol/bilevel/modeling/Description.h"
11#include "idol/mixed-integer/optimizers/callbacks/Callback.h"
17class idol::impl::MibSFromAPI :
public idol::impl::MibS {
18 const idol::Model& m_model;
19 const idol::Bilevel::Description& m_description;
20 const std::list<std::unique_ptr<Callback>>& m_callbacks;
22 const std::string m_native_feasibility_checker;
23 const bool m_use_native_feasibility_checker;
25 void* m_mibs =
nullptr;
26 void* m_broker =
nullptr;
27 void* m_osi_solver =
nullptr;
29 std::vector<std::vector<unsigned int>> m_ctr_indices_in_mibs;
30 unsigned int m_n_ctr_in_mibs = 0;
32 static char to_mibs_type(VarType t_type);
34 void load_auxiliary_data();
35 std::pair<std::vector<int>, std::vector<int>> dispatch_variable_indices();
36 std::pair<std::vector<int>, std::vector<int>> dispatch_constraint_indices();
37 std::vector<double> find_lower_level_objective_coefficients(
const std::vector<int>& t_lower_level_variables_indices);
38 std::pair<std::vector<double>, std::vector<double>> find_lower_level_bounds(
const std::vector<int>& t_lower_level_variables_indices);
40 void load_problem_data();
41 std::tuple<std::vector<double>, std::vector<double>, std::vector<char>> parse_variables();
42 std::tuple<std::vector<double>, std::vector<double>, std::vector<char>> parse_constraints();
44 std::vector<double> parse_objective();
46 MibSFromAPI(
const idol::Model& t_model,
47 const idol::Bilevel::Description& t_description,
48 const std::list<std::unique_ptr<Callback>>& t_callbacks,
49 std::string t_native_feasibility_checker,
50 OptimizerFactory* t_optimizer_factory,
53 ~MibSFromAPI()
override;
55 void solve()
override;
57 [[nodiscard]]
double get_best_obj()
const override;
59 [[nodiscard]]
double get_best_bound()
const override;
61 [[nodiscard]]
double get_var_primal(
const Var& t_var)
const override;
63 [[nodiscard]] idol::SolutionStatus get_status()
const override;
65 [[nodiscard]] idol::SolutionReason get_reason()
const override;