X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9a4a63964b6673ab9ba406356cfdffac2f6d2489..28576ce34587a14772cd232febbc64902cf1ef19:/src/s4u/s4u_Engine.cpp diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index e808263551..d994ec074c 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -107,28 +107,154 @@ const std::vector& Engine::get_all_models() c return pimpl->get_all_models(); } -/** - * Creates a new platform, including hosts, links, and the routing table. - * - * @beginrst - * See also: :ref:`platform`. - * @endrst - */ void Engine::load_platform(const std::string& platf) const { pimpl->load_platform(platf); } -/** - * @brief Seals the platform, finishing the creation of its resources. - * - * This method is optional. The seal() is done automatically when you call Engine::run. - */ void Engine::seal_platform() const { pimpl->seal_platform(); } +static void flatify_hosts(Engine const& engine, std::stringstream& ss) +{ + // Regular hosts + std::vector hosts = engine.get_all_hosts(); + + for (auto const* h : hosts) { + ss << " get_name() << "\" speed=\"" << h->get_speed() << "\""; + const std::unordered_map* props = h->get_properties(); + if (h->get_core_count() > 1) + ss << " core=\"" << h->get_core_count() << "\""; + + // Sort the properties before displaying them, so that the tests are perfectly reproducible + std::vector keys; + for (auto const& [key, _] : *props) + keys.push_back(key); + if (not keys.empty()) { + ss << ">\n"; + std::sort(keys.begin(), keys.end()); + for (const std::string& key : keys) + ss << " at(key) << "\"/>\n"; + ss << " \n"; + } else { + ss << "/>\n"; + } + } + + // Routers + std::vector netpoints = engine.get_all_netpoints(); + std::sort(netpoints.begin(), netpoints.end(), + [](const simgrid::kernel::routing::NetPoint* a, const simgrid::kernel::routing::NetPoint* b) { + return a->get_name() < b->get_name(); + }); + + for (auto const& src : netpoints) + if (src->is_router()) + ss << " get_name() << "\"/>\n"; +} + +static void flatify_links(Engine const& engine, std::stringstream& ss) +{ + std::vector links = engine.get_all_links(); + + std::sort(links.begin(), links.end(), [](const Link* a, const Link* b) { return a->get_name() < b->get_name(); }); + + for (auto const* link : links) { + ss << " get_name() << "\""; + ss << " bandwidth=\"" << link->get_bandwidth() << "\""; + ss << " latency=\"" << link->get_latency() << "\""; + if (link->get_concurrency_limit() != -1) + ss << " concurrency=\"" << link->get_concurrency_limit() << "\""; + if (link->is_shared()) { + ss << "/>\n"; + } else { + ss << " sharing_policy=\"FATPIPE\"/>\n"; + } + } +} + +static void flatify_routes(Engine const& engine, std::stringstream& ss) +{ + auto hosts = engine.get_all_hosts(); + auto netpoints = engine.get_all_netpoints(); + std::sort(netpoints.begin(), netpoints.end(), + [](const simgrid::kernel::routing::NetPoint* a, const simgrid::kernel::routing::NetPoint* b) { + return a->get_name() < b->get_name(); + }); + + for (auto const* src_host : hosts) { // Routes from host + const simgrid::kernel::routing::NetPoint* src = src_host->get_netpoint(); + for (auto const* dst_host : hosts) { // Routes to host + std::vector route; + const simgrid::kernel::routing::NetPoint* dst = dst_host->get_netpoint(); + simgrid::kernel::routing::NetZoneImpl::get_global_route(src, dst, route, nullptr); + if (route.empty()) + continue; + ss << " get_name() << "\" dst=\"" << dst_host->get_name() << "\">\n "; + for (auto const& link : route) + ss << "get_name() << "\"/>"; + ss << "\n \n"; + } + + for (auto const& dst : netpoints) { // to router + if (not dst->is_router()) + continue; + ss << " get_name() << "\" dst=\"" << dst->get_name() << "\">\n "; + std::vector route; + simgrid::kernel::routing::NetZoneImpl::get_global_route(src, dst, route, nullptr); + for (auto const& link : route) + ss << "get_name() << "\"/>"; + ss << "\n \n"; + } + } + + for (auto const& value1 : netpoints) { // Routes from router + if (not value1->is_router()) + continue; + for (auto const& value2 : netpoints) { // to router + if (not value2->is_router()) + continue; + std::vector route; + simgrid::kernel::routing::NetZoneImpl::get_global_route(value1, value2, route, nullptr); + if (route.empty()) + continue; + ss << " get_name() << "\" dst=\"" << value2->get_name() << "\">\n "; + for (auto const& link : route) + ss << "get_name() << "\"/>"; + ss << "\n \n"; + } + for (auto const* dst_host : hosts) { // Routes to host + ss << " get_name() << "\" dst=\"" << dst_host->get_name() << "\">\n "; + std::vector route; + const simgrid::kernel::routing::NetPoint* netcardDst = dst_host->get_netpoint(); + simgrid::kernel::routing::NetZoneImpl::get_global_route(value1, netcardDst, route, nullptr); + for (auto const& link : route) + ss << "get_name() << "\"/>"; + ss << "\n \n"; + } + } +} +std::string Engine::flatify_platform() const +{ + std::string version = "4.1"; + std::stringstream ss; + + ss << "\n"; + ss << "\n"; + ss << "\n"; + ss << "get_name() << "\" routing=\"Full\">\n"; + + flatify_hosts(*this, ss); + flatify_links(*this, ss); + flatify_routes(*this, ss); + + ss << "\n"; + ss << "\n"; + return ss.str(); +} + /** Registers the main function of an actor that will be launched from the deployment file */ void Engine::register_function(const std::string& name, const std::function& code) {