summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
b50de09)
I use the usual trick of putting elements that require no work at the
end of the list.
-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)
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();
XBT_IN("sys=%p, cnst=%p, min_usage=%f", sys, cnst, *min_usage);
if (cnst->usage <= 0) {
XBT_OUT();
}
if (cnst->remaining <= 0) {
XBT_OUT();
}
if (cnst->remaining <= 0) {
XBT_OUT();
}
if ((*min_usage < 0) || (*min_usage > cnst->remaining / cnst->usage)) {
*min_usage = cnst->remaining / cnst->usage;
}
if ((*min_usage < 0) || (*min_usage > cnst->remaining / cnst->usage)) {
*min_usage = cnst->remaining / cnst->usage;
xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
}
XBT_OUT();
xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
}
XBT_OUT();
}
static XBT_INLINE void saturated_variable_set_update(lmm_system_t sys)
}
static XBT_INLINE void saturated_variable_set_update(lmm_system_t sys)
{
lmm_variable_t var = NULL;
lmm_constraint_t cnst = NULL;
{
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;
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)
/* INIT */
cnst->remaining = cnst->bound;
if (cnst->remaining == 0)
}
XBT_DEBUG("Constraint Usage '%d' : %f", cnst->id_int, cnst->usage);
/* Saturated constraints update */
}
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);
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->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;
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;
/* Find out which variables reach the maximum */
min_usage = -1;
min_bound = -1;
xbt_swag_foreach(cnst, cnst_list) {
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);
}
saturated_variable_set_update(sys);