Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
update
[simgrid.git] / src / surf / maxmin.c
index e36c5c8..b91599c 100644 (file)
@@ -174,7 +174,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
   var->weight = weight;
   var->bound = bound;
   var->value = 0.0;
-  var->df    = 1.0;
+  var->df    = 0.0;
 
   var->func_f    = func_f_def;
   var->func_fp   = func_fp_def;
@@ -333,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;
@@ -386,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);
   }
 
@@ -394,7 +395,7 @@ 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_assert0(!double_positive(var->value-var->bound), "Incorrect value");
     }
     else 
       DEBUG3("'%p'(%f) : %f",var,var->weight,var->value);
@@ -664,7 +665,7 @@ double func_vegas_f(lmm_variable_t var, double x){
  */
 double func_vegas_fp(lmm_variable_t var, double x){
   //avoid a disaster value - c'est du bricolage mais ca marche
-  if(x == 0) x = 10e-8;
+/*   if(x == 0) x = 10e-8; */
   return var->df/x;
 }
 
@@ -673,7 +674,7 @@ double func_vegas_fp(lmm_variable_t var, double x){
  */
 double func_vegas_fpi(lmm_variable_t var, double x){
   //avoid a disaster value - c'est du bricolage mais ca marche
-  if(x == 0) x = 10e-8;
+/*   if(x == 0) x = 10e-8; */
   return var->df/x;
 }
 
@@ -682,7 +683,7 @@ double func_vegas_fpi(lmm_variable_t var, double x){
  */
 double func_vegas_fpip(lmm_variable_t var, double x){
   //avoid a disaster value - c'est du bricolage mais ca marche
-  if(x == 0) x = 10e-8;
+/*   if(x == 0) x = 10e-8; */
   return -( var->df/(x*x) ) ;
 }
 
@@ -691,7 +692,7 @@ double func_vegas_fpip(lmm_variable_t var, double x){
  * For Reno f: $\frac{\sqrt{\frac{3}{2}}}{D_f} \arctan\left(\sqrt{\frac{3}{2}}x_f D_f\right)$
  */
 double func_reno_f(lmm_variable_t var, double x){
-  xbt_assert0( var->df, "Please report this bug.");
+  xbt_assert0(var->df>0.0,"Don't call me with stupid values!");
   // \sqrt{3/2} = 0.8164965808
   return (0.8164965808 / var->df) * atan( (0.8164965808 / var->df)*x );
 }
@@ -708,16 +709,14 @@ double func_reno_fp(lmm_variable_t var, double x){
  */
 double func_reno_fpi(lmm_variable_t var, double x){
   double res_fpi; 
-  xbt_assert0( var->df, "Please report this bug.");
 
-  //avoid a disaster value - c'est du bricolage mais ca marche
-  if(x == 0) x = 10e-8;
-  res_fpi = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
+  xbt_assert0(var->df>0.0,"Don't call me with stupid values!");
+  xbt_assert0(x>0.0,"Don't call me with stupid values!");
 
-  //avoid a disaster value of res_fpi
-  if(res_fpi < 0.0) return 0.0;
-  else return sqrt(res_fpi);
+  res_fpi = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
+  if(res_fpi<=0.0) return 0.0;
+  xbt_assert0(res_fpi>0.0,"Don't call me with stupid values!");
+  return sqrt(res_fpi);
 }
 
 /*
@@ -727,19 +726,12 @@ double func_reno_fpip(lmm_variable_t var, double x){
   double res_fpip; 
   double critical_test;
 
-  xbt_assert0(var->df,"Please report this bug.");
-
-  //avoid division by zero - c'est du bricolage mais ca marche
-  if(x == 0) x = 10e-8;
+  xbt_assert0(var->df>0.0,"Don't call me with stupid values!");
+  xbt_assert0(x>0.0,"Don't call me with stupid values!");
 
   res_fpip = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
-  
-  //avoid square root of negative number
-  if(res_fpip < 0.0) return 0.0;
-
-  //avoid division by zero
+  xbt_assert0(res_fpip>0.0,"Don't call me with stupid values!");
   critical_test = (2*var->df*var->df*x*x*sqrt(res_fpip));
 
-  if(critical_test == 0.0) return 0.0;
-  else return -(1/critical_test);
+  return -(1.0/critical_test);
 }