+ xbt_mallocator_t variable_mallocator_ =
+ xbt_mallocator_new(65536, System::variable_mallocator_new_f, System::variable_mallocator_free_f, nullptr);
+};
+
+class XBT_PUBLIC FairBottleneck : public System {
+public:
+ explicit FairBottleneck(bool selective_update) : System(selective_update) {}
+ void solve() final { bottleneck_solve(); }
+
+private:
+ void bottleneck_solve();
+};
+
+class XBT_PUBLIC Lagrange : public System {
+public:
+ explicit Lagrange(bool selective_update) : System(selective_update) {}
+ void solve() final { lagrange_solve(); }
+
+ static void set_default_protocol_function(double (*func_f)(const Variable& var, double x),
+ double (*func_fp)(const Variable& var, double x),
+ double (*func_fpi)(const Variable& var, double x));
+
+private:
+ void lagrange_solve();
+
+ bool check_feasible(bool warn);
+ double dual_objective();
+
+ static double (*func_f)(const Variable& var, double x); /* (f) */
+ static double (*func_fp)(const Variable& var, double x); /* (f') */
+ static double (*func_fpi)(const Variable& var, double x); /* (f')^{-1} */
+
+ /*
+ * Local prototypes to implement the Lagrangian optimization with optimal step, also called dichotomy.
+ */
+ // computes the value of the dichotomy using a initial values, init, with a specific variable or constraint
+ static double dichotomy(double init, double diff(double, const Constraint&), const Constraint& cnst,
+ double min_error);
+ // computes the value of the differential of constraint cnst applied to lambda
+ static double partial_diff_lambda(double lambda, const Constraint& cnst);
+
+ static double new_value(const Variable& var);
+ static double new_mu(const Variable& var);