Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Revert "Added a get Df function in order to implement beta*df during share_resources."
[simgrid.git] / src / surf / maxmin.c
index 9b98902..250e3e7 100644 (file)
@@ -11,6 +11,7 @@
 #include "xbt/mallocator.h"
 #include "maxmin_private.h"
 #include <stdlib.h>
+#include <stdio.h> /* sprintf */
 #include <math.h>
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf,
                                "Logging specific to SURF (maxmin)");
@@ -125,6 +126,11 @@ void lmm_constraint_shared(lmm_constraint_t cnst)
   cnst->shared = 0;
 }
 
+int lmm_constraint_is_shared(lmm_constraint_t cnst)
+{
+  return (cnst->shared);
+}
+
 void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst)
 {
   remove_constraint(sys, cnst);
@@ -202,6 +208,11 @@ double lmm_variable_getvalue(lmm_variable_t var)
   return (var->value);
 }
 
+double lmm_variable_getbound(lmm_variable_t var)
+{
+  return (var->bound);
+}
+
 void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                lmm_variable_t var, double value)
 {
@@ -235,9 +246,10 @@ void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
     if (var->cnsts[i].constraint == cnst)
       break;
 
-  if (i < var->cnsts_number)
-    var->cnsts[i].value += value;
-  else
+  if (i < var->cnsts_number) {
+    if(cnst->shared) var->cnsts[i].value += value;
+    else var->cnsts[i].value = MAX(var->cnsts[i].value,value);
+  }  else
     lmm_expand(sys, cnst, var, value);
 }
 
@@ -273,13 +285,16 @@ int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var)
 
 lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys,
                                     lmm_constraint_t cnst,
-                                    lmm_variable_t * var)
+                                    lmm_element_t * elem)
 {
-  if (!(*var))
-    xbt_swag_getFirst(&(cnst->element_set));
+  if (!(*elem))
+    *elem = xbt_swag_getFirst(&(cnst->element_set));
   else
-    *var = xbt_swag_getNext(*var, cnst->element_set.offset);
-  return *var;
+    *elem = xbt_swag_getNext(*elem, cnst->element_set.offset);
+  if(*elem)
+    return (*elem)->variable;
+  else 
+    return NULL;
 }
 
 void *lmm_constraint_id(lmm_constraint_t cnst)
@@ -374,6 +389,7 @@ void lmm_print(lmm_system_t sys)
   DEBUG1("%s", trace_buf);
   trace_buf[0] = '\000';
 
+  DEBUG0("Constraints");
   /* Printing Constraints */
   cnst_list = &(sys->active_constraint_set);
   xbt_swag_foreach(cnst, cnst_list) {
@@ -406,19 +422,20 @@ void lmm_print(lmm_system_t sys)
     }
     DEBUG1("%s", trace_buf);
     trace_buf[0] = '\000';
-    if (double_positive(sum - cnst->bound))
-      WARN3("Incorrect value (%f is not smaller than %f): %g",
-           sum, cnst->bound, sum - cnst->bound);
+    xbt_assert3(!double_positive(sum - cnst->bound),
+               "Incorrect value (%f is not smaller than %f): %g",
+               sum, cnst->bound, sum - cnst->bound);    
   }
 
+  DEBUG0("Variables");
   /* Printing Result */
   xbt_swag_foreach(var, var_list) {
     if (var->bound > 0) {
       DEBUG4("'%p'(%f) : %f (<=%f)", var, var->weight, var->value,
             var->bound);
-      if (double_positive(var->value - var->bound))
-       WARN2("Incorrect value (%f is not smaller than %f",
-             var->value, var->bound);
+      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);
   }
@@ -443,7 +460,15 @@ void lmm_solve(lmm_system_t sys)
   var_list = &(sys->variable_set);
   DEBUG1("Variable set : %d", xbt_swag_size(var_list));
   xbt_swag_foreach(var, var_list) {
+    int nb=0;
+    int i;
+    if(var->weight<=0.0) break;
     var->value = 0.0;
+    for (i = 0; i < var->cnsts_number; i++) {
+      if(var->cnsts[i].value==0.0) nb++;
+    }
+    if((nb==var->cnsts_number) && (var->weight>0.0))
+      var->value = 1.0;
   }
 
   /* 
@@ -481,6 +506,7 @@ void lmm_solve(lmm_system_t sys)
     var_list = &(sys->saturated_variable_set);
 
     xbt_swag_foreach(var, var_list) {
+      if(var->weight<=0.0) DIE_IMPOSSIBLE;
       /* First check if some of these variables have reach their upper
          bound and update min_usage accordingly. */
       DEBUG5
@@ -606,6 +632,7 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
   int i;
   lmm_element_t elem;
 
+  if(weight==var->weight) return;
   XBT_IN3("(sys=%p, var=%p, weight=%f)", sys, var, weight);
   sys->modified = 1;
   var->weight = weight;
@@ -623,6 +650,9 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
     else
       xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
   }
+  if(!weight)
+    var->value = 0.0;
+
   XBT_OUT;
 }