Models a simple linear problem and optimizes it with GLPK. If the is feasible, prints the primal and dual solution. If the model is infeasible, prints a Farkas certificate (dual ray). If the model is unbounded, prints a primal ray.
The LP model is taken from "Model building in Mathematical Programming" by H. Paul Williams and is given by
\[
    \begin{align*}
        \min_{x,y} \quad & 3x + 2y \\
        \text{s.t.} \quad & x + y \le 4, \\
        & 2x + y \le 5, \\
        & -x + 4y \ge 2, \\
        & x,y \ge 0.
    \end{align*}
\]
#include <iostream>
#include "idol/modeling.h"
#include "idol/mixed-integer/optimizers/wrappers/GLPK/GLPK.h"
 
using namespace idol;
 
int main(int t_argc, const char** t_argv) {
 
    
 
    
 
    
    const auto x = model.add_var(0, Inf, Continuous, 3, "x");
    const auto y = model.add_var(0, Inf, Continuous, 2, "y");
 
    
    const auto c1 = model.add_ctr(x + y <= 4);
    const auto c2 = model.add_ctr(2 * x + y <= 5);
    const auto c3 = model.add_ctr(-x + 4 * y >= 2);
 
    
 
    
    model.optimize();
 
    
    const auto status = model.get_status();
    const auto reason = model.get_reason();
 
    std::cout << "Solution status: " << status << std::endl;
    std::cout << "Reason: " << reason << std::endl;
 
    if (status == Optimal || status == Feasible) {
 
        std::cout << "Primal solution:\n";
        for (const auto& var : model.vars()) {
            std::cout << var.name() << " = " << model.get_var_primal(var) << std::endl;
        }
 
        std::cout << "Dual solution:\n";
        for (const auto& ctr : model.ctrs()) {
            std::cout << ctr.name() << " = " << model.get_ctr_dual(ctr) << std::endl;
        }
 
    } else if (status == Infeasible) {
 
        std::cout << "Farkas certificate:\n";
        for (const auto& ctr : model.ctrs()) {
            std::cout << ctr.name() << " = " << model.get_ctr_farkas(ctr) << std::endl;
        }
 
    } else if (status == Unbounded) {
 
        std::cout << "Primal ray:\n";
        for (const auto& var : model.vars()) {
            std::cout << var.name() << " = " << model.get_var_ray(var) << std::endl;
        }
 
    }
 
    return 0;
}