+
+int lmm_concurrency_slack(lmm_constraint_t cnstr){
+
+ int slack;
+ int concurrency=0;
+ void* _elem;
+ lmm_element_t elem;
+
+ //FIXME MARTIN: Replace by infinite value std::numeric_limits<int>::(max)(), or something better within Simgrid?
+ if(cnstr->concurrency_limit<0)
+ return 666;
+
+ if (XBT_LOG_ISENABLED(surf_maxmin, xbt_log_priority_debug)) {
+ xbt_swag_foreach(_elem, &(cnstr->element_set)) {
+ elem = (lmm_element_t)_elem;
+ if (elem->variable->weight <= 0) break; //Found an inactive variable
+ concurrency++;
+ }
+
+ slack=cnstr->concurrency_limit-concurrency;
+ xbt_assert(slack>=0,"concurrency slack should not be negative!");
+ return slack;
+ }
+
+ return cnstr->concurrency_limit - cnstr->concurrency_current;
+
+}
+
+/** \brief Measure the minimum concurrency slack across all constraints where var is involved
+ *
+ * \param The variable to check for
+ *
+ */
+int lmm_cnstrs_min_concurrency_slack(lmm_variable_t var){
+ int i;
+ //FIXME MARTIN: Replace by infinite value std::numeric_limits<int>::(max)(), or something better within Simgrid?
+ int slack,minslack=666;
+ for (i = 0; i < var->cnsts_number; i++) {
+ slack=lmm_concurrency_slack(var->cnsts[i].constraint);
+
+ //This is only an optimization, to avoid looking at more constraints when slack is already zero
+ //Disable it when debugging to let lmm_concurrency_slack catch nasty things
+ if(!slack && !XBT_LOG_ISENABLED(surf_maxmin, xbt_log_priority_debug))
+ return 0;
+
+ if(minslack>slack)
+ minslack=slack;
+ }
+
+ return minslack;
+}
+
+/* /Check if a variable can be enabled
+ *
+ * Make sure to set staged_weight before, if your intent is only to check concurrency
+ */
+int lmm_can_enable_var(lmm_variable_t var){
+ return var->staged_weight>0 && lmm_cnstrs_min_concurrency_slack(var)>=var->concurrency_share;
+}
+
+
+//Small remark: In this implementation of lmm_enable_var and lmm_disable_var, we will meet multiple times with var when running lmm_update_modified_set.
+//A priori not a big performance issue, but we might do better by calling lmm_update_modified_set within the for loops (after doing the first for enabling==1, and before doing the last for disabling==1)
+
+void lmm_enable_var(lmm_system_t sys, lmm_variable_t var){
+