#include "xbt/mallocator.h"
#include "maxmin_private.h"
#include <stdlib.h>
+#include <stdio.h> /* sprintf */
#include <math.h>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf,
"Logging specific to SURF (maxmin)");
cnst->shared = 0;
}
+int lmm_constraint_is_shared(lmm_constraint_t cnst)
+{
+ return (cnst->shared);
+}
+
void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst)
{
remove_constraint(sys, cnst);
return (var->value);
}
+double lmm_variable_getbound(lmm_variable_t var)
+{
+ return (var->bound);
+}
+
void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
lmm_variable_t var, double value)
{
if (var->cnsts[i].constraint == cnst)
break;
- if (i < var->cnsts_number)
- var->cnsts[i].value += value;
- else
+ if (i < var->cnsts_number) {
+ if(cnst->shared) var->cnsts[i].value += value;
+ else var->cnsts[i].value = MAX(var->cnsts[i].value,value);
+ } else
lmm_expand(sys, cnst, var, value);
}
lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys,
lmm_constraint_t cnst,
- lmm_variable_t * var)
+ lmm_element_t * elem)
{
- if (!(*var))
- xbt_swag_getFirst(&(cnst->element_set));
+ if (!(*elem))
+ *elem = xbt_swag_getFirst(&(cnst->element_set));
else
- *var = xbt_swag_getNext(*var, cnst->element_set.offset);
- return *var;
+ *elem = xbt_swag_getNext(*elem, cnst->element_set.offset);
+ if(*elem)
+ return (*elem)->variable;
+ else
+ return NULL;
}
void *lmm_constraint_id(lmm_constraint_t cnst)
}
DEBUG1("%s", trace_buf);
trace_buf[0] = '\000';
- if (double_positive(sum - cnst->bound))
- WARN3("Incorrect value (%f is not smaller than %f): %g",
- sum, cnst->bound, sum - cnst->bound);
+ xbt_assert3(!double_positive(sum - cnst->bound),
+ "Incorrect value (%f is not smaller than %f): %g",
+ sum, cnst->bound, sum - cnst->bound);
}
DEBUG0("Variables");
if (var->bound > 0) {
DEBUG4("'%p'(%f) : %f (<=%f)", var, var->weight, var->value,
var->bound);
- if (double_positive(var->value - var->bound))
- WARN2("Incorrect value (%f is not smaller than %f",
- var->value, var->bound);
+ xbt_assert2(!double_positive(var->value - var->bound),
+ "Incorrect value (%f is not smaller than %f",
+ var->value, var->bound);
} else
DEBUG3("'%p'(%f) : %f", var, var->weight, var->value);
}
xbt_swag_foreach(var, var_list) {
int nb=0;
int i;
+ if(var->weight<=0.0) break;
var->value = 0.0;
for (i = 0; i < var->cnsts_number; i++) {
if(var->cnsts[i].value==0.0) nb++;
var_list = &(sys->saturated_variable_set);
xbt_swag_foreach(var, var_list) {
+ if(var->weight<=0.0) DIE_IMPOSSIBLE;
/* First check if some of these variables have reach their upper
bound and update min_usage accordingly. */
DEBUG5
int i;
lmm_element_t elem;
+ if(weight==var->weight) return;
XBT_IN3("(sys=%p, var=%p, weight=%f)", sys, var, weight);
sys->modified = 1;
var->weight = weight;
else
xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
}
+ if(!weight)
+ var->value = 0.0;
+
XBT_OUT;
}