+ diff += cnst->bound;
+
+ XBT_CDEBUG(surf_lagrange_dichotomy,
+ "d D/d lambda for cnst (%p) at %1.20f = %1.20f", cnst, lambda,
+ diff);
+ XBT_OUT();
+ return diff;
+}
+
+/** \brief Attribute the value bound to var->bound.
+ *
+ * \param func_fpi inverse of the partial differential of f (f prime inverse, (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_function(double (*func_f)
+
+
+
+
+
+
+ (lmm_variable_t var, double x),
+ double (*func_fp) (lmm_variable_t
+ var, double x),
+ double (*func_fpi) (lmm_variable_t
+ var, double x))
+{
+ func_f_def = func_f;
+ func_fp_def = func_fp;
+ func_fpi_def = func_fpi;
+}
+
+
+/**************** Vegas and Reno functions *************************/
+/*
+ * NOTE for Reno: all functions consider the network
+ * coeficient (alpha) equal to 1.
+ */
+
+/*
+ * For Vegas: $f(x) = \alpha D_f\ln(x)$
+ * Therefore: $fp(x) = \frac{\alpha D_f}{x}$
+ * Therefore: $fpi(x) = \frac{\alpha D_f}{x}$
+ */
+#define VEGAS_SCALING 1000.0
+
+double func_vegas_f(lmm_variable_t var, double x)
+{
+ xbt_assert(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
+ return VEGAS_SCALING * var->weight * log(x);
+}
+
+double func_vegas_fp(lmm_variable_t var, double x)
+{
+ xbt_assert(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
+ return VEGAS_SCALING * var->weight / x;
+}
+
+double func_vegas_fpi(lmm_variable_t var, double x)
+{
+ xbt_assert(x > 0.0, "Don't call me with stupid values! (%1.20f)", x);
+ return var->weight / (x / VEGAS_SCALING);
+}
+
+/*
+ * For Reno: $f(x) = \frac{\sqrt{3/2}}{D_f} atan(\sqrt{3/2}D_f x)$
+ * Therefore: $fp(x) = \frac{3}{3 D_f^2 x^2+2}$
+ * Therefore: $fpi(x) = \sqrt{\frac{1}{{D_f}^2 x} - \frac{2}{3{D_f}^2}}$
+ */
+#define RENO_SCALING 1.0
+double func_reno_f(lmm_variable_t var, double x)
+{
+ xbt_assert(var->weight > 0.0, "Don't call me with stupid values!");
+
+ 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->weight * var->weight * x * x +
+ 2.0);
+}
+
+double func_reno_fpi(lmm_variable_t var, double x)
+{
+ double res_fpi;
+
+ xbt_assert(var->weight > 0.0, "Don't call me with stupid values!");
+ xbt_assert(x > 0.0, "Don't call me with stupid values!");