static void lmm_remove_all_modified_set(lmm_system_t sys);
static int Global_debug_id = 1;
static int Global_const_debug_id = 1;
-extern xbt_swag_t keep_track;
lmm_system_t lmm_system_new(int selective_update)
{
xbt_swag_insert_at_head(var, &(sys->variable_set));
else
xbt_swag_insert_at_tail(var, &(sys->variable_set));
- XBT_OUT();
+
+ XBT_OUT(" returns %p", var);
return var;
}
return NULL;
}
+XBT_INLINE double lmm_get_cnst_weight_from_var(lmm_system_t sys,
+ lmm_variable_t var,
+ int num)
+{
+ if (num < var->cnsts_number)
+ return (var->cnsts[num].value);
+ else
+ return 0.0;
+}
+
XBT_INLINE int lmm_get_number_of_cnst_from_var(lmm_system_t sys,
lmm_variable_t var)
{
return var->id;
}
-static XBT_INLINE void saturated_constraint_set_update(lmm_system_t sys,
+static XBT_INLINE int saturated_constraint_set_update(lmm_system_t sys,
lmm_constraint_t
cnst,
double *min_usage)
XBT_IN("sys=%p, cnst=%p, min_usage=%f", sys, cnst, *min_usage);
if (cnst->usage <= 0) {
XBT_OUT();
- return;
+ return 1;
}
if (cnst->remaining <= 0) {
XBT_OUT();
- return;
+ return 1;
}
if ((*min_usage < 0) || (*min_usage > cnst->remaining / cnst->usage)) {
*min_usage = cnst->remaining / cnst->usage;
- XBT_LOG(xbt_log_priority_trace,
- "min_usage=%f (cnst->remaining=%f, cnst->usage=%f)", *min_usage,
- cnst->remaining, cnst->usage);
+ XBT_HERE(" min_usage=%f (cnst->remaining=%f, cnst->usage=%f)",
+ *min_usage, cnst->remaining, cnst->usage);
while ((useless_cnst =
xbt_swag_getFirst(&(sys->saturated_constraint_set))))
xbt_swag_remove(useless_cnst, &(sys->saturated_constraint_set));
xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
}
XBT_OUT();
+ return 0;
}
static XBT_INLINE void saturated_variable_set_update(lmm_system_t sys)
{
lmm_variable_t var = NULL;
lmm_constraint_t cnst = NULL;
+ lmm_constraint_t cnst_next = NULL;
lmm_element_t elem = NULL;
xbt_swag_t cnst_list = NULL;
xbt_swag_t var_list = NULL;
}
}
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
/* INIT */
cnst->remaining = cnst->bound;
if (cnst->remaining == 0)
cnst->usage = elem->value / elem->variable->weight;
make_elem_active(elem);
- if(keep_track){
- xbt_swag_insert((elem->variable)->id, keep_track);
- }
+ if (sys->keep_track)
+ xbt_swag_insert(elem->variable->id, sys->keep_track);
}
}
XBT_DEBUG("Constraint Usage '%d' : %f", cnst->id_int, cnst->usage);
/* Saturated constraints update */
+ if(cnst->usage>0) {
+ xbt_swag_remove(cnst, cnst_list);
+ xbt_swag_insert_at_head(cnst, cnst_list);
+ }
saturated_constraint_set_update(sys, cnst, &min_usage);
}
saturated_variable_set_update(sys);
if (cnst->shared) {
double_update(&(cnst->remaining), elem->value * var->value);
double_update(&(cnst->usage), elem->value / var->weight);
+ if(cnst->usage<=0 || cnst->remaining<=0) {
+ xbt_swag_remove(cnst, cnst_list);
+ xbt_swag_insert_at_tail(cnst, cnst_list);
+ }
make_elem_inactive(elem);
} else { /* FIXME one day: We recompute usage.... :( */
cnst->usage = 0.0;
/* Find out which variables reach the maximum */
min_usage = -1;
min_bound = -1;
+
xbt_swag_foreach(cnst, cnst_list) {
- saturated_constraint_set_update(sys, cnst, &min_usage);
+ if(saturated_constraint_set_update(sys, cnst, &min_usage)) break;
}
saturated_variable_set_update(sys);