+
+ var->weight=0.0;
+ var->staged_weight=0.0;
+ var->value = 0.0;
+ lmm_check_concurrency(sys);
+}
+
+/* /brief Find variables that can be enabled and enable them.
+ *
+ * Assuming that the variable has already been removed from non-zero weights
+ * Can we find a staged variable to add?
+ * If yes, check that none of the constraints that this variable is involved in is at the limit of its concurrency
+ * And then add it to enabled variables
+ */
+void lmm_on_disabled_var(lmm_system_t sys, lmm_constraint_t cnstr){
+ lmm_element_t elem;
+ lmm_element_t nextelem;
+ int numelem;
+
+ if(cnstr->concurrency_limit<0)
+ return;
+
+ numelem=xbt_swag_size(&(cnstr->disabled_element_set));
+ if(!numelem)
+ return;
+
+ elem= (lmm_element_t) xbt_swag_getFirst(&(cnstr->disabled_element_set));
+
+ //Cannot use xbt_swag_foreach, because lmm_enable_var will modify disabled_element_set.. within the loop
+ while(numelem-- && elem ){
+
+ nextelem = (lmm_element_t) xbt_swag_getNext(elem, cnstr->disabled_element_set.offset);
+
+ if (elem->variable->staged_weight>0 ){
+ //Found a staged variable
+ //TODOLATER: Add random timing function to model reservation protocol fuzziness? Then how to make sure that
+ //staged variables will eventually be called?
+ if(lmm_can_enable_var(elem->variable)){
+ lmm_enable_var(sys,elem->variable);
+ }
+ }
+
+ xbt_assert(cnstr->concurrency_current<=cnstr->concurrency_limit,"Concurrency overflow!");
+ if(cnstr->concurrency_current==cnstr->concurrency_limit)
+ break;
+
+ elem = nextelem;
+ }
+
+ //We could get an assertion fail, because transiently there can be variables that are staged and could be activated.
+ //And we need to go through all constraints of the disabled var before getting back a coherent state.
+ //Anyway, caller functions all call lmm_check_concurrency() in the end.
+ // lmm_check_concurrency(sys);
+}
+
+/* \brief update the weight of a variable, and enable/disable it.
+ * @return Returns whether a change was made
+ */
+void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, double weight)
+{
+ int minslack;
+
+ xbt_assert(weight>=0,"Variable weight should not be negative!");
+
+ if (weight == var->weight)
+ return;
+
+ int enabling_var= (weight>0 && var->weight<=0);
+ int disabling_var= (weight<=0 && var->weight>0);
+
+ XBT_IN("(sys=%p, var=%p, weight=%f)", sys, var, weight);
+
+ sys->modified = 1;
+
+ //Are we enabling this variable?
+ if (enabling_var){
+ var->staged_weight = weight;
+ minslack=lmm_cnstrs_min_concurrency_slack(var);
+ if(minslack<var->concurrency_share){
+ XBT_DEBUG("Staging var (instead of enabling) because min concurrency slack %i, with weight %f and concurrency"
+ " share %i", minslack, weight, var->concurrency_share);
+ return;
+ }
+ XBT_DEBUG("Enabling var with min concurrency slack %i", minslack);
+ lmm_enable_var(sys,var);
+ } else if (disabling_var){
+ //Are we disabling this variable?
+ lmm_disable_var(sys,var);
+ } else {
+ var->weight=weight;
+ }
+
+ lmm_check_concurrency(sys);