+static inline void lmm_variable_remove(lmm_system_t sys, lmm_variable_t var)
+{
+ XBT_IN("(sys=%p, var=%p)", sys, var);
+ sys->modified = 1;
+
+ // TODOLATER Can do better than that by leaving only the variable in only one enabled_element_set, call
+ // lmm_update_modified_set, and then remove it..
+ if (var->cnsts_number)
+ lmm_update_modified_set(sys, var->cnsts[0].constraint);
+
+ for (int i = 0; i < var->cnsts_number; i++) {
+ lmm_element_t elem = &var->cnsts[i];
+ if (var->sharing_weight > 0)
+ lmm_decrease_concurrency(elem);
+ xbt_swag_remove(elem, &(elem->constraint->enabled_element_set));
+ xbt_swag_remove(elem, &(elem->constraint->disabled_element_set));
+ xbt_swag_remove(elem, &(elem->constraint->active_element_set));
+ int nelements = xbt_swag_size(&(elem->constraint->enabled_element_set)) +
+ xbt_swag_size(&(elem->constraint->disabled_element_set));
+ if (nelements == 0)
+ make_constraint_inactive(sys, elem->constraint);
+ else
+ lmm_on_disabled_var(sys, elem->constraint);
+ }
+
+ // Check if we can enable new variables going through the constraints where var was.
+ // Do it after removing all elements, so he first disabled variables get priority over those with smaller requirement
+ for (int i = 0; i < var->cnsts_number; i++) {
+ lmm_element_t elem = &var->cnsts[i];
+ if (xbt_swag_size(&(elem->constraint->disabled_element_set)))
+ lmm_on_disabled_var(sys, elem->constraint);
+ }
+
+ var->cnsts_number = 0;
+
+ lmm_check_concurrency(sys);
+
+ XBT_OUT();
+}
+
+static void lmm_var_free(lmm_system_t sys, lmm_variable_t var)
+{
+ lmm_variable_remove(sys, var);
+ xbt_mallocator_release(sys->variable_mallocator, var);
+}
+
+lmm_system_t lmm_system_new(bool selective_update)