- namespace surf {
-
- NetworkIBModel::NetworkIBModel()
- : NetworkSmpiModel() {
- haveGap_=false;
- active_nodes=nullptr;
-
- const char* IB_factors_string=xbt_cfg_get_string("smpi/IB-penalty-factors");
- std::vector<std::string> radical_elements;
- boost::split(radical_elements, IB_factors_string, boost::is_any_of(";"));
-
- surf_parse_assert(radical_elements.size() == 3, "smpi/IB-penalty-factors should be provided and contain 3 "
- "elements, semi-colon separated. Example: 0.965;0.925;1.35");
-
- Be = xbt_str_parse_double(radical_elements.front().c_str(),
- "First part of smpi/IB-penalty-factors is not numerical: %s");
- Bs = xbt_str_parse_double((radical_elements.at(1)).c_str(),
- "Second part of smpi/IB-penalty-factors is not numerical: %s");
- ys = xbt_str_parse_double(radical_elements.back().c_str(),
- "Third part of smpi/IB-penalty-factors is not numerical: %s");
- }
-
- NetworkIBModel::~NetworkIBModel()
- {
- xbt_dict_cursor_t cursor = nullptr;
- IBNode* instance = nullptr;
- char *name = nullptr;
- xbt_dict_foreach(active_nodes, cursor, name, instance)
- delete instance;
- xbt_dict_free(&active_nodes);
- }
-
- void NetworkIBModel::computeIBfactors(IBNode *root) {
- double penalized_bw=0.0;
- double num_comm_out = (double) root->ActiveCommsUp.size();
- double max_penalty_out=0.0;
- //first, compute all outbound penalties to get their max
- for (std::vector<ActiveComm*>::iterator it= root->ActiveCommsUp.begin(); it != root->ActiveCommsUp.end(); ++it) {
- double my_penalty_out = 1.0;
-
- if(num_comm_out!=1){
- if((*it)->destination->nbActiveCommsDown > 2)//number of comms sent to the receiving node
- my_penalty_out = num_comm_out * Bs * ys;
- else
- my_penalty_out = num_comm_out * Bs;
- }
-
- max_penalty_out = std::max(max_penalty_out,my_penalty_out);
- }