X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7d5684d9beee690cf3b1346b66ebb7a6429e0660..d4b2fe80fbab6343e6dce68a12eb522a2e0559b8:/src/kernel/lmm/maxmin.hpp diff --git a/src/kernel/lmm/maxmin.hpp b/src/kernel/lmm/maxmin.hpp index 3fc501f869..608d6f4ad3 100644 --- a/src/kernel/lmm/maxmin.hpp +++ b/src/kernel/lmm/maxmin.hpp @@ -12,6 +12,7 @@ #include "xbt/asserts.h" #include "xbt/mallocator.h" #include "xbt/misc.h" +#include "xbt/utility.hpp" #include #include #include @@ -144,21 +145,21 @@ XBT_PUBLIC(void) bottleneck_solve(lmm_system_t sys); /** Default functions associated to the chosen protocol. When using the lagrangian approach. */ XBT_PUBLIC(void) -lmm_set_default_protocol_function(double (*func_f)(const s_lmm_variable_t& var, double x), - double (*func_fp)(const s_lmm_variable_t& var, double x), - double (*func_fpi)(const s_lmm_variable_t& var, double x)); +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 s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_reno_fp(const s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_reno_fpi(const s_lmm_variable_t& 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 s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_reno2_fp(const s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_reno2_fpi(const s_lmm_variable_t& 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 s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_vegas_fp(const s_lmm_variable_t& var, double x); -XBT_PUBLIC(double) func_vegas_fpi(const s_lmm_variable_t& 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 @@ -167,7 +168,7 @@ XBT_PUBLIC(double) func_vegas_fpi(const s_lmm_variable_t& 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 s_lmm_element_t +XBT_PUBLIC_CLASS Element { public: int get_concurrency() const; @@ -191,7 +192,7 @@ public: double consumption_weight; }; -struct s_lmm_constraint_light_t { +struct ConstraintLight { double remaining_over_usage; lmm_constraint_t cnst; }; @@ -205,11 +206,11 @@ struct s_lmm_constraint_light_t { * \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 s_lmm_constraint_t +XBT_PUBLIC_CLASS Constraint { public: - s_lmm_constraint_t() = default; - s_lmm_constraint_t(void* id_value, double bound_value); + Constraint() = default; + Constraint(void* id_value, double bound_value); /** @brief Unshare a constraint. */ void unshare() { sharing_policy = 0; } @@ -296,17 +297,14 @@ public: boost::intrusive::list_member_hook<> active_constraint_set_hook; boost::intrusive::list_member_hook<> modified_constraint_set_hook; boost::intrusive::list_member_hook<> saturated_constraint_set_hook; - boost::intrusive::list, - &s_lmm_element_t::enabled_element_set_hook>> + boost::intrusive::list, + &Element::enabled_element_set_hook>> enabled_element_set; - boost::intrusive::list, - &s_lmm_element_t::disabled_element_set_hook>> + boost::intrusive::list, + &Element::disabled_element_set_hook>> disabled_element_set; - boost::intrusive::list, - &s_lmm_element_t::active_element_set_hook>> + boost::intrusive::list, + &Element::active_element_set_hook>> active_element_set; double remaining; double usage; @@ -335,10 +333,10 @@ 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 s_lmm_variable_t +XBT_PUBLIC_CLASS Variable { public: - void initialize(simgrid::surf::Action * id_value, double sharing_weight_value, double bound_value, + void initialize(simgrid::surf::Action* id_value, double sharing_weight_value, double bound_value, int number_of_constraints, unsigned visited_value); /** @@ -403,7 +401,7 @@ public: boost::intrusive::list_member_hook<> variable_set_hook; boost::intrusive::list_member_hook<> saturated_variable_set_hook; - std::vector cnsts; + std::vector cnsts; // sharing_weight: variable's impact on the resource during the sharing // if == 0, the variable is not considered by LMM @@ -418,44 +416,42 @@ public: short int concurrency_share; /* The maximum number of elements that variable will add to a constraint */ simgrid::surf::Action* id; int id_int; - unsigned visited; /* used by lmm_update_modified_set */ + unsigned visited; /* used by System::update_modified_set() */ /* \begin{For Lagrange only} */ double mu; double new_mu; - double (*func_f)(const s_lmm_variable_t& var, double x); /* (f) */ - double (*func_fp)(const s_lmm_variable_t& var, double x); /* (f') */ - double (*func_fpi)(const s_lmm_variable_t& var, double x); /* (f')^{-1} */ + 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: static int Global_debug_id; }; -inline void s_lmm_element_t::make_active() +inline void Element::make_active() { constraint->active_element_set.push_front(*this); } -inline void s_lmm_element_t::make_inactive() +inline void Element::make_inactive() { - if (active_element_set_hook.is_linked()) { - auto& set = constraint->active_element_set; - set.erase(set.iterator_to(*this)); - } + if (active_element_set_hook.is_linked()) + simgrid::xbt::intrusive_erase(constraint->active_element_set, *this); } /** * @brief LMM system */ -XBT_PUBLIC_CLASS s_lmm_system_t +XBT_PUBLIC_CLASS System { public: /** * @brief Create a new Linear MaxMim system * @param selective_update whether we should do lazy updates */ - explicit s_lmm_system_t(bool selective_update); + explicit System(bool selective_update); /** @brief Free an existing Linear MaxMin system */ - ~s_lmm_system_t(); + ~System(); /** * @brief Create a new Linear MaxMin constraint @@ -471,7 +467,7 @@ 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 */ - lmm_variable_t variable_new(simgrid::surf::Action * id, double weight_value, double bound, int number_of_constraints); + lmm_variable_t variable_new(simgrid::surf::Action* id, double weight_value, double bound, int number_of_constraints); /** * @brief Free a variable @@ -555,9 +551,9 @@ private: void remove_variable(lmm_variable_t var) { if (var->variable_set_hook.is_linked()) - variable_set.erase(variable_set.iterator_to(*var)); + simgrid::xbt::intrusive_erase(variable_set, *var); if (var->saturated_variable_set_hook.is_linked()) - saturated_variable_set.erase(saturated_variable_set.iterator_to(*var)); + simgrid::xbt::intrusive_erase(saturated_variable_set, *var); } void make_constraint_active(lmm_constraint_t cnst) { @@ -567,9 +563,9 @@ private: void make_constraint_inactive(lmm_constraint_t cnst) { if (cnst->active_constraint_set_hook.is_linked()) - active_constraint_set.erase(active_constraint_set.iterator_to(*cnst)); + simgrid::xbt::intrusive_erase(active_constraint_set, *cnst); if (cnst->modified_constraint_set_hook.is_linked()) - modified_constraint_set.erase(modified_constraint_set.iterator_to(*cnst)); + simgrid::xbt::intrusive_erase(modified_constraint_set, *cnst); } void enable_var(lmm_variable_t var); @@ -594,21 +590,17 @@ private: template void solve(CnstList& cnst_list); public: bool modified; - boost::intrusive::list, - &s_lmm_variable_t::variable_set_hook>> + boost::intrusive::list, + &Variable::variable_set_hook>> variable_set; - boost::intrusive::list, - &s_lmm_constraint_t::active_constraint_set_hook>> + boost::intrusive::list, + &Constraint::active_constraint_set_hook>> active_constraint_set; - boost::intrusive::list, - &s_lmm_variable_t::saturated_variable_set_hook>> + boost::intrusive::list, + &Variable::saturated_variable_set_hook>> saturated_variable_set; - boost::intrusive::list, - &s_lmm_constraint_t::saturated_constraint_set_hook>> + boost::intrusive::list, + &Constraint::saturated_constraint_set_hook>> saturated_constraint_set; simgrid::surf::ActionLmmListPtr keep_track; @@ -617,22 +609,20 @@ public: private: bool selective_update_active; /* flag to update partially the system only selecting changed portions */ - unsigned visited_counter; /* used by lmm_update_modified_set and lmm_remove_modified_set to cleverly (un-)flag the - * constraints (more details in these functions) */ - boost::intrusive::list, - &s_lmm_constraint_t::constraint_set_hook>> + unsigned visited_counter; /* used by System::update_modified_set() and System::remove_all_modified_set() to + * cleverly (un-)flag the constraints (more details in these functions) */ + boost::intrusive::list, + &Constraint::constraint_set_hook>> constraint_set; - boost::intrusive::list, - &s_lmm_constraint_t::modified_constraint_set_hook>> + boost::intrusive::list, + &Constraint::modified_constraint_set_hook>> modified_constraint_set; xbt_mallocator_t variable_mallocator; }; -extern XBT_PRIVATE double (*func_f_def)(const s_lmm_variable_t&, double); -extern XBT_PRIVATE double (*func_fp_def)(const s_lmm_variable_t&, double); -extern XBT_PRIVATE double (*func_fpi_def)(const s_lmm_variable_t&, double); +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); /** @} */ }