/* 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; }
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); } }
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); }
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; }
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); } }