lmm_constraint_t cnst)
{
/* xbt_assert(xbt_swag_size(&(cnst->element_set)), */
-/* "This list should be empty!"); */
+/* "This list should be empty!"); */
make_constraint_inactive(sys, cnst);
free(cnst);
}
xbt_swag_insert_at_head(elem, &(elem->constraint->element_set));
else
xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
-
- make_constraint_active(sys, cnst);
- lmm_update_modified_set(sys, cnst);
- if (var->cnsts_number > 1)
- lmm_update_modified_set(sys, var->cnsts[0].constraint);
+ if(!sys->selective_update_active) {
+ make_constraint_active(sys, cnst);
+ } else if(elem->value>0 || var->weight >0) {
+ make_constraint_active(sys, cnst);
+ lmm_update_modified_set(sys, cnst);
+ if (var->cnsts_number > 1)
+ lmm_update_modified_set(sys, var->cnsts[0].constraint);
+ }
}
void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
sprintf(print_buf, "%s(",(cnst->shared)?"":"max");
trace_buf =
xbt_realloc(trace_buf,
- strlen(trace_buf) + strlen(print_buf) + 1);
+ strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
xbt_swag_foreach(elem, elem_list) {
sprintf(print_buf, "%f.'%d'(%f) %s ", elem->value,
strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
if(cnst->shared)
- sum += elem->value * elem->variable->value;
+ sum += elem->value * elem->variable->value;
else
- sum = MAX(sum,elem->value * elem->variable->value);
+ sum = MAX(sum,elem->value * elem->variable->value);
}
sprintf(print_buf, "0) <= %f ('%d')", cnst->bound, cnst->id_int);
trace_buf =
XBT_DEBUG("Constraint Usage '%d' : %f", cnst->id_int, cnst->usage);
/* Saturated constraints update */
if(cnst->usage>0) {
+ // TODO Créer une contrainte light
+ // À partir de maintenant, usage et remaining sont dans cnst_light uniquement.
+ // En fait, usage et remaining doivent disparaitre complètement de cnst pour n'être que dans cnst_light.
xbt_swag_remove(cnst, cnst_list);
xbt_swag_insert_at_head(cnst, cnst_list);
}
+ // On a deux dynars:
+ // - Celui de cnst_list avec les csnt_light
+ // - saturated_constraint_set, celui des indexes de cnst_list qui sont saturés
+ // Si la cnst_light est un minimum_usage on la met dans saturated_constraint_set
saturated_constraint_set_update(sys, cnst, &min_usage);
}
+ // On parcours saturated_constraint_set (le tableau d'index) dans le sens décroissant
+ // - on accède aux contraintes correspondantes pour mettre les variables dans saturated_variable_set
+ // - on se permutte si besoin avec le dernier élément; on enlève le dernier élément de cnst_list
saturated_variable_set_update(sys);
/* Saturated variables update */
if (cnst->shared) {
double_update(&(cnst->remaining), elem->value * var->value);
double_update(&(cnst->usage), elem->value / var->weight);
+ // mettre à jour le cnst_light->remaining_over_usage correspondant
+ // cnst_light->remaining_over_usage = cnst->remaining / cnst->usage
if(cnst->usage<=0 || cnst->remaining<=0) {
xbt_swag_remove(cnst, cnst_list);
xbt_swag_insert_at_tail(cnst, cnst_list);
if ((elem->value > 0)) {
cnst->usage =
MAX(cnst->usage, elem->value / elem->variable->weight);
+ // mettre à jour le cnst_light->remaining_over_usage correspondant
XBT_DEBUG("Constraint Usage %d : %f", cnst->id_int,
cnst->usage);
make_elem_active(elem);