Ejemplo n.º 1
0
/* Replace the content of elem_a with elem_b. The content of elem_b is cleared. */
static void renew_elem_entry(lmm_element_t elem_a, lmm_element_t elem_b)
{
    elem_a->constraint = elem_b->constraint;
    elem_a->variable   = elem_b->variable;
    elem_a->value      = elem_b->value;

    /* If elem_b is in the element_set swag, register the new element to the swag. */
    if (xbt_swag_remove(elem_b, &(elem_b->constraint->element_set))) {
      if (elem_a->variable->weight)
        xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->element_set));
      else
        xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->element_set));
    }

    if (xbt_swag_remove(elem_b, &(elem_b->constraint->active_element_set))) {
      if (elem_a->variable->weight)
        xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->active_element_set));
      else
        xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->active_element_set));
    }

    elem_b->constraint = NULL;
    elem_b->variable   = NULL;
    elem_b->value      = 0;
}
Ejemplo n.º 2
0
void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                lmm_variable_t var, double value)
{
  lmm_element_t elem = NULL;

  sys->modified = 1;

  xbt_assert(var->cnsts_number < var->cnsts_size, "Too much constraints");

  elem = &(var->cnsts[var->cnsts_number++]);

  elem->value = value;
  elem->constraint = cnst;
  elem->variable = var;

  if (var->weight)
    xbt_swag_insert_at_head(elem, &(elem->constraint->element_set));
  else
    xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
  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);
  }
}
Ejemplo n.º 3
0
void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, double value)
{
  lmm_element_t elem = NULL;
  double weight;
  int i,current_share;

  sys->modified = 1;

  //Check if this variable already has an active element in this constraint
  //If it does, substract it from the required slack
  current_share=0;
  if(var->concurrency_share>1){
    for( i=0; i<var->cnsts_number;i++){
      if(var->cnsts[i].constraint==cnst &&
         xbt_swag_belongs(&var->cnsts[i],&(var->cnsts[i].constraint->enabled_element_set)))
         current_share+=lmm_element_concurrency(&(var->cnsts[i]));
    }
  }

  //Check if we need to disable the variable 
  if(var->weight>0 && var->concurrency_share-current_share>lmm_concurrency_slack(cnst)) {
    weight=var->weight;
    lmm_disable_var(sys,var);
    for (i = 0; i < var->cnsts_number; i++)
      lmm_on_disabled_var(sys,var->cnsts[i].constraint);
    value=0;
    var->staged_weight=weight;
    xbt_assert(!var->weight);
  }

  xbt_assert(var->cnsts_number < var->cnsts_size, "Too much constraints");

  elem = &(var->cnsts[var->cnsts_number++]);

  elem->value = value;
  elem->constraint = cnst;
  elem->variable = var;

  if (var->weight){
    xbt_swag_insert_at_head(elem, &(elem->constraint->enabled_element_set));
    lmm_increase_concurrency(elem);
  } else
    xbt_swag_insert_at_tail(elem, &(elem->constraint->disabled_element_set));

  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);
    //TODOLATER: Why do we need this second call?
    if (var->cnsts_number > 1)
      lmm_update_modified_set(sys, var->cnsts[0].constraint);
  }

  lmm_check_concurrency(sys);
}
Ejemplo n.º 4
0
lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, double weight, double bound, int number_of_constraints)
{
  lmm_variable_t var = NULL;
  int i;

  XBT_IN("(sys=%p, id=%p, weight=%f, bound=%f, num_cons =%d)", sys, id, weight, bound, number_of_constraints);

  var = (lmm_variable_t) xbt_mallocator_get(sys->variable_mallocator);
  var->id = id;
  var->id_int = Global_debug_id++;
  var->cnsts = (s_lmm_element_t *) xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t));
  for (i = 0; i < number_of_constraints; i++) {
    var->cnsts[i].enabled_element_set_hookup.next = NULL;
    var->cnsts[i].enabled_element_set_hookup.prev = NULL;
    var->cnsts[i].disabled_element_set_hookup.next = NULL;
    var->cnsts[i].disabled_element_set_hookup.prev = NULL;
    var->cnsts[i].active_element_set_hookup.next = NULL;
    var->cnsts[i].active_element_set_hookup.prev = NULL;
    var->cnsts[i].constraint = NULL;
    var->cnsts[i].variable = NULL;
    var->cnsts[i].value = 0.0;
  }
  var->cnsts_size = number_of_constraints;
  var->cnsts_number = 0;
  var->weight = weight;
  var->staged_weight = 0.0;
  var->bound = bound;
  var->concurrency_share = 1;
  var->value = 0.0;
  var->visited = sys->visited_counter - 1;
  var->mu = 0.0;
  var->new_mu = 0.0;
  var->func_f = func_f_def;
  var->func_fp = func_fp_def;
  var->func_fpi = func_fpi_def;

  var->variable_set_hookup.next = NULL;
  var->variable_set_hookup.prev = NULL;
  var->saturated_variable_set_hookup.next = NULL;
  var->saturated_variable_set_hookup.prev = NULL;

  if (weight)
    xbt_swag_insert_at_head(var, &(sys->variable_set));
  else
    xbt_swag_insert_at_tail(var, &(sys->variable_set));

  XBT_OUT(" returns %p", var);
  return var;
}
Ejemplo n.º 5
0
void SIMIX_request_push()
{
  xbt_swag_t req_table;
  smx_process_t issuer = SIMIX_process_self();

  if (issuer != simix_global->maestro_process){
    issuer->request.issuer = issuer;
    req_table = SIMIX_request_get_reqlist(SIMIX_context_get_thread_id());

    xbt_swag_insert_at_tail(&issuer->request, req_table);

    XBT_DEBUG("Pushed request %s (%d) of %s",
        SIMIX_request_name(issuer->request.call), issuer->request.call,
        issuer->name);

    XBT_DEBUG("Yield process '%s' on request of type %s (%d)", issuer->name,
        SIMIX_request_name(issuer->request.call), issuer->request.call);
    SIMIX_process_yield();
  } else {
    SIMIX_request_pre(&issuer->request, 0);
  }
}