Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make check_feasible() and dual_objective() private methods of lmm::Lagrange.
[simgrid.git] / src / kernel / lmm / maxmin.hpp
index c64d4d6..e98cdb6 100644 (file)
@@ -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 <boost/intrusive/list.hpp>
 #include <cmath>
 #include <limits>
@@ -134,15 +135,6 @@ 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),
@@ -447,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
@@ -520,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();
@@ -584,7 +579,8 @@ private:
   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<>,
@@ -600,9 +596,7 @@ public:
                                                                    &Constraint::saturated_constraint_set_hook>>
       saturated_constraint_set;
 
-  simgrid::kernel::resource::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 */
@@ -617,6 +611,31 @@ 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();
+
+  bool check_feasible(bool warn);
+  double dual_objective();
+};
+
+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);