X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7f00b09c7ebfa3b4e12c96c764ee7a0e0e07ec20..8052f28d5b5a9d88b6724dff2e5e81dee10065d7:/src/dag/loaders.cpp diff --git a/src/dag/loaders.cpp b/src/dag/loaders.cpp index de7b4687f8..09591b1e83 100644 --- a/src/dag/loaders.cpp +++ b/src/dag/loaders.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2009-2023. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2023. 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. */ @@ -7,6 +6,8 @@ #include "src/internal_config.h" #include #include +#include +#include #include #include #include @@ -19,6 +20,16 @@ #include "dax_dtd.h" #include "dax_dtd.c" +#if SIMGRID_HAVE_JSON +// Disable implicit conversions. See https://github.com/nlohmann/json#implicit-conversions +#ifdef JSON_USE_IMPLICIT_CONVERSIONS +#undef JSON_USE_IMPLICIT_CONVERSIONS +#endif +#define JSON_USE_IMPLICIT_CONVERSIONS 0 +#include +#include +#endif + #if HAVE_GRAPHVIZ #include #endif @@ -79,6 +90,81 @@ static std::map> jobs; static std::map> files; static ExecPtr current_job; +/** @brief loads a JSON file describing a DAG + * + * See https://github.com/wfcommons/wfformat for more details. We support wfformat 1.4. + */ +std::vector create_DAG_from_json(const std::string& filename) +{ +#if SIMGRID_HAVE_JSON + std::ifstream f(filename); + auto data = nlohmann::json::parse(f); + std::vector dag = {}; + std::map, std::less<>> successors = {}; + std::map comms_destinations = {}; + ActivityPtr current; + + for (auto const& task: data["workflow"]["tasks"]) { + if (task["type"] == "compute") { + current = + Exec::init()->set_name(task["name"].get())->set_flops_amount(task["runtimeInSeconds"].get()); + if (task.contains("machine")) + dynamic_cast(current.get()) + ->set_host(simgrid::s4u::Engine::get_instance()->host_by_name(task["machine"].get())); + } + else if (task["type"] == "transfer"){ + current = Comm::sendto_init() + ->set_name(task["name"].get()) + ->set_payload_size(task["writtenBytes"].get()); + if (task.contains("machine")) + comms_destinations[current] = + simgrid::s4u::Engine::get_instance()->host_by_name(task["machine"].get()); + if (task["parents"].size() == 1) { + ActivityPtr parent_activity; + for (auto const& activity: dag) { + if (activity->get_name() == task["parents"][0]) { + parent_activity = activity; + break; + } + } + if (dynamic_cast(parent_activity.get()) != nullptr) + dynamic_cast(current.get())->set_source(dynamic_cast(parent_activity.get())->get_host()); + else if (dynamic_cast(parent_activity.get()) != nullptr) + dynamic_cast(current.get())->set_source(dynamic_cast(parent_activity.get())->get_destination()); + } + } else if (XBT_LOG_ISENABLED(dag_parsing, xbt_log_priority_debug)) { + std::stringstream ss; + ss << task["type"]; + XBT_DEBUG("Task type \"%s\" not supported.", ss.str().c_str()); + } + + dag.push_back(current); + for (auto const& parent : task["parents"]) + successors[parent.get()].push_back(current); + } + // Assign successors + for (auto const& [parent, successors_list] : successors) + for (auto const& activity: dag) + if (activity->get_name() == parent) { + for (auto const& successor: successors_list) + activity->add_successor(successor); + break; + } + // Assign destinations of Comms (if done before successors are assigned there is a bug) + for (auto const& [comm, destination]: comms_destinations) + dynamic_cast(comm.get())->set_destination(destination); + + // Start only Activities with dependencies solved + for (auto const& activity: dag) { + if (dynamic_cast(activity.get()) != nullptr && activity->dependencies_solved()) + activity->start(); + } + return dag; +#else + xbt_die("JSON support was not compiled in, probably because nlohmann/json was not found. Please install " + "nlohmann-json3-dev and recompile SimGrid to use this feature."); +#endif +} /** @brief loads a DAX file describing a DAG * * See https://confluence.pegasus.isi.edu/display/pegasus/WorkflowGenerator for more details.