*/
#include "xbt/log.h"
#include "xbt/sysdep.h"
-#include "xbt/mallocator.h"
#include "maxmin_private.h"
#include <stdlib.h>
}
if (var->bound > 0)
tmp += var->mu;
- DEBUG3("\t Working on var (%p). cost = %e; Df = %e", var, tmp, var->df);
+ DEBUG3("\t Working on var (%p). cost = %e; Weight = %e", var, tmp, var->weight);
//uses the partial differential inverse function
return var->func_fpi(var, tmp);
}
if (!var->weight)
var->value = 0.0;
else {
+ int nb = 0;
if (var->bound < 0.0) {
DEBUG1("#### NOTE var(%d) is a boundless variable", i);
var->mu = -1.0;
var->new_mu = 2.0;
var->value = new_value(var);
}
- DEBUG3("#### var(%d) %p ->df : %e", i, var, var->df);
- DEBUG3("#### var(%d) %p ->mu : %e", i, var, var->mu);
- DEBUG3("#### var(%d) %p ->weight: %e", i, var, var->weight);
- DEBUG3("#### var(%d) %p ->bound: %e", i, var, var->bound);
- i++;
+ DEBUG2("#### var(%p) ->weight : %e", var, var->weight);
+ DEBUG2("#### var(%p) ->mu : %e", var, var->mu);
+ DEBUG2("#### var(%p) ->weight: %e", var, var->weight);
+ DEBUG2("#### var(%p) ->bound: %e", var, var->bound);
+ for (i = 0; i < var->cnsts_number; i++) {
+ if(var->cnsts[i].value==0.0) nb++;
+ }
+ if(nb==var->cnsts_number) var->value = 1.0;
}
}
double func_vegas_f(lmm_variable_t var, double x)
{
xbt_assert1(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
- return VEGAS_SCALING * var->df * log(x);
+ return VEGAS_SCALING * var->weight * log(x);
}
double func_vegas_fp(lmm_variable_t var, double x)
{
xbt_assert1(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
- return VEGAS_SCALING * var->df / x;
+ return VEGAS_SCALING * var->weight / x;
}
double func_vegas_fpi(lmm_variable_t var, double x)
{
xbt_assert1(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
- return var->df / (x / VEGAS_SCALING);
+ return var->weight / (x / VEGAS_SCALING);
}
/*
#define RENO_SCALING 1.0
double func_reno_f(lmm_variable_t var, double x)
{
- xbt_assert0(var->df > 0.0, "Don't call me with stupid values!");
+ xbt_assert0(var->weight > 0.0, "Don't call me with stupid values!");
- return RENO_SCALING * sqrt(3.0 / 2.0) / var->df * atan(sqrt(3.0 / 2.0) *
- var->df * x);
+ return RENO_SCALING * sqrt(3.0 / 2.0) / var->weight * atan(sqrt(3.0 / 2.0) *
+ var->weight * x);
}
double func_reno_fp(lmm_variable_t var, double x)
{
- return RENO_SCALING * 3.0 / (3.0 * var->df * var->df * x * x + 2.0);
+ return RENO_SCALING * 3.0 / (3.0 * var->weight * var->weight * x * x + 2.0);
}
double func_reno_fpi(lmm_variable_t var, double x)
{
double res_fpi;
- xbt_assert0(var->df > 0.0, "Don't call me with stupid values!");
+ xbt_assert0(var->weight > 0.0, "Don't call me with stupid values!");
xbt_assert0(x > 0.0, "Don't call me with stupid values!");
res_fpi =
- 1.0 / (var->df * var->df * (x / RENO_SCALING)) -
- 2.0 / (3.0 * var->df * var->df);
+ 1.0 / (var->weight * var->weight * (x / RENO_SCALING)) -
+ 2.0 / (3.0 * var->weight * var->weight);
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);
}
+
+
+/* Implementing new Reno-2
+ * For Reno-2: $f(x) = U_f(x_f) = \frac{{2}{D_f}}*ln(2+x*D_f)$
+ * Therefore: $fp(x) = 2/(Weight*x + 2)
+ * Therefore: $fpi(x) = (2*Weight)/x - 4
+ */
+#define RENO2_SCALING 1.0
+double func_reno2_f(lmm_variable_t var, double x)
+{
+ xbt_assert0(var->weight > 0.0, "Don't call me with stupid values!");
+ return RENO2_SCALING * (1.0/var->weight) * log((x*var->weight)/(2.0*x*var->weight+3.0));
+}
+
+double func_reno2_fp(lmm_variable_t var, double x)
+{
+ return RENO2_SCALING * 3.0/(var->weight*x*(2.0*var->weight*x+3.0));
+}
+
+double func_reno2_fpi(lmm_variable_t var, double x)
+{
+ double res_fpi;
+ double tmp;
+
+ xbt_assert0(x > 0.0, "Don't call me with stupid values!");
+ tmp= x*var->weight*var->weight;
+ res_fpi= tmp*(9.0*x+24.0);
+
+ if (res_fpi <= 0.0)
+ return 0.0;
+
+ res_fpi = RENO2_SCALING * (-3.0*tmp + sqrt(res_fpi))/(4.0*tmp);
+ return res_fpi;
+}