Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
sanitize the OOP of kernel::profile
[simgrid.git] / src / kernel / lmm / maxmin.hpp
index e673370..1e3b0d3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2004-2018. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,13 +7,9 @@
 #define SURF_MAXMIN_HPP
 
 #include "simgrid/kernel/resource/Action.hpp"
-#include "src/internal_config.h"
-#include "src/surf/surf_interface.hpp"
-#include "surf/surf.hpp"
+#include "simgrid/s4u/Link.hpp"
 #include "xbt/asserts.h"
 #include "xbt/mallocator.h"
-#include "xbt/misc.h"
-#include "xbt/utility.hpp"
 
 #include <boost/intrusive/list.hpp>
 #include <cmath>
@@ -137,10 +133,6 @@ namespace lmm {
 
 /** 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);
@@ -183,7 +175,8 @@ public:
   double consumption_weight;
 };
 
-struct ConstraintLight {
+class ConstraintLight {
+public:
   double remaining_over_usage;
   Constraint* cnst;
 };
@@ -203,13 +196,13 @@ public:
   Constraint(void* id_value, double bound_value);
 
   /** @brief Unshare a constraint. */
-  void unshare() { sharing_policy = 0; }
+  void unshare() { sharing_policy = s4u::Link::SharingPolicy::FATPIPE; }
 
   /**
    * @brief Check if a constraint is shared (shared by default)
    * @return 1 if shared, 0 otherwise
    */
-  int get_sharing_policy() const { return sharing_policy; }
+  s4u::Link::SharingPolicy get_sharing_policy() const { return sharing_policy; }
 
   /**
    * @brief Get the usage of the constraint after the last lmm solve
@@ -264,7 +257,7 @@ public:
    * @param elem A element of constraint of the constraint or NULL
    * @return A variable associated to a constraint
    */
-  Variable* get_variable(const_lmm_element_t * elem) const;
+  Variable* get_variable(const Element** elem) const;
 
   /**
    * @brief Get a var associated to a constraint
@@ -274,7 +267,7 @@ public:
    * @param numelem parameter representing the number of elements to go
    * @return A variable associated to a constraint
    */
-  Variable* get_variable_safe(const_lmm_element_t * elem, const_lmm_element_t * nextelem, int* numelem) const;
+  Variable* get_variable_safe(const Element** elem, const Element** nextelem, int* numelem) const;
 
   /**
    * @brief Get the data associated to a constraint
@@ -304,11 +297,11 @@ public:
   int concurrency_maximum; /* The maximum number of (enabled and disabled) variables associated to the constraint at any
                             * given time (essentially for tracing)*/
 
-  int sharing_policy; /* see @e_surf_link_sharing_policy_t (0: FATPIPE, 1: SHARED, 2: SPLITDUPLEX) */
+  s4u::Link::SharingPolicy sharing_policy;
   int id_int;
   double lambda;
   double new_lambda;
-  lmm_constraint_light_t cnst_light;
+  ConstraintLight* cnst_light;
 
 private:
   static int Global_debug_id;
@@ -325,7 +318,7 @@ private:
  */
 class XBT_PUBLIC Variable {
 public:
-  void initialize(simgrid::kernel::resource::Action * id_value, double sharing_weight_value, double bound_value,
+  void initialize(resource::Action* id_value, double sharing_weight_value, double bound_value,
                   int number_of_constraints, unsigned visited_value);
 
   /**
@@ -364,13 +357,13 @@ public:
    * @brief Get the number of constraint associated to a variable
    * @return The number of constraint associated to the variable
    */
-  int get_number_of_constraint() const { return cnsts.size(); }
+  size_t get_number_of_constraint() const { return cnsts.size(); }
 
   /**
    * @brief Get the data associated to a variable
    * @return The data associated to the variable
    */
-  simgrid::kernel::resource::Action* get_id() const { return id; }
+  resource::Action* get_id() const { return id; }
 
   /**
    * @brief Get the weight of a variable
@@ -403,15 +396,12 @@ public:
   double bound;
   double value;
   short int concurrency_share; /* The maximum number of elements that variable will add to a constraint */
-  simgrid::kernel::resource::Action* id;
+  resource::Action* id;
   int id_int;
   unsigned visited; /* used by System::update_modified_set() */
   /* \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:
@@ -455,8 +445,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
    */
-  Variable* variable_new(simgrid::kernel::resource::Action * id, double weight_value, double bound,
-                         int number_of_constraints);
+  Variable* variable_new(resource::Action* id, double weight_value, double bound, size_t number_of_constraints);
 
   /**
    * @brief Free a variable
@@ -582,7 +571,7 @@ private:
   template <class CnstList> void lmm_solve(CnstList& cnst_list);
 
 public:
-  bool modified;
+  bool modified_ = false;
   boost::intrusive::list<Variable, boost::intrusive::member_hook<Variable, boost::intrusive::list_member_hook<>,
                                                                  &Variable::variable_set_hook>>
       variable_set;
@@ -596,19 +585,20 @@ public:
                                                                    &Constraint::saturated_constraint_set_hook>>
       saturated_constraint_set;
 
-  simgrid::kernel::resource::Action::ModifiedSet* modified_set_ = nullptr;
+  resource::Action::ModifiedSet* modified_set_ = nullptr;
 
 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
-                                 * cleverly (un-)flag the constraints (more details in these functions) */
+  unsigned visited_counter_ = 1; /* 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, boost::intrusive::member_hook<Constraint, boost::intrusive::list_member_hook<>,
                                                                    &Constraint::constraint_set_hook>>
       constraint_set;
   boost::intrusive::list<Constraint, boost::intrusive::member_hook<Constraint, boost::intrusive::list_member_hook<>,
                                                                    &Constraint::modified_constraint_set_hook>>
       modified_constraint_set;
-  xbt_mallocator_t variable_mallocator;
+  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 {
@@ -625,18 +615,37 @@ 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);
 
-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);
-
 /** @} */
 }
 }