X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/86e534066dafbcbb2284a75ad76d8258a329d226..52c11fc61cb2dd17d276c67aaaa522085389c39e:/src/kernel/lmm/maxmin.hpp diff --git a/src/kernel/lmm/maxmin.hpp b/src/kernel/lmm/maxmin.hpp index 6c08ad07d6..e67337031e 100644 --- a/src/kernel/lmm/maxmin.hpp +++ b/src/kernel/lmm/maxmin.hpp @@ -6,14 +6,15 @@ #ifndef SURF_MAXMIN_HPP #define SURF_MAXMIN_HPP +#include "simgrid/kernel/resource/Action.hpp" #include "src/internal_config.h" -#include "src/kernel/resource/Action.hpp" #include "src/surf/surf_interface.hpp" #include "surf/surf.hpp" #include "xbt/asserts.h" #include "xbt/mallocator.h" #include "xbt/misc.h" #include "xbt/utility.hpp" + #include #include #include @@ -134,33 +135,23 @@ namespace lmm { /** @{ @ingroup SURF_lmm */ -/** - * @brief Solve the lmm system - * @param sys The lmm system to solve - */ -XBT_PUBLIC(void) lmm_solve(lmm_system_t sys); - -XBT_PUBLIC(void) lagrange_solve(lmm_system_t sys); -XBT_PUBLIC(void) bottleneck_solve(lmm_system_t 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 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); +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); -XBT_PUBLIC(double) func_reno2_f(const Variable& var, double x); -XBT_PUBLIC(double) func_reno2_fp(const Variable& var, double x); -XBT_PUBLIC(double) func_reno2_fpi(const Variable& var, double x); +XBT_PUBLIC double func_reno2_f(const Variable& var, double x); +XBT_PUBLIC double func_reno2_fp(const Variable& var, double x); +XBT_PUBLIC double func_reno2_fpi(const Variable& var, double x); -XBT_PUBLIC(double) func_vegas_f(const Variable& var, double x); -XBT_PUBLIC(double) func_vegas_fp(const Variable& var, double x); -XBT_PUBLIC(double) func_vegas_fpi(const Variable& var, double x); +XBT_PUBLIC double func_vegas_f(const Variable& var, double x); +XBT_PUBLIC double func_vegas_fp(const Variable& var, double x); +XBT_PUBLIC double func_vegas_fpi(const Variable& var, double x); /** * @brief LMM element @@ -169,8 +160,7 @@ XBT_PUBLIC(double) func_vegas_fpi(const Variable& var, double x); * Then, it is used to list all variables involved in constraint through constraint's xxx_element_set lists, or * vice-versa list all constraints for a given variable. */ -XBT_PUBLIC_CLASS Element -{ +class XBT_PUBLIC Element { public: int get_concurrency() const; void decrease_concurrency(); @@ -207,8 +197,7 @@ struct ConstraintLight { * \li Active elements which variable's weight is non-zero (i.e. it is enabled) AND its element value is non-zero. * LMM_solve iterates over active elements during resolution, dynamically making them active or unactive. */ -XBT_PUBLIC_CLASS Constraint -{ +class XBT_PUBLIC Constraint { public: Constraint() = delete; Constraint(void* id_value, double bound_value); @@ -334,10 +323,9 @@ private: * When something prevents us from enabling a variable, we "stage" the weight that we would have like to set, so that as * soon as possible we enable the variable with desired weight */ -XBT_PUBLIC_CLASS Variable -{ +class XBT_PUBLIC Variable { public: - void initialize(simgrid::surf::Action* id_value, double sharing_weight_value, double bound_value, + void initialize(simgrid::kernel::resource::Action * id_value, double sharing_weight_value, double bound_value, int number_of_constraints, unsigned visited_value); /** @@ -382,7 +370,7 @@ public: * @brief Get the data associated to a variable * @return The data associated to the variable */ - simgrid::surf::Action* get_id() const { return id; } + simgrid::kernel::resource::Action* get_id() const { return id; } /** * @brief Get the weight of a variable @@ -415,7 +403,7 @@ public: double bound; double value; short int concurrency_share; /* The maximum number of elements that variable will add to a constraint */ - simgrid::surf::Action* id; + simgrid::kernel::resource::Action* id; int id_int; unsigned visited; /* used by System::update_modified_set() */ /* \begin{For Lagrange only} */ @@ -443,8 +431,7 @@ inline void Element::make_inactive() /** * @brief LMM system */ -XBT_PUBLIC_CLASS System -{ +class XBT_PUBLIC System { public: /** * @brief Create a new Linear MaxMim system @@ -452,7 +439,7 @@ public: */ explicit System(bool selective_update); /** @brief Free an existing Linear MaxMin system */ - ~System(); + virtual ~System(); /** * @brief Create a new Linear MaxMin constraint @@ -468,7 +455,8 @@ public: * @param bound The maximum value of the variable (-1.0 if no maximum value) * @param number_of_constraints The maximum number of constraint to associate to the variable */ - Variable* variable_new(simgrid::surf::Action * id, double weight_value, double bound, int number_of_constraints); + Variable* variable_new(simgrid::kernel::resource::Action * id, double weight_value, double bound, + int number_of_constraints); /** * @brief Free a variable @@ -524,7 +512,10 @@ public: 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(); @@ -588,7 +579,8 @@ private: void remove_all_modified_set(); void check_concurrency() const; - template void solve(CnstList& cnst_list); + template void lmm_solve(CnstList& cnst_list); + public: bool modified; boost::intrusive::list, @@ -604,9 +596,7 @@ public: &Constraint::saturated_constraint_set_hook>> saturated_constraint_set; - simgrid::surf::ActionLmmListPtr keep_track; - - void (*solve_fun)(lmm_system_t self); + simgrid::kernel::resource::Action::ModifiedSet* modified_set_ = nullptr; private: bool selective_update_active; /* flag to update partially the system only selecting changed portions */ @@ -621,6 +611,28 @@ private: xbt_mallocator_t variable_mallocator; }; +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(); } + +private: + void lagrange_solve(); +}; + +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); + 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);