Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Cleanups and cosmetics
[simgrid.git] / src / surf / maxmin.c
index 8dd3fb3..7ff6a48 100644 (file)
@@ -11,6 +11,7 @@
 #include "xbt/mallocator.h"
 #include "maxmin_private.h"
 #include <stdlib.h>
+#include <math.h>
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf,
                                "Logging specific to SURF (maxmin)");
 
@@ -173,6 +174,13 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
   var->weight = weight;
   var->bound = bound;
   var->value = 0.0;
+  var->df    = 0.0;
+
+  var->func_f    = func_f_def;
+  var->func_fp   = func_fp_def;
+  var->func_fpi  = func_fpi_def;
+  var->func_fpip = func_fpip_def;
+
   if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set));
   else xbt_swag_insert_at_tail(var,&(sys->variable_set));
   XBT_OUT;
@@ -325,6 +333,7 @@ static void saturated_variable_set_update(lmm_system_t sys)
 }
 
 void lmm_print(lmm_system_t sys)
+
 {
   lmm_constraint_t cnst = NULL;
   lmm_element_t elem = NULL;
@@ -378,7 +387,7 @@ void lmm_print(lmm_system_t sys)
     }
     DEBUG1("%s",trace_buf);
     trace_buf[0]='\000';
-    xbt_assert3((sum<=cnst->bound), "Incorrect value (%f is not smaller than %f): %g",
+    xbt_assert3(!double_positive(sum-cnst->bound), "Incorrect value (%f is not smaller than %f): %g",
                sum,cnst->bound,sum-cnst->bound);
   }
 
@@ -386,7 +395,8 @@ void lmm_print(lmm_system_t sys)
   xbt_swag_foreach(var, var_list) {
     if(var->bound>0) {
       DEBUG4("'%p'(%f) : %f (<=%f)",var,var->weight,var->value, var->bound);
-      xbt_assert0((var->value<=var->bound), "Incorrect value");
+      xbt_assert2(!double_positive(var->value-var->bound), "Incorrect value (%f is not smaller than %f",
+                 var->value, var->bound);
     }
     else 
       DEBUG3("'%p'(%f) : %f",var,var->weight,var->value);
@@ -526,6 +536,18 @@ void lmm_update(lmm_system_t sys, lmm_constraint_t cnst,
     }
 }
 
+/** \brief Attribute the value bound to var->bound.
+ * 
+ *  \param sys the lmm_system_t
+ *  \param var the lmm_variable_t
+ *  \param bound the new bound to associate with var
+ * 
+ *  Makes var->bound equal to bound. Whenever this function is called 
+ *  a change is  signed in the system. To
+ *  avoid false system changing detection it is a good idea to test 
+ *  (bound != 0) before calling it.
+ *
+ */
 void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
                               double bound)
 {
@@ -533,6 +555,25 @@ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
   var->bound = bound;
 }
 
+/** \brief Add the value delta to var->df (the sum of latencies).
+ * 
+ *  \param sys the lmm_system_t associated
+ *  \param var the lmm_variable_t which need to updated
+ *  \param delta the variation of the latency
+ * 
+ *  Add the value delta to var->df (the sum of latencys associated to the
+ *  flow). Whenever this function is called a change is  signed in the system. To
+ *  avoid false system changing detection it is a good idea to test 
+ *  (delta != 0) before calling it.
+ *
+ */
+void lmm_update_variable_latency(lmm_system_t sys, lmm_variable_t var,
+                              double delta)
+{
+  sys->modified = 1;
+  var->df += delta;
+}
+
 void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
                                double weight)
 {
@@ -583,3 +624,20 @@ lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t sys, lmm_constraint
   return xbt_swag_getNext(cnst,(sys->active_constraint_set).offset);
 }
 
+
+
+/** \brief Attribute the value bound to var->bound.
+ * 
+ *  \param func_f    default function f associated with the chosen protocol flavor
+ *  \param func_fp   partial differential of f (f prime, f')
+ *  \param func_fpi  inverse of the partial differential of f (f prime inverse, (f')^{-1})
+ *  \param func_fpip partial differential of the inverse of the partial differential of f (f prime inverse prime, ((f')^{-1})')
+ * 
+ *  Set default functions to the ones passed as parameters. This is a polimorfism in C pure, enjoy the roots of programming.
+ *
+ */
+void lmm_set_default_protocol_functions(double (* func_fpi)  (lmm_variable_t var, double x))
+{
+  func_fpi_def  = func_fpi;
+}
+