+ return xbt_swag_belongs(cnst, &(sys->active_constraint_set));
+}
+
+lmm_constraint_t lmm_get_first_active_constraint(lmm_system_t sys)
+{
+ return xbt_swag_getFirst(&(sys->active_constraint_set));
+}
+
+lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t sys, lmm_constraint_t cnst)
+{
+ 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_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),
+ double (* func_fpip) (lmm_variable_t var, double x))
+
+{
+ func_f_def = func_f;
+ func_fp_def = func_fp;
+ func_fpi_def = func_fpi;
+ func_fpip_def = func_fpip;
+}
+
+
+/*
+ * NOTE for Reno: all functions consider the network
+ * coeficient (alpha) equal to 1.
+ */
+
+/*
+ * For Vegas f: $\alpha_f d_f \log\left(x_f\right)$
+ */
+double func_vegas_f(lmm_variable_t var, double x){
+ return var->df * log(x);
+}
+
+/*
+ * For Vegas fp: $\frac{\alpha D_f}{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;
+ return var->df/x;
+}
+
+/*
+ * For Vegas fpi: $\frac{\alpha D_f}{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;
+ return var->df/x;
+}
+
+/*
+ * For Vegas fpip: $-\frac{\alpha D_f}{x^2}$
+ */
+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;
+ return -( var->df/(x*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.");
+ // \sqrt{3/2} = 0.8164965808
+ return (0.8164965808 / var->df) * atan( (0.8164965808 / var->df)*x );
+}
+
+/*
+ * For Reno fp: $\frac{3}{3 {D_f}^2 x^2 + 2}$
+ */
+double func_reno_fp(lmm_variable_t var, double x){
+ return 3 / (3*var->df*var->df*x*x + 2);
+}
+
+/*
+ * For Reno fpi: $\sqrt{\frac{1}{{D_f}^2 x} - \frac{2}{3{D_f}^2}}$
+ */
+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 pas ....
+ if(x == 0) x = 10e-16;
+
+ res_fpi = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
+
+ //avoid a disaster value of res_fpi
+ if(res_fpi < 0.0) return 0.0;
+ else return sqrt(res_fpi);