Skip to content

Commit

Permalink
add direct functions in KKT
Browse files Browse the repository at this point in the history
  • Loading branch information
hlefebvr committed Sep 18, 2024
1 parent 918b389 commit 4d58598
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 13 deletions.
18 changes: 18 additions & 0 deletions examples/bilevel-optimization/KKT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,3 +291,21 @@ void idol::Reformulators::KKT::create_dual_objective() {
}

}

void idol::Reformulators::KKT::add_kkt_reformulation(idol::Model &t_destination) const {
add_primal_variables(t_destination);
add_primal_constraints(t_destination);
add_dual_variables(t_destination);
add_dual_constraints(t_destination);
add_complementarity_constraints(t_destination);
add_leader_objective(t_destination);
}

void idol::Reformulators::KKT::add_strong_duality_reformulation(idol::Model &t_destination) const {
add_primal_variables(t_destination);
add_primal_constraints(t_destination);
add_dual_variables(t_destination);
add_dual_constraints(t_destination);
add_strong_duality_constraint(t_destination);
add_leader_objective(t_destination);
}
3 changes: 3 additions & 0 deletions examples/bilevel-optimization/KKT.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ class idol::Reformulators::KKT {
void add_complementarity_constraints(Model& t_destination) const;
void add_strong_duality_constraint(Model& t_destination) const;
void add_leader_objective(Model& t_destination) const;

void add_kkt_reformulation(Model& t_destination) const;
void add_strong_duality_reformulation(Model& t_destination) const;
};


Expand Down
20 changes: 7 additions & 13 deletions examples/bilevel-optimization/kkt.example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,25 +55,19 @@ int main(int t_argc, const char** t_argv) {
description.make_follower_ctr(follower_c3);
description.make_follower_ctr(follower_c4);

Reformulators::KKT kkt(high_point_relaxation, description);
Reformulators::KKT reformulator(high_point_relaxation, description);

Model reformulation(env);
kkt.add_primal_variables(reformulation);
kkt.add_primal_constraints(reformulation);
kkt.add_dual_variables(reformulation);
kkt.add_dual_constraints(reformulation);
kkt.add_complementarity_constraints(reformulation);
kkt.add_strong_duality_constraint(reformulation);
kkt.add_leader_objective(reformulation);
Model single_level(env);
reformulator.add_kkt_reformulation(single_level);

std::cout << high_point_relaxation << std::endl;
std::cout << reformulation << std::endl;
std::cout << single_level << std::endl;

reformulation.use(Gurobi().with_logs(true).with_presolve(false));
single_level.use(Gurobi());

reformulation.optimize();
single_level.optimize();

std::cout << save_primal(reformulation) << std::endl;
std::cout << save_primal(single_level) << std::endl;

return 0;
}

0 comments on commit 4d58598

Please sign in to comment.