/** @{ @ingroup SURF_lmm */
-/**
- * @brief Solve the lmm system
- * @param sys The lmm system to solve
- */
-XBT_PUBLIC void lmm_solve(lmm::System* sys);
-
-XBT_PUBLIC void lagrange_solve(lmm::System* sys);
-XBT_PUBLIC void bottleneck_solve(lmm::System* sys);
-
/** Default functions associated to the chosen protocol. When using the lagrangian approach. */
-XBT_PUBLIC 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));
-
XBT_PUBLIC double func_reno_f(const Variable& var, double x);
XBT_PUBLIC double func_reno_fp(const Variable& var, double x);
XBT_PUBLIC double func_reno_fpi(const Variable& var, double x);
/* \begin{For Lagrange only} */
double mu;
double new_mu;
- double (*func_f)(const Variable& var, double x); /* (f) */
- double (*func_fp)(const Variable& var, double x); /* (f') */
- double (*func_fpi)(const Variable& var, double x); /* (f')^{-1} */
/* \end{For Lagrange only} */
private:
*/
explicit System(bool selective_update);
/** @brief Free an existing Linear MaxMin system */
- ~System();
+ virtual ~System();
/**
* @brief Create a new Linear MaxMin constraint
void print() const;
/** @brief Solve the lmm system */
- void solve();
+ void lmm_solve();
+
+ /** @brief Solve the lmm system. May be specialized in subclasses. */
+ virtual void solve() { lmm_solve(); }
private:
static void* variable_mallocator_new_f();
void remove_all_modified_set();
void check_concurrency() const;
- template <class CnstList> void solve(CnstList& cnst_list);
+ template <class CnstList> void lmm_solve(CnstList& cnst_list);
+
public:
bool modified;
boost::intrusive::list<Variable, boost::intrusive::member_hook<Variable, boost::intrusive::list_member_hook<>,
simgrid::kernel::resource::Action::ModifiedSet* modified_set_ = nullptr;
- void (*solve_fun)(lmm::System* self);
-
private:
bool selective_update_active; /* flag to update partially the system only selecting changed portions */
unsigned visited_counter; /* used by System::update_modified_set() and System::remove_all_modified_set() to
xbt_mallocator_t variable_mallocator;
};
-extern XBT_PRIVATE double (*func_f_def)(const Variable&, double);
-extern XBT_PRIVATE double (*func_fp_def)(const Variable&, double);
-extern XBT_PRIVATE double (*func_fpi_def)(const Variable&, double);
+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);
+};
+
+XBT_PUBLIC System* make_new_maxmin_system(bool selective_update);
+XBT_PUBLIC System* make_new_fair_bottleneck_system(bool selective_update);
+XBT_PUBLIC System* make_new_lagrange_system(bool selective_update);
/** @} */
}