Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Enhance graphicator program
[simgrid.git] / src / instr / instr_platform.cpp
index cbafbe5..0c78597 100644 (file)
@@ -203,8 +203,7 @@ void instr_new_value_for_user_state_type(const std::string& type_name, const cha
   recursiveNewValueForUserStateType(type_name, value, color, simgrid::instr::Container::get_root()->get_type());
 }
 
-namespace simgrid {
-namespace instr {
+namespace simgrid::instr {
 
 /** @brief Creates a file with the topology of the platform file used for the simulator.
  *
@@ -223,32 +222,52 @@ void platform_graph_export_graphviz(const std::string& output_filename)
   xbt_assert(not fs.fail(), "Failed to open %s", output_filename.c_str());
 
   if (g->directed)
-    fs << "digraph test {" << std::endl;
+    fs << "digraph test {\n";
   else
-    fs << "graph test {" << std::endl;
+    fs << "graph test {\n";
 
-  fs << "  graph [overlap=scale]" << std::endl;
+  fs << "  graph [overlap=scale]\n";
 
-  fs << "  node [shape=box, style=filled]" << std::endl;
-  fs << "  node [width=.3, height=.3, style=filled, color=skyblue]" << std::endl << std::endl;
+  fs << "  node [shape=box, style=filled]\n";
+  fs << "  node [width=.3, height=.3, style=filled, color=skyblue]\n\n";
 
   for (auto const& [node, _] : nodes)
-    fs << "  \"" << node << "\";" << std::endl;
+    fs << "  \"" << node << "\";\n";
 
   for (auto const& [_, edge] : edges) {
     const char* src_s = static_cast<char*>(edge->src->data);
     const char* dst_s = static_cast<char*>(edge->dst->data);
     if (g->directed)
-      fs << "  \"" << src_s << "\" -> \"" << dst_s << "\";" << std::endl;
+      fs << "  \"" << src_s << "\" -> \"" << dst_s << "\";\n";
     else
-      fs << "  \"" << src_s << "\" -- \"" << dst_s << "\";" << std::endl;
+      fs << "  \"" << src_s << "\" -- \"" << dst_s << "\";\n";
   }
-  fs << "}" << std::endl;
+  fs << "}\n";
   fs.close();
 
   xbt_graph_free_graph(g, xbt_free_f, xbt_free_f, nullptr);
 }
 
+void platform_graph_export_csv(const std::string& output_filename) {
+  auto* g         = xbt_graph_new_graph(0, nullptr);
+  std::map<std::string, xbt_node_t, std::less<>> nodes;
+  std::map<std::string, xbt_edge_t, std::less<>> edges;
+  s4u::Engine::get_instance()->get_netzone_root()->extract_xbt_graph(g, &nodes, &edges);
+
+  std::ofstream fs;
+  fs.open(output_filename, std::ofstream::out);
+  xbt_assert(not fs.fail(), "Failed to open %s", output_filename.c_str());
+
+  fs << "src,dst" << std::endl;
+  for (auto const& elm : edges) {
+    const char* src_s = static_cast<char*>(elm.second->src->data);
+    const char* dst_s = static_cast<char*>(elm.second->dst->data);
+    fs << src_s << "," << dst_s << std::endl;
+  }
+  fs.close();
+  xbt_graph_free_graph(g, xbt_free_f, xbt_free_f, nullptr);
+}
+
 /* Callbacks */
 static std::vector<NetZoneContainer*> currentContainer; /* push and pop, used only in creation */
 static void on_netzone_creation(s4u::NetZone const& netzone)
@@ -339,15 +358,11 @@ static void on_action_state_change(kernel::resource::Action const& action,
     double value = action.get_rate() * action.get_variable()->get_constraint_weight(i);
     /* Beware of composite actions: ptasks put links and cpus together. Extra pb: we cannot dynamic_cast from void* */
     kernel::resource::Resource* resource = action.get_variable()->get_constraint(i)->get_id();
-    const kernel::resource::CpuImpl* cpu = dynamic_cast<kernel::resource::CpuImpl*>(resource);
-
-    if (cpu != nullptr)
+    if (const auto* cpu = dynamic_cast<kernel::resource::CpuImpl*>(resource))
       resource_set_utilization("HOST", "speed_used", cpu->get_cname(), action.get_category(), value,
                                action.get_last_update(), simgrid_get_clock() - action.get_last_update());
 
-    const kernel::resource::StandardLinkImpl* link = dynamic_cast<kernel::resource::StandardLinkImpl*>(resource);
-
-    if (link != nullptr)
+    if (const auto* link = dynamic_cast<kernel::resource::StandardLinkImpl*>(resource))
       resource_set_utilization("LINK", "bandwidth_used", link->get_cname(), action.get_category(), value,
                                action.get_last_update(), simgrid_get_clock() - action.get_last_update());
   }
@@ -509,5 +524,4 @@ void define_callbacks()
         [](s4u::Host const& host) { Container::by_name(host.get_name())->remove_from_parent(); });
   }
 }
-} // namespace instr
-} // namespace simgrid
+} // namespace simgrid::instr