X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4e4ee823e63a90fd91cbec6f2312c896ca4cabe0..83f030eeb0e339f9dd779251fb507756faaeb2e8:/src/instr/jedule/jedule_platform.cpp diff --git a/src/instr/jedule/jedule_platform.cpp b/src/instr/jedule/jedule_platform.cpp index 7c33b3e529..00f78dad26 100644 --- a/src/instr/jedule/jedule_platform.cpp +++ b/src/instr/jedule/jedule_platform.cpp @@ -1,316 +1,212 @@ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "simgrid/jedule/jedule_platform.hpp" -#include "simgrid/jedule/jedule_output.hpp" -#include "simgrid/s4u/As.hpp" +#include "simgrid/jedule/jedule.hpp" +#include "simgrid/config.h" #include "simgrid/host.h" - +#include "simgrid/s4u/NetZone.hpp" #include "xbt/asserts.h" -#include "xbt/dynar.h" -#include "xbt/str.h" -#include - -#include -#include +#include -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE -static xbt_dict_t host2_simgrid_parent_container; -static xbt_dict_t container_name2container; +namespace { +std::unordered_map host2_simgrid_parent_container; +std::unordered_map container_name2container; +} namespace simgrid { namespace jedule { +Subset::Subset(int start_idx, int end_idx, Container* parent) + : start_idx(start_idx), nres(end_idx - start_idx + 1), parent(parent) +{ +} -Container::Container(std::string name) -: name(name) { - - this->is_lowest = 0; - this->parent = nullptr; - - xbt_dict_set(container_name2container, this->name.c_str(), this, nullptr); +Container::Container(const std::string& name) : name(name) +{ + container_name2container.insert({this->name, this}); } -void Container::addChild(jed_container_t child){ - xbt_assert(this != nullptr); +void Container::add_child(jed_container_t child) +{ xbt_assert(child != nullptr); - this->children.push_back(child); - child->parent = this; + children_.emplace_back(child); + child->set_parent(this); } -void Container::addResources(std::vector hosts){ - this->is_lowest = 1; - this->children.clear(); - this->last_id = 0; +void Container::add_resources(const std::vector& hosts) +{ + children_.clear(); + last_id_ = 0; - //FIXME do we need to sort?: xbt_dynar_sort_strings(host_names); - - for (auto host : hosts) { + for (auto const& host : hosts) { const char *host_name = sg_host_get_name(host); - this->name2id.insert({host_name, this->last_id}); - (this->last_id)++; - xbt_dict_set(host2_simgrid_parent_container, host_name, this, nullptr); + this->name2id.insert({host_name, this->last_id_}); + (this->last_id_)++; + host2_simgrid_parent_container.insert({host_name, this}); this->resource_list.push_back(host); } } -void Container::createHierarchy(AS_t from_as){ - xbt_dict_cursor_t cursor = nullptr; - char *key; - AS_t elem; - xbt_dict_t routing_sons = from_as->children(); - - if (xbt_dict_is_empty(routing_sons)) { +void Container::create_hierarchy(const_sg_netzone_t from_as) +{ + if (from_as->get_children().empty()) { // I am no AS // add hosts to jedule platform - xbt_dynar_t table = from_as->hosts(); - unsigned int dynar_cursor; - sg_host_t host; - - std::vector hosts; - - xbt_dynar_foreach(table, dynar_cursor, host) { - hosts.push_back(host); - } - this->addResources(hosts); - xbt_dynar_free(&table); + std::vector table = from_as->get_all_hosts(); + this->add_resources(table); } else { - xbt_dict_foreach(routing_sons, cursor, key, elem) { - jed_container_t child_container = new simgrid::jedule::Container(std::string(elem->name())); - this->addChild(child_container); - child_container->createHierarchy(elem); + for (auto const& nz : from_as->get_children()) { + auto* child_container = new simgrid::jedule::Container(nz->get_name()); + this->add_child(child_container); + child_container->create_hierarchy(nz); } } } -std::vector Container::getHierarchy() { - xbt_assert( this!= nullptr ); - - if(this->parent != nullptr ) { - - if(!this->parent->children.empty()) { - // we are in the last level - return this->parent->getHierarchy(); - } else { - unsigned int i =0; - int child_nb = -1; - - for (auto child : this->parent->children) { - if( child == this) { - child_nb = i; - break; - } - i++; - } +int Container::get_child_position(const Container* child) const +{ + auto it = std::find_if(begin(children_), end(children_), + [&child](const std::unique_ptr& c) { return c.get() == child; }); + return it == end(children_) ? -1 : static_cast(std::distance(begin(children_), it)); +} - xbt_assert( child_nb > - 1); - std::vector heir_list = this->parent->getHierarchy(); - heir_list.insert(heir_list.begin(), child_nb); - return heir_list; - } - } else { +std::vector Container::get_hierarchy() +{ + if (parent_ == nullptr) { int top_level = 0; - std::vector heir_list = {top_level}; - return heir_list; + std::vector hier_list = {top_level}; + return hier_list; + } else if (parent_->has_children()) { + int child_nb = parent_->get_child_position(this); + xbt_assert(child_nb > -1); + std::vector hier_list = parent_->get_hierarchy(); + hier_list.insert(hier_list.begin(), child_nb); + return hier_list; + } else { + // we are in the last level + return parent_->get_hierarchy(); } } -std::string Container::getHierarchyAsString(){ +std::string Container::get_hierarchy_as_string() +{ std::string output(""); - std::vector heir_list = this->getHierarchy(); + std::vector hier_list = this->get_hierarchy(); - unsigned int length = heir_list.size(); - unsigned int i = 0; - for (auto id : heir_list) { + bool sep = false; + for (auto const& id : hier_list) { + if (sep) + output += '.'; + else + sep = true; output += std::to_string(id); - if( i != length-1 ) { - output += "."; - } } return output; } -void Container::printResources(FILE * jed_file){ - unsigned int res_nb; - unsigned int i=0; - xbt_assert(!this->resource_list.empty()); - - res_nb = this->resource_list.size(); +void Container::print_resources(FILE* jed_file) +{ + xbt_assert(not this->resource_list.empty()); - std::string resid = this->getHierarchyAsString(); + std::string resid = this->get_hierarchy_as_string(); - fprintf(jed_file, " resource_list) { + fprintf(jed_file, " resource_list.size()); + bool sep = false; + for (auto const& res : this->resource_list) { + if (sep) + putc('|', jed_file); + else + sep = true; const char * res_name = sg_host_get_name(res); fprintf(jed_file, "%s", res_name); - if( i != res_nb-1 ) { - fprintf(jed_file, "|"); - } - i++; } fprintf(jed_file, "\" />\n"); } -void Container::print(FILE* jed_file) { - xbt_assert( this != nullptr ); +void Container::print(FILE* jed_file) +{ fprintf(jed_file, " \n", this->name.c_str()); - if( !this->children.empty()){ - for (auto child: this->children) { + if (not children_.empty()) { + for (auto const& child : children_) { child->print(jed_file); } } else { - this->printResources(jed_file); + this->print_resources(jed_file); } fprintf(jed_file, " \n"); } +} // namespace jedule +} // namespace simgrid -} -} - -static int compare_ids(const void *num1, const void *num2) { - return *((int*) num1) - *((int*) num2); -} - -static void jed_free_container(jed_container_t container) { - if(!container->children.empty()) { - for (auto child: container->children){ - jed_free_container(child); - } - } - delete container; -} - -static void add_subset_to(xbt_dynar_t subset_list, int start, int end, jed_container_t parent) { - jed_res_subset_t subset; - - xbt_assert( subset_list != nullptr ); - xbt_assert( parent != nullptr ); - - subset = xbt_new0(s_jed_res_subset_t,1); - subset->start_idx = start; - subset->nres = end-start+1; - subset->parent = parent; - - xbt_dynar_push(subset_list, &subset); -} - -static void add_subsets_to(xbt_dynar_t subset_list, xbt_dynar_t hostgroup, jed_container_t parent) { - unsigned int iter; - char *host_name; - xbt_dynar_t id_list; - int *id_ar; - int nb_ids; - int id; - +static void add_subsets_to(std::vector& subset_list, const std::vector& hostgroup, + jed_container_t parent) +{ // get ids for each host // sort ids // compact ids // create subset for each id group - xbt_assert( host2_simgrid_parent_container != nullptr ); - xbt_assert( subset_list != nullptr ); - xbt_assert( hostgroup != nullptr ); xbt_assert( parent != nullptr ); - id_list = xbt_dynar_new(sizeof(int), nullptr); + std::vector id_list; - xbt_dynar_foreach(hostgroup, iter, host_name) { - jed_container_t parent; + for (auto const& host_name : hostgroup) { xbt_assert( host_name != nullptr ); - parent = (jed_container_t)xbt_dict_get(host2_simgrid_parent_container, host_name); - id = parent->name2id.at(host_name); - xbt_dynar_push(id_list, &id); + const simgrid::jedule::Container* parent_cont = host2_simgrid_parent_container.at(host_name); + unsigned int id = parent_cont->get_id_by_name(host_name); + id_list.push_back(id); } - nb_ids = xbt_dynar_length(id_list); - xbt_dynar_sort(id_list, &compare_ids); - - id_ar = static_cast(xbt_dynar_to_array(id_list)); - - if( nb_ids > 0 ) { - int start = 0; - int pos; - int i; - - pos = start; - for(i=0; i 1 ) { - add_subset_to( subset_list, id_ar[start], id_ar[pos], parent ); - start = i; - - if( i == nb_ids-1 ) { - add_subset_to( subset_list, id_ar[i], id_ar[i], parent ); - } - } else { - if( i == nb_ids-1 ) { - add_subset_to( subset_list, id_ar[start], id_ar[i], parent ); - } + std::sort(id_list.begin(), id_list.end()); + + size_t nb_ids = id_list.size(); + size_t start = 0; + size_t pos = start; + for (size_t i = 0; i < nb_ids; i++) { + if (id_list[i] - id_list[pos] > 1) { + subset_list.emplace_back(id_list[start], id_list[pos], parent); + start = i; + + if (i == nb_ids - 1) { + subset_list.emplace_back(id_list[i], id_list[i], parent); + } + } else { + if (i == nb_ids - 1) { + subset_list.emplace_back(id_list[start], id_list[i], parent); } - - pos = i; } + pos = i; } - - xbt_free(id_ar); } -void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, std::vector *host_list) { - std::unordered_map parent2hostgroup; // group hosts by parent - - xbt_assert( host_list != nullptr ); - +void get_resource_selection_by_hosts(std::vector& subset_list, + const std::vector& host_list) +{ // for each host name // find parent container // group by parent container - - for (auto host: *host_list) { + std::unordered_map> parent2hostgroup; + for (auto const& host : host_list) { const char *host_name = sg_host_get_name(host); - jed_container_t parent = (jed_container_t)xbt_dict_get(host2_simgrid_parent_container, host_name); + const simgrid::jedule::Container* parent = host2_simgrid_parent_container.at(host_name); xbt_assert( parent != nullptr ); - auto host_group = parent2hostgroup.find(parent->name.c_str()); - if (host_group == parent2hostgroup.end()){ - xbt_dynar_t group = xbt_dynar_new(sizeof(char*), nullptr); - xbt_dynar_push(group, &host_name); - parent2hostgroup.insert({parent->name.c_str(), group}); - } else { - xbt_dynar_push(host_group->second, &host_name); - } + auto host_group = parent2hostgroup.find(parent->get_cname()); + if (host_group == parent2hostgroup.end()) + parent2hostgroup.insert({parent->get_cname(), std::vector(1, host_name)}); + else + host_group->second.push_back(host_name); } - for (auto elm: parent2hostgroup) { - jed_container_t parent = (jed_container_t)xbt_dict_get(container_name2container, elm.first); + for (auto const& elm : parent2hostgroup) { + jed_container_t parent = container_name2container.at(elm.first); add_subsets_to(subset_list, elm.second, parent); - xbt_dynar_free_container(&elm.second); } - - } -void jedule_add_meta_info(jedule_t jedule, char *key, char *value) { - xbt_assert(key != nullptr); - xbt_assert(value != nullptr); - - jedule->jedule_meta_info.insert({key, value}); -} - -void jed_create_jedule(jedule_t *jedule) { - *jedule = xbt_new0(s_jedule_t,1); - host2_simgrid_parent_container = xbt_dict_new_homogeneous(nullptr); - container_name2container = xbt_dict_new_homogeneous(nullptr); -} - -void jed_free_jedule(jedule_t jedule) { - jed_free_container(jedule->root_container); - - xbt_free(jedule); - - xbt_dict_free(&host2_simgrid_parent_container); - xbt_dict_free(&container_name2container); -} #endif