From f72f0bfc26b59d6e1445a45517b89b3a8753000c Mon Sep 17 00:00:00 2001 From: Henri Lefebvre Date: Wed, 18 Sep 2024 13:02:24 +0200 Subject: [PATCH] start example on PADM --- examples/bilevel-optimization/CMakeLists.txt | 6 +-- .../bilevel-optimization/padm.example.cpp | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 examples/bilevel-optimization/padm.example.cpp diff --git a/examples/bilevel-optimization/CMakeLists.txt b/examples/bilevel-optimization/CMakeLists.txt index d7646890..aba4162c 100644 --- a/examples/bilevel-optimization/CMakeLists.txt +++ b/examples/bilevel-optimization/CMakeLists.txt @@ -1,5 +1,3 @@ - add_example(mibs) - -add_executable(example_kkt kkt.example.cpp) -target_link_libraries(example_kkt PRIVATE idol) \ No newline at end of file +add_example(kkt) +add_example(padm) \ No newline at end of file diff --git a/examples/bilevel-optimization/padm.example.cpp b/examples/bilevel-optimization/padm.example.cpp new file mode 100644 index 00000000..2e917e2c --- /dev/null +++ b/examples/bilevel-optimization/padm.example.cpp @@ -0,0 +1,47 @@ +// +// Created by henri on 18.09.24. +// +#include +#include +#include +#include +#include + +int main(int t_argc, const char** t_argv) { + + + using namespace idol; + + Env env; + Model model(env); + const auto x = model.add_var(0, Inf, Continuous, "x"); + const auto y = model.add_var(0, Inf, Continuous, "y"); + const auto delta = model.add_var(-Inf, Inf, Continuous, "delta"); + + model.set_obj_expr(delta * delta); + + auto c = model.add_ctr(x + delta * x + y <= 1); + model.add_ctr(y == 1); + + Bilevel::LowerLevelDescription description(env); + description.make_follower_var(x); + description.make_follower_var(y); + description.make_follower_ctr(c); + description.set_follower_obj_expr(-2 * x - y); + + Model single_level(env); + Reformulators::KKT(model, description).add_strong_duality_reformulation(single_level); + + std::cout << model << std::endl; + std::cout << single_level << std::endl; + + Annotation sub_problem(env, "sub_problem"); + + single_level.use(Gurobi()); + + single_level.optimize(); + + std::cout << save_primal(single_level) << std::endl; + + return 0; +} \ No newline at end of file