Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pini@ethernium.org>
Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pini@tuxfamily.org>
Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pnclauss@griffon-82.nancy.grid5000.fr>
-Tom Cornebize <tom.cornebize@ensimag.grenoble-inp.fr> <Ezibenroc@users.noreply.github.com>
+Tom Cornebize <tom.cornebize@intel.com> <tom.cornebize@ensimag.grenoble-inp.fr>
+Tom Cornebize <tom.cornebize@intel.com> <tom.cornebize@gmail.com>
+Tom Cornebize <tom.cornebize@intel.com> <Ezibenroc@users.noreply.github.com>
Gabriel Corona <gabriel.corona@loria.fr> <coron00b@barbecue.loria.fr>
Gabriel Corona <gabriel.corona@loria.fr> <gabriel.corona@enst-bretagne.fr>
Clément Courageux-Sudan <clement.courageux-sudan@inria.fr> <clement.courageux-sudan@ens-rennes.fr>
include examples/smpi/mc/non_termination3.c
include examples/smpi/mc/non_termination4.c
include examples/smpi/mc/only_send_deterministic.c
+include examples/smpi/mc/only_send_deterministic.tesh
include examples/smpi/mc/promela_bugged1_liveness
include examples/smpi/mc/sendsend.c
include examples/smpi/mc/sendsend.tesh
include teshsuite/s4u/cloud-two-execs/cloud-two-execs-bmf.tesh
include teshsuite/s4u/cloud-two-execs/cloud-two-execs.cpp
include teshsuite/s4u/cloud-two-execs/cloud-two-execs.tesh
+include teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.cpp
+include teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.tesh
include teshsuite/s4u/comm-get-sender/comm-get-sender.cpp
include teshsuite/s4u/comm-get-sender/comm-get-sender.tesh
include teshsuite/s4u/comm-pt2pt/comm-pt2pt.cpp
include examples/platforms/small_platform_with_routers.xml
include examples/platforms/storage/content/small_content.txt
include examples/platforms/storage/content/storage_content.txt
+include examples/platforms/supernode.cpp
+include examples/platforms/supernode.py
+include examples/platforms/supernode.svg
include examples/platforms/syscoord/generate_peer_platform.pl
include examples/platforms/syscoord/median_harvard.syscoord
include examples/platforms/syscoord/median_meridian.syscoord
include examples/smpi/CMakeLists.txt
include examples/smpi/NAS/CMakeLists.txt
include examples/smpi/comm_dynamic_costs/CMakeLists.txt
-include examples/smpi/mc/only_send_deterministic.tesh
include examples/smpi/replay_multiple/CMakeLists.txt
include examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
include examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
Describing your Simulated Platform
##################################
-In SimGrid, platforms are usually described in XML. This formalis has
+In SimGrid, platforms are usually described in XML. This formalism has
some drawbacks, but using a specific format ensures that the platform
is not mixed with the tested application. This separation of concern
:ref:`is a must <howto_science>` for your Modeling and Simulation (M&S)
add_custom_target(platf_cpp COMMENT "C++ platform description")
add_dependencies(tests platf_cpp)
-foreach (platf routing_cluster griffon)
+foreach (platf griffon routing_cluster supernode)
add_library (${platf} SHARED ${platf}.cpp)
target_link_libraries(${platf} simgrid)
add_dependencies(platf_cpp ${platf})
--- /dev/null
+/* Copyright (c) 2006-2022. 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/s4u.hpp>
+namespace sg4 = simgrid::s4u;
+
+constexpr double BW_CPU = 1e12;
+constexpr double LAT_CPU = 0;
+
+constexpr double BW_NODE = 1e11;
+constexpr double LAT_NODE = 1e-8;
+
+constexpr double BW_NETWORK = 1.25e10;
+constexpr double LAT_NETWORK = 1e-7;
+
+static std::string int_string(int n)
+{
+ return simgrid::xbt::string_printf("%02d", n);
+}
+
+/**
+ *
+ * This function creates one node made of nb_cpu CPUs.
+ */
+static sg4::NetZone* create_node(const sg4::NetZone* root, const std::string& node_name, const int nb_cpu)
+{
+ auto* node = sg4::create_star_zone(node_name);
+ node->set_parent(root);
+
+ /* create all hosts and connect them to outside world */
+ for (int i = 0; i < nb_cpu; i++) {
+ const auto& cpuname = node_name + "_cpu-" + int_string(i);
+ const auto& linkname = "link_" + cpuname;
+
+ const sg4::Host* host = node->create_host(cpuname, 1e9);
+ const sg4::Link* l = node->create_split_duplex_link(linkname, BW_CPU)->set_latency(LAT_CPU)->seal();
+
+ node->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {{l, sg4::LinkInRoute::Direction::UP}}, true);
+ }
+
+ return node;
+}
+
+/**
+ *
+ * This function creates one super-node made of nb_nodes nodes with nb_cpu CPUs.
+ */
+static sg4::NetZone* create_supernode(const sg4::NetZone* root, const std::string& supernode_name, const int nb_nodes,
+ const int nb_cpu)
+{
+ auto* supernode = sg4::create_star_zone(supernode_name);
+ supernode->set_parent(root);
+
+ /* create all nodes and connect them to outside world */
+ for (int i = 0; i < nb_nodes; i++) {
+ const auto& node_name = supernode_name + "_node-" + int_string(i);
+ const auto& linkname = "link_" + node_name;
+
+ sg4::NetZone* node = create_node(supernode, node_name, nb_cpu);
+ const auto router = node->create_router("router_" + node_name);
+ node->seal();
+
+ const sg4::Link* l = supernode->create_split_duplex_link(linkname, BW_NODE)->set_latency(LAT_NODE)->seal();
+ supernode->add_route(node->get_netpoint(), nullptr, router, nullptr, {{l, sg4::LinkInRoute::Direction::UP}}, true);
+ }
+ return supernode;
+}
+
+/**
+ *
+ * This function creates one cluster of nb_supernodes super-nodes made of nb_nodes nodes with nb_cpu CPUs.
+ */
+static sg4::NetZone* create_cluster(const std::string& cluster_name, const int nb_supernodes, const int nb_nodes,
+ const int nb_cpu)
+{
+ auto* cluster = sg4::create_star_zone(cluster_name);
+
+ /* create all supernodes and connect them to outside world */
+ for (int i = 0; i < nb_supernodes; i++) {
+ const auto& supernode_name = cluster_name + "_supernode-" + int_string(i);
+ const auto& linkname = "link_" + supernode_name;
+
+ sg4::NetZone* supernode = create_supernode(cluster, supernode_name, nb_nodes, nb_cpu);
+ const auto router = supernode->create_router("router_" + supernode_name);
+ supernode->seal();
+
+ const sg4::Link* l = cluster->create_split_duplex_link(linkname, BW_NETWORK)->set_latency(LAT_NETWORK)->seal();
+ cluster->add_route(supernode->get_netpoint(), nullptr, router, nullptr, {{l, sg4::LinkInRoute::Direction::UP}},
+ true);
+ }
+ return cluster;
+}
+
+extern "C" void load_platform(const sg4::Engine& e);
+void load_platform(const sg4::Engine&)
+{
+ create_cluster("cluster", 4, 6, 2)->seal();
+}
--- /dev/null
+#! /usr/bin/env python3
+
+# Copyright (c) 2006-2022. 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.
+
+
+# This script takes as input a C++ platform file, compiles it, then dumps the
+# routing graph as a CSV and generates an image.
+# The layout should be alright for any platform file, but the colors are very
+# ad-hoc for file supernode.cpp : do not hesitate to adapt this script to your needs.
+# An option is provided to "simplify" the graph by removing the link vertices. It assumes that these vertices have
+# "link" in their name.
+
+import sys
+import subprocess
+import pandas
+import matplotlib.pyplot as plt
+import networkx as nx
+import argparse
+import tempfile
+import os
+
+try:
+ from palettable.colorbrewer.qualitative import Set1_9
+ colors = Set1_9.hex_colors
+except ImportError:
+ print('Warning: could not import palettable, will use a default palette.')
+ colors = [None]*10
+
+
+def run_command(cmd):
+ print(cmd)
+ proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ _stdout, stderr = proc.communicate()
+ if proc.returncode != 0:
+ sys.exit(f'Command failed:\n{stderr.decode()}')
+
+
+def compile_platform(platform_cpp, platform_so):
+ cmd = f'g++ -g -fPIC -shared -o {platform_so} {platform_cpp} -lsimgrid'
+ run_command(cmd)
+
+
+def dump_csv(platform_so, platform_csv):
+ cmd = f'graphicator {platform_so} {platform_csv}'
+ run_command(cmd)
+
+
+def merge_updown(graph):
+ '''
+ Merge all the UP and DOWN links.
+ '''
+ graph2 = graph.copy()
+ downlinks = [v for v in graph if 'DOWN' in v]
+ mapping = {}
+ for down in downlinks:
+ up = down.replace('DOWN', 'UP')
+ graph2 = nx.contracted_nodes(graph2, down, up)
+ mapping[down] = down.replace('_DOWN', '')
+ return nx.relabel_nodes(graph2, mapping)
+
+
+def contract_links(graph):
+ '''
+ Remove all the 'link' vertices from the graph to directly connect the nodes.
+ Note: it assumes that link vertices have the "link" string in their name.
+ '''
+ links = [v for v in graph if 'link' in v]
+ new_edges = []
+ for v in links:
+ neigh = [u for u in graph.neighbors(v) if 'link' not in u] # with Floyd zones, we have links connected to links
+ assert len(neigh) == 2
+ new_edges.append(neigh)
+ # Adding edges from graph that have no links
+ for u, v in graph.edges:
+ if 'link' not in u and 'link' not in v:
+ new_edges.append((u, v))
+ return nx.from_edgelist(new_edges)
+
+
+def load_graph(platform_csv, simplify_graph):
+ edges = pandas.read_csv(platform_csv)
+ graph = nx.Graph()
+ graph.add_edges_from([e for _, e in edges.drop_duplicates().iterrows()])
+ print(f'Loaded a graph with {len(graph)} vertices with {len(graph.edges)} edges')
+ if simplify_graph:
+ graph = contract_links(merge_updown(graph))
+ print(f'Simplified the graph, it now has {len(graph)} vertices with {len(graph.edges)} edges')
+ return graph
+
+
+def plot_graph(graph, label=False, groups=None):
+ if groups is None:
+ groups = []
+ # First, we compute the graph layout, i.e. the position of the nodes.
+ # The neato algorithm from graphviz is nicer, but this is an extra-dependency.
+ # The spring_layout is also not too bad.
+ try:
+ pos = nx.nx_agraph.graphviz_layout(graph, 'neato')
+ except ImportError:
+ print('Warning: could not import pygraphviz, will use another layout algorithm.')
+ pos = nx.spring_layout(graph, k=0.5, iterations=1000, seed=42)
+ plt.figure(figsize=(20, 15))
+ plt.axis('off')
+ all_nodes = set(graph)
+ # We then iterate on all the specified groups, to plot each of them in the right color.
+ # Note that the order of the groups is important here, as we are looking at substrings in the node names.
+ for i, grp in enumerate(groups):
+ nodes = {u for u in all_nodes if grp in u}
+ all_nodes -= nodes
+ nx.draw_networkx_nodes(graph, pos, nodelist=nodes, node_size=50, node_color=colors[i], label=grp.replace('_', ''))
+ nx.draw_networkx_nodes(graph, pos, nodelist=all_nodes, node_size=50, node_color=colors[-1], label='unknown')
+ # Finally we draw the edges, the (optional) labels, and the legend.
+ nx.draw_networkx_edges(graph, pos, alpha=0.3)
+ if label:
+ nx.draw_networkx_labels(graph, pos)
+ plt.legend(scatterpoints=1)
+
+
+def generate_svg(platform_csv, output_file, simplify_graph):
+ graph = load_graph(platform_csv, simplify_graph)
+ plot_graph(graph, label=False, groups=['router', 'link', 'cpu', '_node', 'supernode', 'cluster'])
+ plt.savefig(output_file)
+ print(f'Generated file {output_file}')
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Visualization of topologies for SimGrid C++ platforms')
+ parser.add_argument('input', type=str, help='SimGrid C++ platform file name (input)')
+ parser.add_argument('output', type=str, help='File name of the output image')
+ parser.add_argument('--simplify', action='store_true', help='Simplify the topology (removing link vertices)')
+ args = parser.parse_args()
+ if not args.input.endswith('.cpp'):
+ parser.error(f'SimGrid platform must be a C++ file (with .cpp extension), got {args.input}')
+ if not os.path.isfile(args.input):
+ parser.error(f'File {args.input} not found')
+ output_dir = os.path.dirname(args.output)
+ if output_dir != '' and not os.path.isdir(output_dir):
+ parser.error(f'Not a directory: {output_dir}')
+ with tempfile.TemporaryDirectory() as tmpdirname:
+ platform_cpp = args.input
+ platform_csv = os.path.join(tmpdirname, 'platform.csv')
+ platform_so = os.path.join(tmpdirname, 'platform.so')
+ compile_platform(platform_cpp, platform_so)
+ dump_csv(platform_so, platform_csv)
+ generate_svg(platform_csv, args.output, args.simplify)
+
+
+if __name__ == '__main__':
+ main()
--- /dev/null
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440pt" height="1080pt" viewBox="0 0 1440 1080" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <cc:Work>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:date>2022-05-18T17:06:35.525617</dc:date>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Matplotlib v3.5.1, https://matplotlib.org/</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs>
+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 1080
+L 1440 1080
+L 1440 0
+L 0 0
+z
+" style="fill: #ffffff"/>
+ </g>
+ <g id="axes_1">
+ <g id="LineCollection_1">
+ <path d="M 1069.405072 401.473335
+L 1121.704069 374.683614
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1069.405072 401.473335
+L 1014.185826 423.2666
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1121.704069 374.683614
+L 1054.67109 386.617667
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1073.387229 425.717786
+L 1133.119586 420.384601
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1073.387229 425.717786
+L 1014.185826 423.2666
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1133.119586 420.384601
+L 1069.53781 440.107976
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1054.67109 386.617667
+L 1014.185826 423.2666
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1014.185826 423.2666
+L 1069.53781 440.107976
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1014.185826 423.2666
+L 946.223678 436.507952
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 946.223678 436.507952
+L 875.009434 443.440598
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 946.223678 436.507952
+L 887.022275 443.207859
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1048.631485 345.219872
+L 1091.373305 311.051835
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1048.631485 345.219872
+L 1006.022404 378.546087
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1091.373305 311.051835
+L 1032.968334 334.523791
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1065.82113 368.048082
+L 1125.420749 356.856812
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1065.82113 368.048082
+L 1006.022404 378.546087
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1125.420749 356.856812
+L 1071.197042 385.280657
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1032.968334 334.523791
+L 1006.022404 378.546087
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1006.022404 378.546087
+L 1071.197042 385.280657
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1006.022404 378.546087
+L 944.962661 404.974321
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 944.962661 404.974321
+L 881.181778 424.088614
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 944.962661 404.974321
+L 893.791942 424.430294
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 881.579994 252.17387
+L 908.924139 208.102055
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 881.579994 252.17387
+L 896.77856 298.820668
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 908.924139 208.102055
+L 903.28275 253.51088
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 936.334654 263.414659
+L 976.554441 229.395179
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 936.334654 263.414659
+L 896.77856 298.820668
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 976.554441 229.395179
+L 951.59959 274.903043
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 903.28275 253.51088
+L 896.77856 298.820668
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 896.77856 298.820668
+L 951.59959 274.903043
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 896.77856 298.820668
+L 869.301676 346.606401
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 869.301676 346.606401
+L 843.88224 385.627289
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 869.301676 346.606401
+L 850.585537 392.857048
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 808.374672 246.974386
+L 797.091893 201.763636
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 808.374672 246.974386
+L 820.984836 291.194759
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 797.091893 201.763636
+L 786.041407 250.193115
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 843.484024 247.321019
+L 867.310597 205.130921
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 843.484024 247.321019
+L 820.984836 291.194759
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 867.310597 205.130921
+L 862.39927 255.244042
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 786.041407 250.193115
+L 820.984836 291.194759
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 820.984836 291.194759
+L 862.39927 255.244042
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 820.984836 291.194759
+L 814.739486 343.585748
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 814.739486 343.585748
+L 816.00714 385.924402
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 814.739486 343.585748
+L 816.737202 395.679625
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 969.917513 282.479433
+L 1015.048627 247.023905
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 969.917513 282.479433
+L 963.745169 329.968052
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1015.048627 247.023905
+L 989.961037 288.570257
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1016.309643 306.34754
+L 1069.205964 283.816443
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1016.309643 306.34754
+L 963.745169 329.968052
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1069.205964 283.816443
+L 1026.265036 320.6585
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 989.961037 288.570257
+L 963.745169 329.968052
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 963.745169 329.968052
+L 1026.265036 320.6585
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 963.745169 329.968052
+L 917.883993 369.087979
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 917.883993 369.087979
+L 872.487402 398.502201
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 917.883993 369.087979
+L 879.987131 405.147637
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 716.433301 271.981428
+L 717.17 219.788514
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 716.433301 271.981428
+L 759.546789 305.406681
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 717.17 219.788514
+L 740.027582 258.413251
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 785.278161 262.02813
+L 767.856223 214.787105
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 785.278161 262.02813
+L 759.546789 305.406681
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 767.856223 214.787105
+L 756.002669 267.524727
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 740.027582 258.413251
+L 759.546789 305.406681
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 759.546789 305.406681
+L 756.002669 267.524727
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 759.546789 305.406681
+L 774.340502 356.114028
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 774.340502 356.114028
+L 793.401761 397.808937
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 774.340502 356.114028
+L 795.870698 406.707482
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 875.009434 443.440598
+L 837.577157 423.885586
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 881.181778 424.088614
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 843.88224 385.627289
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 816.00714 385.924402
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 872.487402 398.502201
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 793.401761 397.808937
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 802.268698 466.422316
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 887.022275 443.207859
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 893.791942 424.430294
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 850.585537 392.857048
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 816.737202 395.679625
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 879.987131 405.147637
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 837.577157 423.885586
+L 795.870698 406.707482
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 802.268698 466.422316
+L 765.07535 504.7747
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 802.268698 466.422316
+L 772.913563 508.429194
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 667.605417 844.424792
+L 681.171299 889.036364
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 667.605417 844.424792
+L 652.805067 799.630001
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 681.171299 889.036364
+L 688.445373 840.101793
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 631.905379 843.855325
+L 605.297932 885.224399
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 631.905379 843.855325
+L 652.805067 799.630001
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 605.297932 885.224399
+L 609.021249 834.070392
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 688.445373 840.101793
+L 652.805067 799.630001
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 652.805067 799.630001
+L 609.021249 834.070392
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 652.805067 799.630001
+L 658.824761 747.125118
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 658.824761 747.125118
+L 662.833466 698.814485
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 658.824761 747.125118
+L 653.170098 702.790852
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 509.062468 811.202566
+L 466.659132 848.53288
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 509.062468 811.202566
+L 512.361022 763.778322
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 466.659132 848.53288
+L 488.634002 806.191254
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 461.794263 788.899257
+L 410.69655 813.757741
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 461.794263 788.899257
+L 512.361022 763.778322
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 410.69655 813.757741
+L 450.099995 775.222138
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 488.634002 806.191254
+L 512.361022 763.778322
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 512.361022 763.778322
+L 450.099995 775.222138
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 512.361022 763.778322
+L 556.57624 723.583836
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 556.57624 723.583836
+L 600.539254 693.689279
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 556.57624 723.583836
+L 594.512923 686.291157
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 402.134912 653.524505
+L 339.402664 673.723261
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 402.134912 653.524505
+L 457.453712 669.84098
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 339.402664 673.723261
+L 398.922639 668.092963
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 416.862257 705.801601
+L 350.778359 718.924108
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 416.862257 705.801601
+L 457.453712 669.84098
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 350.778359 718.924108
+L 402.280925 692.322558
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 398.922639 668.092963
+L 457.453712 669.84098
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 457.453712 669.84098
+L 402.280925 692.322558
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 457.453712 669.84098
+L 524.878269 655.757807
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 524.878269 655.757807
+L 595.315992 647.047433
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 524.878269 655.757807
+L 583.688093 649.047997
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 530.360372 821.284613
+L 510.595599 867.764532
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 530.360372 821.284613
+L 583.933659 794.579074
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 510.595599 867.764532
+L 547.098706 831.28743
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 581.531091 841.087219
+L 585.347325 886.858523
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 581.531091 841.087219
+L 583.933659 794.579074
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 585.347325 886.858523
+L 606.353204 840.517751
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 547.098706 831.28743
+L 583.933659 794.579074
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 583.933659 794.579074
+L 606.353204 840.517751
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 583.933659 794.579074
+L 607.992525 745.21864
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 607.992525 745.21864
+L 625.241902 696.917911
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 607.992525 745.21864
+L 629.044862 705.687707
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 716.93107 831.658821
+L 713.108199 878.320475
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 716.93107 831.658821
+L 712.849359 783.655206
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 713.108199 878.320475
+L 694.119947 829.435423
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 757.920741 808.894986
+L 769.648194 860.482284
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 757.920741 808.894986
+L 712.849359 783.655206
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 769.648194 860.482284
+L 745.861442 820.076352
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 694.119947 829.435423
+L 712.849359 783.655206
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 712.849359 783.655206
+L 745.861442 820.076352
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 712.849359 783.655206
+L 698.991452 731.863395
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 698.991452 731.863395
+L 680.242129 688.509603
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 698.991452 731.863395
+L 672.622935 681.616573
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 403.482209 712.521315
+L 351.077021 741.707751
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 403.482209 712.521315
+L 468.298453 716.819555
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 351.077021 741.707751
+L 410.019583 728.610003
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 444.31923 760.901274
+L 387.288103 786.873934
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 444.31923 760.901274
+L 468.298453 716.819555
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 387.288103 786.873934
+L 426.638453 751.621433
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 410.019583 728.610003
+L 468.298453 716.819555
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 468.298453 716.819555
+L 426.638453 751.621433
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 468.298453 716.819555
+L 527.566225 688.742342
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 527.566225 688.742342
+L 580.674927 672.099042
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 527.566225 688.742342
+L 586.661437 664.6514
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 662.833466 698.814485
+L 634.015922 666.746049
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 600.539254 693.689279
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 595.315992 647.047433
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 625.241902 696.917911
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 680.242129 688.509603
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 580.674927 672.099042
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 670.160635 624.283598
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 653.170098 702.790852
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 594.512923 686.291157
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 583.688093 649.047997
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 629.044862 705.687707
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 672.622935 681.616573
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 634.015922 666.746049
+L 586.661437 664.6514
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 670.160635 624.283598
+L 700.252469 582.544122
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 670.160635 624.283598
+L 708.084045 586.193665
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1139.092821 604.926662
+L 1199.157025 597.340368
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1139.092821 604.926662
+L 1079.094987 614.142128
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1199.157025 597.340368
+L 1134.247864 589.229173
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1121.770438 650.68212
+L 1188.006985 661.383153
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1121.770438 650.68212
+L 1079.094987 614.142128
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1188.006985 661.383153
+L 1138.097282 633.900167
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1134.247864 589.229173
+L 1079.094987 614.142128
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1079.094987 614.142128
+L 1138.097282 633.900167
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1079.094987 614.142128
+L 1009.407238 606.640016
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1009.407238 606.640016
+L 945.294508 601.598993
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1009.407238 606.640016
+L 951.533221 609.546775
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 930.494157 793.489658
+L 966.001725 832.743285
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 930.494157 793.489658
+L 901.291672 752.156237
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 966.001725 832.743285
+L 950.471312 782.531127
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 878.726114 793.286631
+L 904.875613 841.0377
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 878.726114 793.286631
+L 901.291672 752.156237
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 904.875613 841.0377
+L 897.973207 796.386513
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 950.471312 782.531127
+L 901.291672 752.156237
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 901.291672 752.156237
+L 897.973207 796.386513
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 901.291672 752.156237
+L 883.106487 701.434034
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 883.106487 701.434034
+L 873.682049 648.315117
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 883.106487 701.434034
+L 873.814787 657.411738
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1089.846812 720.751355
+L 1136.172573 754.894632
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1089.846812 720.751355
+L 1025.667713 715.373603
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1136.172573 754.894632
+L 1080.953327 735.235631
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1037.879661 761.847085
+L 1086.992932 794.38595
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1037.879661 761.847085
+L 1025.667713 715.373603
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1086.992932 794.38595
+L 1057.259492 754.721316
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1080.953327 735.235631
+L 1025.667713 715.373603
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1025.667713 715.373603
+L 1057.259492 754.721316
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1025.667713 715.373603
+L 973.103238 680.814367
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 973.103238 680.814367
+L 935.670961 648.736028
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 973.103238 680.814367
+L 923.459013 649.052949
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 975.094317 791.013713
+L 989.496452 835.803553
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 975.094317 791.013713
+L 961.488613 746.511083
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 989.496452 835.803553
+L 952.130544 795.039599
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1006.486989 779.035093
+L 1051.750842 810.593484
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1006.486989 779.035093
+L 961.488613 746.511083
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1051.750842 810.593484
+L 1020.092693 766.635562
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 952.130544 795.039599
+L 961.488613 746.511083
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 961.488613 746.511083
+L 1020.092693 766.635562
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 961.488613 746.511083
+L 925.715569 701.072546
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 925.715569 701.072546
+L 896.181237 655.218051
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 925.715569 701.072546
+L 904.079182 661.917957
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1127.478196 642.45208
+L 1192.254619 657.505824
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1127.478196 642.45208
+L 1068.011317 660.442294
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1192.254619 657.505824
+L 1131.327615 662.94795
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1116.527264 690.232861
+L 1162.786656 719.61242
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1116.527264 690.232861
+L 1068.011317 660.442294
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1162.786656 719.61242
+L 1101.262329 701.508313
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1131.327615 662.94795
+L 1068.011317 660.442294
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1068.011317 660.442294
+L 1101.262329 701.508313
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1068.011317 660.442294
+L 1002.504832 641.050695
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1002.504832 641.050695
+L 947.949279 629.809906
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1002.504832 641.050695
+L 936.467393 622.902021
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1118.186497 580.325676
+L 1185.352213 571.011172
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1118.186497 580.325676
+L 1060.113372 562.677142
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1185.352213 571.011172
+L 1123.562409 564.568764
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1111.615937 542.235743
+L 1169.025369 528.018868
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1111.615937 542.235743
+L 1060.113372 562.677142
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1169.025369 528.018868
+L 1100.797744 529.999624
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1123.562409 564.568764
+L 1060.113372 562.677142
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1060.113372 562.677142
+L 1100.797744 529.999624
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 1060.113372 562.677142
+L 991.222053 573.378175
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 991.222053 573.378175
+L 925.250984 591.601128
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 991.222053 573.378175
+L 931.887912 585.589534
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 945.294508 601.598993
+L 899.632439 620.450835
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 873.682049 648.315117
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 935.670961 648.736028
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 896.181237 655.218051
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 947.949279 629.809906
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 925.250984 591.601128
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 842.820331 594.210774
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 951.533221 609.546775
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 873.814787 657.411738
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 923.459013 649.052949
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 904.079182 661.917957
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 936.467393 622.902021
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 899.632439 620.450835
+L 931.887912 585.589534
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 842.820331 594.210774
+L 786.386528 572.481883
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 842.820331 594.210774
+L 791.284581 566.62875
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 342.820682 513.905984
+L 276.842975 507.062472
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 342.820682 513.905984
+L 396.208135 485.605936
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 276.842975 507.062472
+L 336.595243 496.584274
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 345.959949 455.488544
+L 279.192448 453.923747
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 345.959949 455.488544
+L 396.208135 485.605936
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 279.192448 453.923747
+L 337.166019 470.106522
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 336.595243 496.584274
+L 396.208135 485.605936
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 396.208135 485.605936
+L 337.166019 470.106522
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 396.208135 485.605936
+L 466.665769 488.908846
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 466.665769 488.908846
+L 523.431418 487.779815
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 466.665769 488.908846
+L 535.80929 485.69507
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 431.470137 330.95843
+L 380.44543 300.949981
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 431.470137 330.95843
+L 445.945278 377.753785
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 380.44543 300.949981
+L 413.046023 339.574718
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 382.695349 374.782651
+L 332.845378 342.644889
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 382.695349 374.782651
+L 445.945278 377.753785
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 332.845378 342.644889
+L 389.285819 359.382275
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 413.046023 339.574718
+L 445.945278 377.753785
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 445.945278 377.753785
+L 389.285819 359.382275
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 445.945278 377.753785
+L 499.133623 411.203798
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 499.133623 411.203798
+L 548.638473 439.845526
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 499.133623 411.203798
+L 538.284865 444.089295
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 343.968871 440.702203
+L 283.161331 422.132618
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 343.968871 440.702203
+L 405.38037 428.183826
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 283.161331 422.132618
+L 343.809584 424.519428
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 370.536496 387.459488
+L 309.131633 371.811518
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 370.536496 387.459488
+L 405.38037 428.183826
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 309.131633 371.811518
+L 357.846688 400.284882
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 343.809584 424.519428
+L 405.38037 428.183826
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 405.38037 428.183826
+L 357.846688 400.284882
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 405.38037 428.183826
+L 470.070513 447.813116
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 470.070513 447.813116
+L 521.719091 464.406897
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 470.070513 447.813116
+L 534.110237 462.911427
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 494.885989 301.791802
+L 477.895452 257.472392
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 494.885989 301.791802
+L 510.044734 345.467466
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 477.895452 257.472392
+L 516.927229 296.839912
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 451.288005 327.194994
+L 416.868894 284.113557
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 451.288005 327.194994
+L 510.044734 345.467466
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 416.868894 284.113557
+L 463.619418 313.874412
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 516.927229 296.839912
+L 510.044734 345.467466
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 510.044734 345.467466
+L 463.619418 313.874412
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 510.044734 345.467466
+L 546.640758 390.331584
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 546.640758 390.331584
+L 575.949434 437.4191
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 546.640758 390.331584
+L 570.294771 428.679015
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 364.330967 549.975546
+L 307.532133 565.276884
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 364.330967 549.975546
+L 415.415406 527.999061
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 307.532133 565.276884
+L 376.104879 561.721427
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 356.997161 508.330156
+L 290.183202 520.417718
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 356.997161 508.330156
+L 415.415406 527.999061
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 290.183202 520.417718
+L 353.054826 527.117624
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 376.104879 561.721427
+L 415.415406 527.999061
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 415.415406 527.999061
+L 353.054826 527.117624
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 415.415406 527.999061
+L 484.147438 517.431729
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 484.147438 517.431729
+L 552.01667 500.47646
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 484.147438 517.431729
+L 540.548057 503.576342
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 541.38431 296.691356
+L 505.053763 258.46277
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 541.38431 296.691356
+L 571.648704 337.792038
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 505.053763 258.46277
+L 522.966833 308.080701
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 593.391282 296.097129
+L 565.86794 249.450331
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 593.391282 296.097129
+L 571.648704 337.792038
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 565.86794 249.450331
+L 573.878712 294.066854
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 522.966833 308.080701
+L 571.648704 337.792038
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 571.648704 337.792038
+L 573.878712 294.066854
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 571.648704 337.792038
+L 589.687876 388.25179
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 589.687876 388.25179
+L 600.917559 440.717058
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 589.687876 388.25179
+L 597.950852 431.897743
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 523.431418 487.779815
+L 574.124279 469.967869
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 548.638473 439.845526
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 521.719091 464.406897
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 575.949434 437.4191
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 552.01667 500.47646
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 600.917559 440.717058
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 630.92975 496.41591
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 535.80929 485.69507
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 538.284865 444.089295
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 534.110237 462.911427
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 570.294771 428.679015
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 540.548057 503.576342
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 574.124279 469.967869
+L 597.950852 431.897743
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 630.92975 496.41591
+L 687.044981 518.451818
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 630.92975 496.41591
+L 682.166839 524.319807
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 765.07535 504.7747
+L 736.675933 545.518845
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 700.252469 582.544122
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 786.386528 572.481883
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 687.044981 518.451818
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 772.913563 508.429194
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 708.084045 586.193665
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 791.284581 566.62875
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ <path d="M 736.675933 545.518845
+L 682.166839 524.319807
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+ </g>
+ <g id="PathCollection_1">
+ <defs>
+ <path id="mb9aa5dab14" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #e41a1c"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#mb9aa5dab14" x="869.301676" y="346.606401" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="499.133623" y="411.203798" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="973.103238" y="680.814367" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="658.824761" y="747.125118" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="883.106487" y="701.434034" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="698.991452" y="731.863395" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="925.715569" y="701.072546" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="917.883993" y="369.087979" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="1002.504832" y="641.050695" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="607.992525" y="745.21864" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="944.962661" y="404.974321" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="774.340502" y="356.114028" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="842.820331" y="594.210774" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="466.665769" y="488.908846" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="991.222053" y="573.378175" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="470.070513" y="447.813116" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="814.739486" y="343.585748" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="527.566225" y="688.742342" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="556.57624" y="723.583836" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="1009.407238" y="606.640016" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="670.160635" y="624.283598" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="630.92975" y="496.41591" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="484.147438" y="517.431729" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="546.640758" y="390.331584" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="589.687876" y="388.25179" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="946.223678" y="436.507952" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="524.878269" y="655.757807" style="fill: #e41a1c; stroke: #e41a1c"/>
+ <use xlink:href="#mb9aa5dab14" x="802.268698" y="466.422316" style="fill: #e41a1c; stroke: #e41a1c"/>
+ </g>
+ </g>
+ <g id="PathCollection_2">
+ <defs>
+ <path id="m0fa2a78f8a" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #377eb8"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#m0fa2a78f8a" x="600.917559" y="440.717058" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="975.094317" y="791.013713" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="950.471312" y="782.531127" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="893.791942" y="424.430294" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1020.092693" y="766.635562" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="595.315992" y="647.047433" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="523.431418" y="487.779815" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="904.079182" y="661.917957" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1037.879661" y="761.847085" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="364.330967" y="549.975546" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="843.88224" y="385.627289" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="947.949279" y="629.809906" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1139.092821" y="604.926662" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1048.631485" y="345.219872" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1089.846812" y="720.751355" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="548.638473" y="439.845526" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="816.00714" y="385.924402" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="416.862257" y="705.801601" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1127.478196" y="642.45208" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1116.527264" y="690.232861" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="521.719091" y="464.406897" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1080.953327" y="735.235631" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="931.887912" y="585.589534" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="716.433301" y="271.981428" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="843.484024" y="247.321019" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="357.846688" y="400.284882" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="785.278161" y="262.02813" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="936.467393" y="622.902021" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="426.638453" y="751.621433" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="337.166019" y="470.106522" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="989.961037" y="288.570257" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="516.927229" y="296.839912" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="586.661437" y="664.6514" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="793.401761" y="397.808937" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="786.386528" y="572.481883" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="356.997161" y="508.330156" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="816.737202" y="395.679625" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="463.619418" y="313.874412" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="925.250984" y="591.601128" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="850.585537" y="392.857048" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1054.67109" y="386.617667" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="593.391282" y="296.097129" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="875.009434" y="443.440598" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="336.595243" y="496.584274" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="376.104879" y="561.721427" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="522.966833" y="308.080701" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1069.53781" y="440.107976" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="389.285819" y="359.382275" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="451.288005" y="327.194994" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="573.878712" y="294.066854" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="878.726114" y="793.286631" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="682.166839" y="524.319807" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="952.130544" y="795.039599" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="745.861442" y="820.076352" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="403.482209" y="712.521315" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="896.181237" y="655.218051" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1134.247864" y="589.229173" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="879.987131" y="405.147637" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="791.284581" y="566.62875" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="808.374672" y="246.974386" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="581.531091" y="841.087219" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="410.019583" y="728.610003" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="786.041407" y="250.193115" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="382.695349" y="374.782651" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="631.905379" y="843.855325" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1138.097282" y="633.900167" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="951.533221" y="609.546775" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="969.917513" y="282.479433" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="667.605417" y="844.424792" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="402.280925" y="692.322558" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="625.241902" y="696.917911" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="694.119947" y="829.435423" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="494.885989" y="301.791802" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="594.512923" y="686.291157" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1121.770438" y="650.68212" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="552.01667" y="500.47646" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="535.80929" y="485.69507" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="862.39927" y="255.244042" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="873.814787" y="657.411738" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="345.959949" y="455.488544" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="583.688093" y="649.047997" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="772.913563" y="508.429194" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="872.487402" y="398.502201" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="370.536496" y="387.459488" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="708.084045" y="586.193665" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="716.93107" y="831.658821" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="756.002669" y="267.524727" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="353.054826" y="527.117624" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="795.870698" y="406.707482" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="580.674927" y="672.099042" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1071.197042" y="385.280657" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="431.470137" y="330.95843" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1131.327615" y="662.94795" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1016.309643" y="306.34754" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="680.242129" y="688.509603" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="606.353204" y="840.517751" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="672.622935" y="681.616573" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="629.044862" y="705.687707" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1123.562409" y="564.568764" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="653.170098" y="702.790852" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1032.968334" y="334.523791" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="930.494157" y="793.489658" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="687.044981" y="518.451818" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="575.949434" y="437.4191" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="765.07535" y="504.7747" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="444.31923" y="760.901274" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="897.973207" y="796.386513" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1026.265036" y="320.6585" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="402.134912" y="653.524505" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="740.027582" y="258.413251" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="757.920741" y="808.894986" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="540.548057" y="503.576342" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1101.262329" y="701.508313" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1006.486989" y="779.035093" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="570.294771" y="428.679015" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="887.022275" y="443.207859" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="461.794263" y="788.899257" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="923.459013" y="649.052949" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="534.110237" y="462.911427" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="413.046023" y="339.574718" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1073.387229" y="425.717786" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="547.098706" y="831.28743" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="688.445373" y="840.101793" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="398.922639" y="668.092963" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="935.670961" y="648.736028" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="951.59959" y="274.903043" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="597.950852" y="431.897743" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="936.334654" y="263.414659" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="343.809584" y="424.519428" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="530.360372" y="821.284613" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="450.099995" y="775.222138" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="662.833466" y="698.814485" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="700.252469" y="582.544122" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="600.539254" y="693.689279" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1057.259492" y="754.721316" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1100.797744" y="529.999624" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="488.634002" y="806.191254" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="945.294508" y="601.598993" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1065.82113" y="368.048082" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="609.021249" y="834.070392" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="538.284865" y="444.089295" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="541.38431" y="296.691356" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1118.186497" y="580.325676" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="903.28275" y="253.51088" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="509.062468" y="811.202566" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="343.968871" y="440.702203" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="881.181778" y="424.088614" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="881.579994" y="252.17387" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1069.405072" y="401.473335" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="1111.615937" y="542.235743" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="873.682049" y="648.315117" style="fill: #377eb8; stroke: #377eb8"/>
+ <use xlink:href="#m0fa2a78f8a" x="342.820682" y="513.905984" style="fill: #377eb8; stroke: #377eb8"/>
+ </g>
+ </g>
+ <g id="PathCollection_3">
+ <defs>
+ <path id="medb409181c" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #4daf4a"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#medb409181c" x="387.288103" y="786.873934" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1091.373305" y="311.051835" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="307.532133" y="565.276884" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="966.001725" y="832.743285" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="585.347325" y="886.858523" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1185.352213" y="571.011172" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="989.496452" y="835.803553" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="279.192448" y="453.923747" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="867.310597" y="205.130921" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="717.17" y="219.788514" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="477.895452" y="257.472392" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1051.750842" y="810.593484" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="565.86794" y="249.450331" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="339.402664" y="673.723261" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="351.077021" y="741.707751" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="769.648194" y="860.482284" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="416.868894" y="284.113557" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="713.108199" y="878.320475" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="350.778359" y="718.924108" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="466.659132" y="848.53288" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="904.875613" y="841.0377" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1086.992932" y="794.38595" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="908.924139" y="208.102055" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1162.786656" y="719.61242" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="681.171299" y="889.036364" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1069.205964" y="283.816443" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="510.595599" y="867.764532" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="797.091893" y="201.763636" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1121.704069" y="374.683614" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1199.157025" y="597.340368" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="276.842975" y="507.062472" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1136.172573" y="754.894632" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1169.025369" y="528.018868" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="309.131633" y="371.811518" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="767.856223" y="214.787105" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="332.845378" y="342.644889" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="505.053763" y="258.46277" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1188.006985" y="661.383153" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="283.161331" y="422.132618" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1015.048627" y="247.023905" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1133.119586" y="420.384601" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="410.69655" y="813.757741" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1125.420749" y="356.856812" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="380.44543" y="300.949981" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="290.183202" y="520.417718" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="605.297932" y="885.224399" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="1192.254619" y="657.505824" style="fill: #4daf4a; stroke: #4daf4a"/>
+ <use xlink:href="#medb409181c" x="976.554441" y="229.395179" style="fill: #4daf4a; stroke: #4daf4a"/>
+ </g>
+ </g>
+ <g id="PathCollection_4">
+ <defs>
+ <path id="m799437cb3c" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #984ea3"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#m799437cb3c" x="583.933659" y="794.579074" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="457.453712" y="669.84098" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1060.113372" y="562.677142" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="961.488613" y="746.511083" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1025.667713" y="715.373603" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="415.415406" y="527.999061" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="820.984836" y="291.194759" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="963.745169" y="329.968052" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="445.945278" y="377.753785" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="901.291672" y="752.156237" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1079.094987" y="614.142128" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1014.185826" y="423.2666" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="712.849359" y="783.655206" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1006.022404" y="378.546087" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="652.805067" y="799.630001" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="405.38037" y="428.183826" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="468.298453" y="716.819555" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="512.361022" y="763.778322" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="510.044734" y="345.467466" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="396.208135" y="485.605936" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="1068.011317" y="660.442294" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="759.546789" y="305.406681" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="571.648704" y="337.792038" style="fill: #984ea3; stroke: #984ea3"/>
+ <use xlink:href="#m799437cb3c" x="896.77856" y="298.820668" style="fill: #984ea3; stroke: #984ea3"/>
+ </g>
+ </g>
+ <g id="PathCollection_5">
+ <defs>
+ <path id="mb1229112c8" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #ff7f00"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#mb1229112c8" x="837.577157" y="423.885586" style="fill: #ff7f00; stroke: #ff7f00"/>
+ <use xlink:href="#mb1229112c8" x="574.124279" y="469.967869" style="fill: #ff7f00; stroke: #ff7f00"/>
+ <use xlink:href="#mb1229112c8" x="899.632439" y="620.450835" style="fill: #ff7f00; stroke: #ff7f00"/>
+ <use xlink:href="#mb1229112c8" x="634.015922" y="666.746049" style="fill: #ff7f00; stroke: #ff7f00"/>
+ </g>
+ </g>
+ <g id="PathCollection_6">
+ <defs>
+ <path id="m2956082287" d="M 0 3.535534
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534
+z
+" style="stroke: #ffff33"/>
+ </defs>
+ <g clip-path="url(#pa8cf324c9b)">
+ <use xlink:href="#m2956082287" x="736.675933" y="545.518845" style="fill: #ffff33; stroke: #ffff33"/>
+ </g>
+ </g>
+ <g id="legend_1">
+ <g id="patch_2">
+ <path d="M 1204.057812 225.66875
+L 1289 225.66875
+Q 1291 225.66875 1291 223.66875
+L 1291 136.6
+Q 1291 134.6 1289 134.6
+L 1204.057812 134.6
+Q 1202.057812 134.6 1202.057812 136.6
+L 1202.057812 223.66875
+Q 1202.057812 225.66875 1204.057812 225.66875
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+ </g>
+ <g id="PathCollection_7">
+ <g>
+ <use xlink:href="#mb9aa5dab14" x="1216.057812" y="143.573438" style="fill: #e41a1c; stroke: #e41a1c"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- router -->
+ <g transform="translate(1234.057812 146.198438)scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-72" d="M 2631 2963
+Q 2534 3019 2420 3045
+Q 2306 3072 2169 3072
+Q 1681 3072 1420 2755
+Q 1159 2438 1159 1844
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1341 3275 1631 3429
+Q 1922 3584 2338 3584
+Q 2397 3584 2469 3576
+Q 2541 3569 2628 3553
+L 2631 2963
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6f" d="M 1959 3097
+Q 1497 3097 1228 2736
+Q 959 2375 959 1747
+Q 959 1119 1226 758
+Q 1494 397 1959 397
+Q 2419 397 2687 759
+Q 2956 1122 2956 1747
+Q 2956 2369 2687 2733
+Q 2419 3097 1959 3097
+z
+M 1959 3584
+Q 2709 3584 3137 3096
+Q 3566 2609 3566 1747
+Q 3566 888 3137 398
+Q 2709 -91 1959 -91
+Q 1206 -91 779 398
+Q 353 888 353 1747
+Q 353 2609 779 3096
+Q 1206 3584 1959 3584
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-75" d="M 544 1381
+L 544 3500
+L 1119 3500
+L 1119 1403
+Q 1119 906 1312 657
+Q 1506 409 1894 409
+Q 2359 409 2629 706
+Q 2900 1003 2900 1516
+L 2900 3500
+L 3475 3500
+L 3475 0
+L 2900 0
+L 2900 538
+Q 2691 219 2414 64
+Q 2138 -91 1772 -91
+Q 1169 -91 856 284
+Q 544 659 544 1381
+z
+M 1991 3584
+L 1991 3584
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-74" d="M 1172 4494
+L 1172 3500
+L 2356 3500
+L 2356 3053
+L 1172 3053
+L 1172 1153
+Q 1172 725 1289 603
+Q 1406 481 1766 481
+L 2356 481
+L 2356 0
+L 1766 0
+Q 1100 0 847 248
+Q 594 497 594 1153
+L 594 3053
+L 172 3053
+L 172 3500
+L 594 3500
+L 594 4494
+L 1172 4494
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-65" d="M 3597 1894
+L 3597 1613
+L 953 1613
+Q 991 1019 1311 708
+Q 1631 397 2203 397
+Q 2534 397 2845 478
+Q 3156 559 3463 722
+L 3463 178
+Q 3153 47 2828 -22
+Q 2503 -91 2169 -91
+Q 1331 -91 842 396
+Q 353 884 353 1716
+Q 353 2575 817 3079
+Q 1281 3584 2069 3584
+Q 2775 3584 3186 3129
+Q 3597 2675 3597 1894
+z
+M 3022 2063
+Q 3016 2534 2758 2815
+Q 2500 3097 2075 3097
+Q 1594 3097 1305 2825
+Q 1016 2553 972 2059
+L 3022 2063
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-72"/>
+ <use xlink:href="#DejaVuSans-6f" x="38.863281"/>
+ <use xlink:href="#DejaVuSans-75" x="100.044922"/>
+ <use xlink:href="#DejaVuSans-74" x="163.423828"/>
+ <use xlink:href="#DejaVuSans-65" x="202.632812"/>
+ <use xlink:href="#DejaVuSans-72" x="264.15625"/>
+ </g>
+ </g>
+ <g id="PathCollection_8">
+ <g>
+ <use xlink:href="#m0fa2a78f8a" x="1216.057812" y="158.251563" style="fill: #377eb8; stroke: #377eb8"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- link -->
+ <g transform="translate(1234.057812 160.876563)scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-6c" d="M 603 4863
+L 1178 4863
+L 1178 0
+L 603 0
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-69" d="M 603 3500
+L 1178 3500
+L 1178 0
+L 603 0
+L 603 3500
+z
+M 603 4863
+L 1178 4863
+L 1178 4134
+L 603 4134
+L 603 4863
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6e" d="M 3513 2113
+L 3513 0
+L 2938 0
+L 2938 2094
+Q 2938 2591 2744 2837
+Q 2550 3084 2163 3084
+Q 1697 3084 1428 2787
+Q 1159 2491 1159 1978
+L 1159 0
+L 581 0
+L 581 3500
+L 1159 3500
+L 1159 2956
+Q 1366 3272 1645 3428
+Q 1925 3584 2291 3584
+Q 2894 3584 3203 3211
+Q 3513 2838 3513 2113
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-6b" d="M 581 4863
+L 1159 4863
+L 1159 1991
+L 2875 3500
+L 3609 3500
+L 1753 1863
+L 3688 0
+L 2938 0
+L 1159 1709
+L 1159 0
+L 581 0
+L 581 4863
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-6c"/>
+ <use xlink:href="#DejaVuSans-69" x="27.783203"/>
+ <use xlink:href="#DejaVuSans-6e" x="55.566406"/>
+ <use xlink:href="#DejaVuSans-6b" x="118.945312"/>
+ </g>
+ </g>
+ <g id="PathCollection_9">
+ <g>
+ <use xlink:href="#medb409181c" x="1216.057812" y="172.929688" style="fill: #4daf4a; stroke: #4daf4a"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- cpu -->
+ <g transform="translate(1234.057812 175.554688)scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-63" d="M 3122 3366
+L 3122 2828
+Q 2878 2963 2633 3030
+Q 2388 3097 2138 3097
+Q 1578 3097 1268 2742
+Q 959 2388 959 1747
+Q 959 1106 1268 751
+Q 1578 397 2138 397
+Q 2388 397 2633 464
+Q 2878 531 3122 666
+L 3122 134
+Q 2881 22 2623 -34
+Q 2366 -91 2075 -91
+Q 1284 -91 818 406
+Q 353 903 353 1747
+Q 353 2603 823 3093
+Q 1294 3584 2113 3584
+Q 2378 3584 2631 3529
+Q 2884 3475 3122 3366
+z
+" transform="scale(0.015625)"/>
+ <path id="DejaVuSans-70" d="M 1159 525
+L 1159 -1331
+L 581 -1331
+L 581 3500
+L 1159 3500
+L 1159 2969
+Q 1341 3281 1617 3432
+Q 1894 3584 2278 3584
+Q 2916 3584 3314 3078
+Q 3713 2572 3713 1747
+Q 3713 922 3314 415
+Q 2916 -91 2278 -91
+Q 1894 -91 1617 61
+Q 1341 213 1159 525
+z
+M 3116 1747
+Q 3116 2381 2855 2742
+Q 2594 3103 2138 3103
+Q 1681 3103 1420 2742
+Q 1159 2381 1159 1747
+Q 1159 1113 1420 752
+Q 1681 391 2138 391
+Q 2594 391 2855 752
+Q 3116 1113 3116 1747
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-63"/>
+ <use xlink:href="#DejaVuSans-70" x="54.980469"/>
+ <use xlink:href="#DejaVuSans-75" x="118.457031"/>
+ </g>
+ </g>
+ <g id="PathCollection_10">
+ <g>
+ <use xlink:href="#m799437cb3c" x="1216.057812" y="187.607813" style="fill: #984ea3; stroke: #984ea3"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- node -->
+ <g transform="translate(1234.057812 190.232813)scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-64" d="M 2906 2969
+L 2906 4863
+L 3481 4863
+L 3481 0
+L 2906 0
+L 2906 525
+Q 2725 213 2448 61
+Q 2172 -91 1784 -91
+Q 1150 -91 751 415
+Q 353 922 353 1747
+Q 353 2572 751 3078
+Q 1150 3584 1784 3584
+Q 2172 3584 2448 3432
+Q 2725 3281 2906 2969
+z
+M 947 1747
+Q 947 1113 1208 752
+Q 1469 391 1925 391
+Q 2381 391 2643 752
+Q 2906 1113 2906 1747
+Q 2906 2381 2643 2742
+Q 2381 3103 1925 3103
+Q 1469 3103 1208 2742
+Q 947 2381 947 1747
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-6e"/>
+ <use xlink:href="#DejaVuSans-6f" x="63.378906"/>
+ <use xlink:href="#DejaVuSans-64" x="124.560547"/>
+ <use xlink:href="#DejaVuSans-65" x="188.037109"/>
+ </g>
+ </g>
+ <g id="PathCollection_11">
+ <g>
+ <use xlink:href="#mb1229112c8" x="1216.057812" y="202.285938" style="fill: #ff7f00; stroke: #ff7f00"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- supernode -->
+ <g transform="translate(1234.057812 204.910938)scale(0.1 -0.1)">
+ <defs>
+ <path id="DejaVuSans-73" d="M 2834 3397
+L 2834 2853
+Q 2591 2978 2328 3040
+Q 2066 3103 1784 3103
+Q 1356 3103 1142 2972
+Q 928 2841 928 2578
+Q 928 2378 1081 2264
+Q 1234 2150 1697 2047
+L 1894 2003
+Q 2506 1872 2764 1633
+Q 3022 1394 3022 966
+Q 3022 478 2636 193
+Q 2250 -91 1575 -91
+Q 1294 -91 989 -36
+Q 684 19 347 128
+L 347 722
+Q 666 556 975 473
+Q 1284 391 1588 391
+Q 1994 391 2212 530
+Q 2431 669 2431 922
+Q 2431 1156 2273 1281
+Q 2116 1406 1581 1522
+L 1381 1569
+Q 847 1681 609 1914
+Q 372 2147 372 2553
+Q 372 3047 722 3315
+Q 1072 3584 1716 3584
+Q 2034 3584 2315 3537
+Q 2597 3491 2834 3397
+z
+" transform="scale(0.015625)"/>
+ </defs>
+ <use xlink:href="#DejaVuSans-73"/>
+ <use xlink:href="#DejaVuSans-75" x="52.099609"/>
+ <use xlink:href="#DejaVuSans-70" x="115.478516"/>
+ <use xlink:href="#DejaVuSans-65" x="178.955078"/>
+ <use xlink:href="#DejaVuSans-72" x="240.478516"/>
+ <use xlink:href="#DejaVuSans-6e" x="279.841797"/>
+ <use xlink:href="#DejaVuSans-6f" x="343.220703"/>
+ <use xlink:href="#DejaVuSans-64" x="404.402344"/>
+ <use xlink:href="#DejaVuSans-65" x="467.878906"/>
+ </g>
+ </g>
+ <g id="PathCollection_12">
+ <g>
+ <use xlink:href="#m2956082287" x="1216.057812" y="216.964063" style="fill: #ffff33; stroke: #ffff33"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- cluster -->
+ <g transform="translate(1234.057812 219.589063)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-63"/>
+ <use xlink:href="#DejaVuSans-6c" x="54.980469"/>
+ <use xlink:href="#DejaVuSans-75" x="82.763672"/>
+ <use xlink:href="#DejaVuSans-73" x="146.142578"/>
+ <use xlink:href="#DejaVuSans-74" x="198.242188"/>
+ <use xlink:href="#DejaVuSans-65" x="237.451172"/>
+ <use xlink:href="#DejaVuSans-72" x="298.974609"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="pa8cf324c9b">
+ <rect x="180" y="129.6" width="1116" height="831.6"/>
+ </clipPath>
+ </defs>
+</svg>
${CMAKE_CURRENT_SOURCE_DIR}/trace_simple/trace_simple.tesh
${CMAKE_CURRENT_SOURCE_DIR}/trace_call_location/trace_call_location.tesh
${CMAKE_CURRENT_SOURCE_DIR}/ampi_test/ampi_test.tesh
+ ${CMAKE_CURRENT_SOURCE_DIR}/mc/only_send_deterministic.tesh
${CMAKE_CURRENT_SOURCE_DIR}/mc/sendsend.tesh
${CMAKE_CURRENT_SOURCE_DIR}/replay/replay-override-replayer.tesh
${CMAKE_CURRENT_SOURCE_DIR}/replay/replay.tesh PARENT_SCOPE)
#include <xbt/base.h>
#include <xbt/sysdep.h>
+#include <xbt/utility.hpp>
namespace simgrid {
namespace config {
* @param desc Flag description
* @param value Flag initial/default value
*/
- Flag(const char* name, const char* desc, T value) : value_(value), name_(name)
+ Flag(const char* name, const char* desc, xbt::type_identity_t<T> value) : value_(value), name_(name)
{
simgrid::config::bind_flag(value_, name, desc);
}
/** Constructor taking also an array of aliases for name */
- Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value)
+ Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value)
: value_(value), name_(name)
{
simgrid::config::bind_flag(value_, name, aliases, desc);
/* A constructor accepting a callback that will be passed the parameter.
* It can either return a boolean (informing whether the parameter is valid), or returning void.
*/
- template <class F> Flag(const char* name, const char* desc, T value, F callback) : value_(value), name_(name)
+ template <class F>
+ Flag(const char* name, const char* desc, xbt::type_identity_t<T> value, F callback) : value_(value), name_(name)
{
simgrid::config::bind_flag(value_, name, desc, std::move(callback));
}
template <class F>
- Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value, F callback)
+ Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value,
+ F callback)
: value_(value), name_(name)
{
simgrid::config::bind_flag(value_, name, aliases, desc, std::move(callback));
* and producing an informative error message when an invalid value is passed, or when help is passed as a value.
*/
template <class F>
- Flag(const char* name, const char* desc, T value, const std::map<std::string, std::string, std::less<>>& valid_values,
- F callback)
+ Flag(const char* name, const char* desc, xbt::type_identity_t<T> value,
+ const std::map<std::string, std::string, std::less<>>& valid_values, F callback)
: value_(value), name_(name)
{
simgrid::config::bind_flag(value_, name, desc, valid_values, std::move(callback));
/* A constructor with everything */
template <class F>
- Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value,
+ Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value,
const std::map<std::string, std::string, std::less<>>& valid_values, F callback)
: value_(value), name_(name)
{
#include <array>
#include <functional>
#include <tuple>
+#include <type_traits>
#include <xbt/base.h>
/** @brief Helper macro to declare enum class
namespace simgrid {
namespace xbt {
+/** @brief Replacement for C++20's std::type_identity_t
+ */
+#if __cplusplus >= 201806L // __cpp_lib_type_identity
+template <class T> using type_identity_t = typename std::type_identity_t<T>;
+#else
+template <class T> struct type_identity {
+ using type = T;
+};
+
+template <class T> using type_identity_t = typename type_identity<T>::type;
+#endif
+
/** @brief A hash which works with more stuff
*
* It can hash pairs: the standard hash currently doesn't include this.
XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", time_delta, now_, next_event_date);
while (auto* event = profile::future_evt_set.pop_leq(next_event_date, &value, &resource)) {
+ if(value<0)
+ continue;
if (resource->is_used() || (watched_hosts().find(resource->get_cname()) != watched_hosts().end())) {
time_delta = next_event_date - now_;
XBT_DEBUG("This event invalidates the next_occurring_event() computation of models. Next event set to %f",
class XBT_PUBLIC ActivityImpl {
std::atomic_int_fast32_t refcount_{0};
- std::string name_ = "";
+ std::string name_ = "";
actor::ActorImpl* actor_ = nullptr;
State state_ = State::WAITING; /* State of the activity */
double start_time_ = -1.0;
double finish_time_ = -1.0;
+ std::vector<s4u::Host*> hosts_;
public:
virtual ~ActivityImpl();
name_ = name;
}
void set_start_time(double start_time) { start_time_ = start_time; }
+ void clear_hosts() { hosts_.clear(); }
+ void add_host(s4u::Host* host) { hosts_.push_back(host); }
+ void set_hosts(const std::vector<s4u::Host*>& hosts) { hosts_ = hosts; }
public:
const std::string& get_name() const { return name_; }
virtual void finish() = 0; // Unlock all simcalls blocked on that activity, either because it was marked as done by
// the model or because it terminated without waiting for the model
+ s4u::Host* get_host() const { return hosts_.front(); }
+ const std::vector<s4u::Host*>& get_hosts() const { return hosts_; };
+
void register_simcall(actor::Simcall* simcall);
void unregister_simcall(actor::Simcall* simcall);
void handle_activity_waitany(actor::Simcall* simcall);
#define SIMIX_H_NO_DEPRECATED_WARNING // avoid deprecation warning on include (remove with XBT_ATTRIB_DEPRECATED_v333)
#include <simgrid/simix.h>
+#include "src/kernel/EngineImpl.hpp"
#include "src/kernel/activity/CommImpl.hpp"
#include "src/kernel/activity/MailboxImpl.hpp"
#include "src/kernel/actor/SimcallObserver.hpp"
CommImpl& CommImpl::set_source(s4u::Host* from)
{
+ xbt_assert( from_ == nullptr );
from_ = from;
+ add_host(from);
return *this;
}
CommImpl& CommImpl::set_destination(s4u::Host* to)
{
+ xbt_assert( to_ == nullptr );
to_ = to;
+ add_host(to_);
return *this;
}
CommImpl& CommImpl::detach()
{
detached_ = true;
+ EngineImpl::get_instance()->get_maestro()->activities_.emplace_back(this);
return *this;
}
ExecImpl& ExecImpl::set_host(s4u::Host* host)
{
- hosts_.assign(1, host);
+ ActivityImpl::set_hosts({host});
return *this;
}
ExecImpl& ExecImpl::set_hosts(const std::vector<s4u::Host*>& hosts)
{
- hosts_ = hosts;
+ ActivityImpl::set_hosts(hosts);
return *this;
}
ExecImpl& ExecImpl::set_timeout(double timeout)
{
if (timeout >= 0 && not MC_is_active() && not MC_record_replay_is_active()) {
- timeout_detector_.reset(hosts_.front()->get_cpu()->sleep(timeout));
+ timeout_detector_.reset(get_host()->get_cpu()->sleep(timeout));
timeout_detector_->set_activity(this);
}
return *this;
{
set_state(State::RUNNING);
if (not MC_is_active() && not MC_record_replay_is_active()) {
- if (hosts_.size() == 1) {
+ if (get_hosts().size() == 1) {
if (thread_count_ == 1) {
- surf_action_ = hosts_.front()->get_cpu()->execution_start(flops_amounts_.front(), bound_);
+ surf_action_ = get_host()->get_cpu()->execution_start(flops_amounts_.front(), bound_);
surf_action_->set_sharing_penalty(sharing_penalty_);
} else {
- auto host_model = hosts_.front()->get_netpoint()->get_englobing_zone()->get_host_model();
- surf_action_ = host_model->execute_thread(hosts_.front(), flops_amounts_.front(), thread_count_);
+ auto host_model = get_host()->get_netpoint()->get_englobing_zone()->get_host_model();
+ surf_action_ = host_model->execute_thread(get_host(), flops_amounts_.front(), thread_count_);
}
surf_action_->set_category(get_tracing_category());
} else {
// get the model from first host since we have only 1 by now
- auto host_model = hosts_.front()->get_netpoint()->get_englobing_zone()->get_host_model();
- surf_action_ = host_model->execute_parallel(hosts_, flops_amounts_.data(), bytes_amounts_.data(), -1);
+ auto host_model = get_host()->get_netpoint()->get_englobing_zone()->get_host_model();
+ surf_action_ = host_model->execute_parallel(get_hosts(), flops_amounts_.data(), bytes_amounts_.data(), -1);
}
surf_action_->set_activity(this);
set_start_time(surf_action_->get_start_time());
void ExecImpl::post()
{
xbt_assert(surf_action_ != nullptr);
- if (std::any_of(hosts_.begin(), hosts_.end(), [](const s4u::Host* host) { return not host->is_on(); })) {
+ if (auto const& hosts = get_hosts();
+ std::any_of(hosts.begin(), hosts.end(), [](const s4u::Host* host) { return not host->is_on(); })) {
/* If one of the hosts running the synchro failed, notice it. This way, the asking
* process can be killed if it runs on that host itself */
set_state(State::FAILED);
void ExecImpl::reset()
{
- hosts_.clear();
+ clear_hosts();
bytes_amounts_.clear();
flops_amounts_.clear();
set_start_time(-1.0);
nullptr, [](resource::Action* a) { a->unref(); }};
double sharing_penalty_ = 1.0;
double bound_ = 0.0;
- std::vector<s4u::Host*> hosts_;
std::vector<double> flops_amounts_;
std::vector<double> bytes_amounts_;
int thread_count_ = 1;
ExecImpl& set_flops_amount(double flop_amount);
ExecImpl& set_host(s4u::Host* host);
- s4u::Host* get_host() const { return hosts_.front(); }
- const std::vector<s4u::Host*>& get_hosts() const { return hosts_; }
ExecImpl& set_flops_amounts(const std::vector<double>& flops_amounts);
ExecImpl& set_bytes_amounts(const std::vector<double>& bytes_amounts);
ExecImpl& set_thread_count(int thread_count);
ExecImpl& set_hosts(const std::vector<s4u::Host*>& hosts);
- unsigned int get_host_number() const { return static_cast<unsigned>(hosts_.size()); }
+ unsigned int get_host_number() const { return static_cast<unsigned>(get_hosts().size()); }
double get_seq_remaining_ratio();
double get_par_remaining_ratio();
double get_remaining() const override;
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "src/kernel/activity/MailboxImpl.hpp"
+#include "simgrid/msg.h"
#include "src/kernel/activity/CommImpl.hpp"
#include <unordered_map>
MailboxImpl::~MailboxImpl()
{
- clear();
+ clear(false);
set_receiver(nullptr);
}
/** @brief Removes all communication activities from a mailbox
*/
-void MailboxImpl::clear()
+void MailboxImpl::clear( bool do_post )
{
+ // CommImpl::cancel() will remove the comm from the mailbox..
for (auto comm : done_comm_queue_) {
comm->cancel();
- comm->set_state(State::DST_HOST_FAILURE);
+ comm->set_state(State::FAILED);
+ if(do_post)
+ comm->post();
}
done_comm_queue_.clear();
- // CommImpl::cancel() will remove the comm from the mailbox..
while (not comm_queue_.empty()) {
auto comm = comm_queue_.back();
if (comm->get_state() == State::WAITING && not comm->is_detached()) {
comm->cancel();
- comm->set_state(State::DST_HOST_FAILURE);
+ comm->set_state(State::FAILED);
+ if(do_post)
+ comm->post();
} else
comm_queue_.pop_back();
}
+ xbt_assert(comm_queue_.empty() && done_comm_queue_.empty());
}
CommImplPtr MailboxImpl::iprobe(int type, const std::function<bool(void*, void*, CommImpl*)>& match_fun, void* data)
void push(CommImplPtr comm);
void push_done(CommImplPtr done_comm) { done_comm_queue_.push_back(done_comm); }
void remove(const CommImplPtr& comm);
- void clear();
+ void clear(bool do_post );
CommImplPtr iprobe(int type, const std::function<bool(void*, void*, CommImpl*)>& match_fun, void* data);
CommImplPtr find_matching_comm(CommImplType type, const std::function<bool(void*, void*, CommImpl*)>& match_fun,
void* this_user_data, const CommImplPtr& my_synchro, bool done, bool remove_matching);
}
}
- std::vector<StochasticDatedValue> get_pattern() { return pattern; }
+ std::vector<StochasticDatedValue> get_pattern() const { return pattern; }
};
Profile* ProfileBuilder::from_string(const std::string& name, const std::string& input, double periodicity)
void RoutedZone::get_route_check_params(const NetPoint* src, const NetPoint* dst) const
{
- xbt_assert(src, "Cannot find a route from nullptr to %s", dst->get_cname());
- xbt_assert(dst, "Cannot find a route from %s to nullptr", src->get_cname());
+ xbt_assert(src, "Cannot have a route with (nullptr) source");
+ xbt_assert(dst, "Cannot have a route with (nullptr) destination");
const NetZoneImpl* src_as = src->get_englobing_zone();
const NetZoneImpl* dst_as = dst->get_englobing_zone();
"%s@%s). Please report that bug.",
src->get_cname(), dst->get_cname(), src_as->get_cname(), dst_as->get_cname(), get_cname());
}
+
void RoutedZone::add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) const
{
+ get_route_check_params(src, dst);
const char* srcName = src->get_cname();
const char* dstName = dst->get_cname();
if (not gw_dst || not gw_src) {
XBT_DEBUG("Load Route from \"%s\" to \"%s\"", srcName, dstName);
- xbt_assert(src, "Cannot add a route from %s to %s: %s does not exist.", srcName, dstName, srcName);
- xbt_assert(dst, "Cannot add a route from %s to %s: %s does not exist.", srcName, dstName, dstName);
xbt_assert(not link_list.empty(), "Empty route (between %s and %s) forbidden.", srcName, dstName);
xbt_assert(not src->is_netzone(),
"When defining a route, src cannot be a netzone such as '%s'. Did you meant to have a NetzoneRoute?",
#if SIMGRID_HAVE_MC
short type;
xbt_assert(stream >> type);
- xbt_assert(type >= 0 && type <= static_cast<short>(Transition::Type::UNKNOWN), "Invalid transition type %d received",
- type);
switch (auto simcall = static_cast<Transition::Type>(type)) {
case Transition::Type::BARRIER_LOCK:
case Transition::Type::UNKNOWN:
return new Transition(Transition::Type::UNKNOWN, issuer, times_considered);
+
+ default:
+ break;
}
- THROW_IMPOSSIBLE; // Some compilers don't detect that each branch of the above switch has a return
+ xbt_die("Invalid transition type %d received", type);
#else
xbt_die("Deserializing transitions is only interesting in MC mode.");
#endif
void Mailbox::clear()
{
- kernel::actor::simcall_answered([this]() { this->pimpl_->clear(); });
+ kernel::actor::simcall_answered([this]() { this->pimpl_->clear(true); });
}
} // namespace simgrid::s4u
issuer->kill(&actor);
}
for (const auto& activity : EngineImpl::get_instance()->get_maestro()->activities_) {
- auto* exec = dynamic_cast<activity::ExecImpl*>(activity.get());
- if (exec != nullptr) {
- auto hosts = exec->get_hosts();
- if (std::find(hosts.begin(), hosts.end(), &piface_) != hosts.end()) {
- exec->cancel();
- exec->set_state(activity::State::FAILED);
- }
+ auto const& hosts = activity->get_hosts();
+ if (std::find(hosts.begin(), hosts.end(), &piface_) != hosts.end()) {
+ activity->cancel();
+ activity->set_state(activity::State::FAILED);
}
}
// When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
static std::ifstream action_fs;
std::unordered_map<std::string, action_fun> action_funs;
-static std::unordered_map<std::string, std::queue<ReplayAction*>> action_queues;
+static std::unordered_map<std::string, std::queue<std::unique_ptr<ReplayAction>>> action_queues;
static void read_and_trim_line(std::ifstream& fs, std::string* line)
{
return not fs.eof();
}
-static ReplayAction* get_action(const char* name)
+static std::unique_ptr<ReplayAction> get_action(const char* name)
{
if (auto queue_elt = action_queues.find(std::string(name)); queue_elt != action_queues.end()) {
if (auto& my_queue = queue_elt->second; not my_queue.empty()) {
// Get something from my queue and return it
- ReplayAction* action = my_queue.front();
+ auto action = std::move(my_queue.front());
my_queue.pop();
return action;
}
if (action_fs.eof())
break;
/* we cannot split in place here because we parse&store several lines for the colleagues... */
- auto* action = new ReplayAction();
+ auto action = std::make_unique<ReplayAction>();
boost::split(*action, action_line, boost::is_any_of(" \t"), boost::token_compress_on);
// if it's for me, I'm done
return action;
// else, I have to store it for the relevant colleague
- action_queues[evtname].push(action);
+ action_queues[evtname].emplace(std::move(action));
}
// end of file reached while searching in vain for more work
"Passing nullptr to replay_runner() means that you want to use a shared trace, but you did not provide "
"any. Please use xbt_replay_set_tracefile().");
while (true) {
- simgrid::xbt::ReplayAction* evt = simgrid::xbt::get_action(actor_name);
+ auto evt = simgrid::xbt::get_action(actor_name);
if (not evt)
break;
simgrid::xbt::handle_action(*evt);
- delete evt;
}
action_queues.erase(actor_name_string);
} else { // Should have got my trace file in argument
foreach(x actor actor-autorestart actor-suspend
activity-lifecycle
- comm-get-sender comm-pt2pt wait-all-for wait-any-for
+ comm-get-sender comm-pt2pt comm-fault-scenarios wait-all-for wait-any-for
cloud-interrupt-migration cloud-two-execs
monkey-masterworkers monkey-semaphore
concurrent_rw
ADD_TESH_FACTORIES(tesh-s4u-${x} "*" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
endforeach()
-foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv host-multicore-speed-file is-router listen_async
+foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv comm-fault-scenarios host-multicore-speed-file is-router listen_async
monkey-masterworkers monkey-semaphore
pid storage_client_server trace-integration seal-platform issue71)
set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
--- /dev/null
+/* Copyright (c) 2010-2022. 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. */
+
+/* This example validates the behaviour in presence of node and link fault.
+ * Each test scenario consists in one host/actor (named sender) sending one message to another host/actor.
+ * The space to cover is quite large, since we consider:
+ * * communication types (eager, rendez-vous, one-sided=detached)
+ * * use type (synchronous, asynchronous, init)
+ * * fault type (sender node, link, receiver node)
+ * * any legal permutation of the scenario steps
+ *
+ * This program also presents a way to simulate applications that are resilient to links and node faults.
+ * Essentially, it catches exceptions related to communications and it clears the mailboxes when one of the nodes gets
+ * turned off. However, this model would suppose that there would be 2 mailboxes for each pair of nodes, which is
+ * probably unacceptable.
+ *
+ */
+
+#include <algorithm>
+#include <random>
+#include <simgrid/kernel/ProfileBuilder.hpp>
+#include <simgrid/s4u.hpp>
+#include <sstream>
+#include <time.h>
+#include <vector>
+
+namespace sg4 = simgrid::s4u;
+namespace pr = simgrid::kernel::profile;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(comm_fault_scenarios, "Messages specific for this s4u example");
+
+/*************************************************************************************************/
+
+// Constants for platform configuration
+constexpr double HostComputePower = 1e9; // FLOPs
+constexpr double LinkBandwidth = 1e9; // Bytes/second
+constexpr double LinkLatency = 1e-6; // Seconds
+
+// Constants for application behaviour
+constexpr auto MsgSize = static_cast<uint64_t>(LinkBandwidth / 2);
+
+/*************************************************************************************************/
+
+XBT_DECLARE_ENUM_CLASS(CommType, EAGER_SYNC, EAGER_ASYNC, EAGER_INIT, RDV_SYNC, RDV_ASYNC, RDV_INIT, ONESIDE_SYNC,
+ ONESIDE_ASYNC
+ // ONESIDE_INIT is equivalent to ONESIDE_ASYNC
+);
+
+XBT_DECLARE_ENUM_CLASS(Action, SLEEP, PUT, GET, START, WAIT, DIE, END);
+
+struct Step {
+ XBT_DECLARE_ENUM_CLASS(Type, STATE, ACTION);
+ XBT_DECLARE_ENUM_CLASS(Entity, LNK, SND, RCV);
+
+ double rel_time; // Time relative to Scenario startTime
+ Type type;
+ Entity entity;
+ Action action_type;
+ bool new_state;
+};
+
+struct Scenario {
+ CommType type;
+ double start_time;
+ double duration;
+ Action snd_expected;
+ Action rcv_expected;
+ std::vector<Step> steps;
+ int index;
+};
+
+static std::string to_string(const Scenario& s)
+{
+ std::stringstream ss;
+ ss << "#" << s.index << "[" << s.start_time << "s," << s.start_time + s.duration << "s[: (" << to_c_str(s.type);
+ ss << ") Expected: S:" << to_c_str(s.snd_expected) << " R:" << to_c_str(s.rcv_expected) << " Steps: ";
+ for (const Step& step : s.steps) {
+ ss << "+" << step.rel_time << "s:" << Step::to_c_str(step.entity);
+
+ if (step.type == Step::Type::STATE) {
+ ss << "->";
+ if (step.new_state)
+ ss << "ON";
+ else
+ ss << "OFF";
+ } else {
+ ss << "." << to_c_str(step.action_type);
+ }
+ ss << " ";
+ }
+ return ss.str();
+}
+
+struct MBoxes {
+ sg4::Mailbox* eager;
+ sg4::Mailbox* rdv;
+};
+
+struct ScenarioContext {
+ int index;
+ int active;
+ double start_time;
+ std::stringstream sender_profile;
+ std::stringstream receiver_profile;
+ std::stringstream link_profile;
+ std::vector<int> active_indices;
+ std::vector<Scenario> scenarios;
+};
+
+class SendAgent {
+ static int run_;
+ static size_t scenario_;
+ int id_;
+ sg4::Host* other_host_;
+ const MBoxes& mbox_;
+ const ScenarioContext& ctx_;
+
+ sg4::CommPtr do_put(CommType type, double& send_value) const
+ {
+ switch (type) {
+ case CommType::EAGER_SYNC:
+ mbox_.eager->put(&send_value, MsgSize);
+ return nullptr;
+ case CommType::EAGER_ASYNC:
+ return mbox_.eager->put_async(&send_value, MsgSize);
+ case CommType::EAGER_INIT:
+ return mbox_.eager->put_init(&send_value, MsgSize);
+ case CommType::RDV_SYNC:
+ mbox_.rdv->put(&send_value, MsgSize);
+ return nullptr;
+ case CommType::RDV_ASYNC:
+ return mbox_.rdv->put_async(&send_value, MsgSize);
+ case CommType::RDV_INIT:
+ return mbox_.rdv->put_init(&send_value, MsgSize);
+ case CommType::ONESIDE_SYNC:
+ sg4::Comm::sendto(sg4::this_actor::get_host(), other_host_, MsgSize);
+ return nullptr;
+ case CommType::ONESIDE_ASYNC:
+ return sg4::Comm::sendto_async(sg4::this_actor::get_host(), other_host_, MsgSize);
+ default:
+ break;
+ }
+ DIE_IMPOSSIBLE;
+ }
+
+ void send_message(const Scenario& s) const
+ {
+ std::string scenario_string = to_string(s);
+ XBT_DEBUG("Will try: %s", scenario_string.c_str());
+ double send_value;
+ sg4::CommPtr comm = nullptr;
+ Action expected = s.snd_expected;
+ double end_time = s.start_time + s.duration;
+ send_value = end_time;
+ size_t step_index = 0;
+ sg4::this_actor::sleep_until(s.start_time);
+ // Make sure we have a clean slate
+ xbt_assert(not mbox_.eager->listen(), "Eager mailbox should be empty when starting a test");
+ xbt_assert(not mbox_.rdv->listen(), "RDV mailbox should be empty when starting a test");
+ for (; step_index < s.steps.size(); step_index++) {
+ const Step& step = s.steps[step_index];
+ if (step.entity != Step::Entity::SND || step.type != Step::Type::ACTION)
+ continue;
+ try {
+ sg4::this_actor::sleep_until(s.start_time + step.rel_time);
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+ break;
+ }
+ // Check if the other host is still OK.
+ if (not other_host_->is_on())
+ break;
+ // Perform the action
+ try {
+ switch (step.action_type) {
+ case Action::PUT:
+ comm = do_put(s.type, send_value);
+ break;
+ case Action::START:
+ comm->start();
+ break;
+ case Action::WAIT:
+ comm->wait();
+ break;
+ default:
+ xbt_die("Not a valid action for SND");
+ }
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During %s, failed to send message because of a %s exception (%s)", to_c_str(step.action_type),
+ typeid(e).name(), e.what());
+ break;
+ }
+ }
+ try {
+ sg4::this_actor::sleep_until(end_time);
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+ }
+ Action outcome = Action::END;
+ if (step_index < s.steps.size()) {
+ const Step& step = s.steps[step_index];
+ assert(step.entity == Step::Entity::SND && step.type == Step::Type::ACTION);
+ outcome = step.action_type;
+ }
+ if (outcome != expected) {
+ XBT_ERROR("Expected %s but got %s in %s", to_c_str(expected), to_c_str(outcome), scenario_string.c_str());
+ } else {
+ XBT_DEBUG("OK: %s", scenario_string.c_str());
+ }
+ sg4::this_actor::sleep_until(end_time);
+ xbt_assert(not mbox_.eager->listen(), "Mailbox should not have ongoing communication!");
+ xbt_assert(not mbox_.rdv->listen(), "Mailbox should not have ongoing communication!");
+ }
+
+public:
+ explicit SendAgent(int id, sg4::Host* other_host, const MBoxes& mbox, const ScenarioContext& ctx)
+ : id_(id), other_host_(other_host), mbox_(mbox), ctx_(ctx)
+ {
+ }
+
+ void operator()() const
+ {
+ run_++;
+ XBT_DEBUG("Host %i starts run %i and scenario %zu.", id_, run_, scenario_);
+ while (scenario_ < ctx_.scenarios.size()) {
+ const Scenario& s = ctx_.scenarios[scenario_];
+ scenario_++;
+ send_message(s);
+ }
+ }
+};
+
+int SendAgent::run_ = 0;
+size_t SendAgent::scenario_ = 0;
+
+/*************************************************************************************************/
+
+class ReceiveAgent {
+ static int run_;
+ static size_t scenario_;
+ int id_;
+ sg4::Host* other_host_;
+ const MBoxes& mbox_;
+ const ScenarioContext& ctx_;
+
+ sg4::CommPtr do_get(CommType type, double*& receive_ptr) const
+ {
+ switch (type) {
+ case CommType::EAGER_SYNC:
+ receive_ptr = mbox_.eager->get<double>();
+ return nullptr;
+ case CommType::EAGER_ASYNC:
+ return mbox_.eager->get_async(&receive_ptr);
+ case CommType::EAGER_INIT:
+ return mbox_.eager->get_init()->set_dst_data((void**)(&receive_ptr));
+ case CommType::RDV_SYNC:
+ receive_ptr = mbox_.rdv->get<double>();
+ return nullptr;
+ case CommType::RDV_ASYNC:
+ return mbox_.rdv->get_async(&receive_ptr);
+ case CommType::RDV_INIT:
+ return mbox_.rdv->get_init()->set_dst_data((void**)(&receive_ptr));
+ case CommType::ONESIDE_SYNC:
+ case CommType::ONESIDE_ASYNC:
+ xbt_die("No get in One Sided comunications!");
+ default:
+ break;
+ }
+ DIE_IMPOSSIBLE;
+ }
+
+ void receive_message(const Scenario& s) const
+ {
+ sg4::CommPtr comm = nullptr;
+ CommType type = s.type;
+ Action expected = s.rcv_expected;
+ double end_time = s.start_time + s.duration;
+ double* receive_ptr = nullptr;
+ size_t step_index = 0;
+ sg4::this_actor::sleep_until(s.start_time);
+ // Make sure we have a clean slate
+ xbt_assert(not mbox_.eager->listen(), "Eager mailbox should be empty when starting a test");
+ xbt_assert(not mbox_.rdv->listen(), "RDV mailbox should be empty when starting a test");
+ for (; step_index < s.steps.size(); step_index++) {
+ const Step& step = s.steps[step_index];
+ if (step.entity != Step::Entity::RCV || step.type != Step::Type::ACTION)
+ continue;
+ try {
+ sg4::this_actor::sleep_until(s.start_time + step.rel_time);
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During Sleep, failed to receive message because of a %s exception (%s)", typeid(e).name(), e.what());
+ break;
+ }
+ // Check if the other host is still OK.
+ if (not other_host_->is_on())
+ break;
+ // Perform the action
+ try {
+ switch (step.action_type) {
+ case Action::GET:
+ comm = do_get(type, receive_ptr);
+ break;
+ case Action::START:
+ comm->start();
+ break;
+ case Action::WAIT:
+ comm->wait();
+ break;
+ default:
+ xbt_die("Not a valid action for RCV");
+ }
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During %s, failed to receive message because of a %s exception (%s)", to_c_str(step.action_type),
+ typeid(e).name(), e.what());
+ break;
+ }
+ }
+ try {
+ sg4::this_actor::sleep_until(end_time - .1);
+ } catch (const simgrid::Exception& e) {
+ XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+ }
+ Action outcome = Action::END;
+ std::string scenario_string = to_string(s);
+ if (step_index < s.steps.size()) {
+ const Step& step = s.steps[step_index];
+ assert(step.entity == Step::Entity::RCV && step.type == Step::Type::ACTION);
+ outcome = step.action_type;
+ } else if (s.type != CommType::ONESIDE_SYNC && s.type != CommType::ONESIDE_ASYNC) {
+ // One sided / detached operations do not actually transfer anything
+ if (receive_ptr == nullptr) {
+ XBT_ERROR("Received address is NULL in %s", scenario_string.c_str());
+ } else if (*receive_ptr != end_time) {
+ XBT_ERROR("Received value invalid: expected %f but got %f in %s", end_time, *receive_ptr,
+ scenario_string.c_str());
+ }
+ }
+ if (outcome != expected) {
+ XBT_ERROR("Expected %s but got %s in %s", to_c_str(expected), to_c_str(outcome), scenario_string.c_str());
+ } else {
+ XBT_DEBUG("OK: %s", scenario_string.c_str());
+ }
+ sg4::this_actor::sleep_until(end_time);
+ xbt_assert(not mbox_.eager->listen(), "Mailbox should not have ongoing communication!");
+ xbt_assert(not mbox_.rdv->listen(), "Mailbox should not have ongoing communication!");
+ }
+
+public:
+ explicit ReceiveAgent(int id, sg4::Host* other_host, const MBoxes& mbox, const ScenarioContext& ctx)
+ : id_(id), other_host_(other_host), mbox_(mbox), ctx_(ctx)
+ {
+ }
+ void operator()() const
+ {
+ run_++;
+ XBT_DEBUG("Host %i starts run %i and scenario %zu.", id_, run_, scenario_);
+ mbox_.eager->set_receiver(sg4::Actor::self());
+ while (scenario_ < ctx_.scenarios.size()) {
+ const Scenario& s = ctx_.scenarios[scenario_];
+ scenario_++;
+ receive_message(s);
+ }
+ }
+};
+
+int ReceiveAgent::run_ = 0;
+size_t ReceiveAgent::scenario_ = 0;
+
+static double build_scenarios(ScenarioContext& ctx);
+
+int main(int argc, char* argv[])
+{
+ sg4::Engine e(&argc, argv);
+ ScenarioContext ctx;
+ int previous_index = -1;
+ bool is_range_last = false;
+ for (int i = 1; i < argc; i++) {
+ if (not strcmp(argv[i], "-")) {
+ is_range_last = true;
+ continue;
+ }
+ int index = atoi(argv[i]);
+ xbt_assert(index > previous_index);
+ if (is_range_last)
+ for (int j = previous_index + 1; j <= index; j++)
+ ctx.active_indices.push_back(j);
+ else
+ ctx.active_indices.push_back(index);
+ is_range_last = false;
+ previous_index = index;
+ }
+ double end_time = build_scenarios(ctx);
+ XBT_INFO("Will run for %f seconds", end_time);
+ MBoxes mbox;
+ mbox.eager = e.mailbox_by_name_or_create("eager");
+ mbox.rdv = e.mailbox_by_name_or_create("rdv");
+ sg4::NetZone* zone = sg4::create_full_zone("Top");
+ pr::Profile* profile_sender = pr::ProfileBuilder::from_string("sender_profile", ctx.sender_profile.str(), 0);
+ sg4::Host* sender_host = zone->create_host("senderHost", HostComputePower)->set_state_profile(profile_sender)->seal();
+ pr::Profile* profile_receiver = pr::ProfileBuilder::from_string("receiver_profile", ctx.receiver_profile.str(), 0);
+ sg4::Host* receiver_host =
+ zone->create_host("receiverHost", HostComputePower)->set_state_profile(profile_receiver)->seal();
+ sg4::ActorPtr sender = sg4::Actor::create("sender", sender_host, SendAgent(0, receiver_host, mbox, ctx));
+ sender->set_auto_restart(true);
+ sg4::ActorPtr receiver = sg4::Actor::create("receiver", receiver_host, ReceiveAgent(1, sender_host, mbox, ctx));
+ receiver->set_auto_restart(true);
+ pr::Profile* profile_link = pr::ProfileBuilder::from_string("link_profile", ctx.link_profile.str(), 0);
+ sg4::Link const* link =
+ zone->create_link("link", LinkBandwidth)->set_latency(LinkLatency)->set_state_profile(profile_link)->seal();
+ zone->add_route(sender_host->get_netpoint(), receiver_host->get_netpoint(), nullptr, nullptr,
+ {sg4::LinkInRoute{link}}, false);
+ zone->seal();
+
+ sg4::Host::on_state_change_cb([mbox](sg4::Host const& host) {
+ XBT_DEBUG("Host %s is now %s", host.get_cname(), host.is_on() ? "ON " : "OFF");
+ if (not host.is_on()) {
+ mbox.eager->clear();
+ mbox.rdv->clear();
+ }
+ });
+
+ sg4::Link::on_state_change_cb(
+ [](sg4::Link const& lnk) { XBT_DEBUG("Link %s is now %s", lnk.get_cname(), lnk.is_on() ? "ON " : "OFF"); });
+
+ e.run_until(end_time);
+
+ // Make sure we have a clean slate
+ xbt_assert(not mbox.eager->listen(), "Eager mailbox should be empty in the end");
+ xbt_assert(not mbox.rdv->listen(), "RDV mailbox should be empty in the end");
+ XBT_INFO("Done.");
+ return 0;
+}
+
+static void prepareScenario(ScenarioContext& ctx, CommType type, double duration, Action sender_expected,
+ Action receiver_expected, const std::vector<Step>& steps)
+{
+ if (std::find(ctx.active_indices.begin(), ctx.active_indices.end(), ctx.index) != ctx.active_indices.end()) {
+ // Update fault profiles
+ for (const Step& step : steps) {
+ assert(step.rel_time < duration);
+ if (step.type != Step::Type::STATE)
+ continue;
+ int val = step.new_state ? 1 : 0;
+ switch (step.entity) {
+ case Step::Entity::SND:
+ ctx.sender_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+ break;
+ case Step::Entity::RCV:
+ ctx.receiver_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+ break;
+ case Step::Entity::LNK:
+ ctx.link_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+ break;
+ default:
+ DIE_IMPOSSIBLE;
+ }
+ }
+ ctx.scenarios.push_back({type, ctx.start_time, duration, sender_expected, receiver_expected, steps, ctx.index});
+ ctx.active++;
+ }
+ ctx.index++;
+ ctx.start_time += duration;
+}
+
+/*************************************************************************************************/
+
+// A bunch of dirty macros to help readability (supposedly)
+#define MAKE_SCENARIO(type, duration, snd_expected, rcv_expected, steps...) \
+ prepareScenario(ctx, CommType::type, duration, Action::snd_expected, Action::rcv_expected, {steps})
+
+// Link
+static Step loff(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::LNK, Action::END, false};
+}
+static Step lon(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::LNK, Action::END, true};
+}
+// Sender
+static Step soff(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::SND, Action::END, false};
+}
+static Step son(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::SND, Action::END, true};
+}
+static Step sput(double rel_time)
+{
+ return {rel_time, Step::Type::ACTION, Step::Entity::SND, Action::PUT, false};
+}
+static Step swait(double rel_time)
+{
+ return {rel_time, Step::Type::ACTION, Step::Entity::SND, Action::WAIT, false};
+}
+// Receiver
+static Step roff(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::RCV, Action::END, false};
+}
+static Step ron(double rel_time)
+{
+ return {rel_time, Step::Type::STATE, Step::Entity::RCV, Action::END, true};
+}
+static Step rget(double rel_time)
+{
+ return {rel_time, Step::Type::ACTION, Step::Entity::RCV, Action::GET, false};
+}
+static Step rwait(double rel_time)
+{
+ return {rel_time, Step::Type::ACTION, Step::Entity::RCV, Action::WAIT, false};
+}
+
+static double build_scenarios(ScenarioContext& ctx)
+{
+ ctx.start_time = 0;
+ ctx.index = 0;
+ ctx.active = 0;
+
+ // EAGER SYNC use cases
+ // All good
+ MAKE_SCENARIO(EAGER_SYNC, 1, END, END, sput(.2), rget(.4));
+ MAKE_SCENARIO(EAGER_SYNC, 1, END, END, rget(.2), sput(.4));
+ // Receiver off
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, sput(.2), roff(.3), ron(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, sput(.2), rget(.4), roff(.5), ron(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, rget(.2), sput(.4), roff(.5), ron(1));
+ // Sender off
+ MAKE_SCENARIO(EAGER_SYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), son(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, DIE, GET, sput(.2), rget(.4), soff(.5), son(1));
+ // Link off
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, loff(.1), sput(.2), rget(.4), lon(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, sput(.2), loff(.3), rget(.4), lon(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, sput(.2), rget(.4), loff(.5), lon(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, loff(.1), rget(.2), sput(.4), lon(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, rget(.2), loff(.3), sput(.4), lon(1));
+ MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, rget(.2), sput(.4), loff(.5), lon(1));
+
+ // EAGER ASYNC use cases
+ // All good
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), swait(.4), rget(.6), rwait(.8));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), rget(.4), swait(.6), rwait(.8));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), rget(.4), rwait(.6), swait(.8));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), sput(.4), swait(.6), rwait(.8));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), sput(.4), rwait(.6), swait(.8));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), rwait(.4), sput(.6), swait(.8));
+ // Receiver off
+ MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, rget(.2), roff(.3), sput(.4), swait(.6), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), roff(.5), swait(.6), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), roff(.5), swait(.6), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, rget(.2), rwait(.4), roff(.5), sput(.6), swait(.8), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), rget(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), swait(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), swait(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), rwait(.4), sput(.6), roff(.7), swait(.8), ron(1));
+ // Sender off (only cases where sender did put, because otherwise receiver cannot find out there was a fault)
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), rwait(.6), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), soff(.5), rwait(.6), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), soff(.5), rwait(.6), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, GET, sput(.2), swait(.4), soff(.5), rget(.6), rwait(.8), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), rwait(.4), sput(.6), soff(.7), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), rwait(.6), soff(.7), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), swait(.6), soff(.7), rwait(.8), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), rwait(.6), soff(.7), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), swait(.6), soff(.7), rwait(.8), son(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), swait(.4), rget(.6), soff(.7), rwait(.8), son(1));
+ // Link off
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), swait(.4), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), rwait(.4), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), swait(.4), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), rwait(.4), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), loff(.5), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), loff(.5), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), rget(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+ MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), sput(.6), loff(.7), swait(.8), lon(1));
+
+ // RDV SYNC use cases
+ // All good
+ MAKE_SCENARIO(RDV_SYNC, 1, END, END, sput(.2), rget(.4));
+ MAKE_SCENARIO(RDV_SYNC, 1, END, END, rget(.2), sput(.4));
+ // Receiver off
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, sput(.2), roff(.3),
+ ron(1)); // Fails because put comm cancellation does not trigger sender exception
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, sput(.2), rget(.4), roff(.5), ron(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, rget(.2), sput(.4), roff(.5), ron(1));
+ // Sender off
+ MAKE_SCENARIO(RDV_SYNC, 2, DIE, GET, sput(.2), rget(.4), soff(.5), son(1));
+ // Link off
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, loff(.1), sput(.2), rget(.4), lon(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, sput(.2), loff(.3), rget(.4), lon(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, sput(.2), rget(.4), loff(.5), lon(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, loff(.1), rget(.2), sput(.4), lon(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, rget(.2), loff(.3), sput(.4), lon(1));
+ MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, rget(.2), sput(.4), loff(.5), lon(1));
+
+ // RDV ASYNC use cases
+ // All good
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), swait(.4), rget(.6), rwait(.8));
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), rget(.4), swait(.6), rwait(.8));
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), rget(.4), rwait(.6), swait(.8));
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), sput(.4), swait(.6), rwait(.8));
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), sput(.4), rwait(.6), swait(.8));
+ MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), rwait(.4), sput(.6), swait(.8));
+ // Receiver off
+ MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, rget(.2), roff(.3), sput(.4), swait(.6), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5),
+ ron(1)); // Fails because put comm cancellation does not trigger sender exception
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), roff(.5), swait(.6), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), roff(.5), swait(.6), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, rget(.2), rwait(.4), roff(.5), sput(.6), swait(.8), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), rget(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), swait(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), swait(.6), roff(.7), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), rwait(.4), sput(.6), roff(.7), swait(.8), ron(1));
+ // Sender off (only cases where sender did put, because otherwise receiver cannot find out there was a fault)
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), rwait(.6), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), soff(.5), rwait(.6), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), soff(.5), rwait(.6), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, GET, sput(.2), swait(.4), soff(.5), rget(.6), rwait(.8), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), rwait(.4), sput(.6), soff(.7), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), rwait(.6), soff(.7), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), swait(.6), soff(.7), rwait(.8), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), rwait(.6), soff(.7), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), swait(.6), soff(.7), rwait(.8), son(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), swait(.4), rget(.6), soff(.7), rwait(.8), son(1));
+ // Link off
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), swait(.4), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), rwait(.4), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), swait(.4), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), rwait(.4), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), loff(.5), rget(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), loff(.5), sput(.6), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), rget(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+ MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), sput(.6), loff(.7), swait(.8), lon(1));
+
+ // ONESIDE SYNC use cases
+ // All good
+ MAKE_SCENARIO(ONESIDE_SYNC, 1, END, END, sput(.2));
+ // Receiver off
+ MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+ MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, DIE, sput(.2), roff(.3), ron(1));
+ // Sender off
+ MAKE_SCENARIO(ONESIDE_SYNC, 2, DIE, END, sput(.2), soff(.3), son(1));
+ // Link off
+ MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, END, loff(.1), sput(.2), lon(1));
+ MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, END, sput(.2), loff(.3), lon(1));
+
+ // ONESIDE ASYNC use cases
+ // All good
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, END, END, sput(.2), swait(.4));
+ // Receiver off
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5), ron(1));
+ // Sender off
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, DIE, END, sput(.2), soff(.3), son(1));
+ // Link off
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, loff(.1), sput(.2), swait(.4), lon(1));
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, sput(.2), loff(.3), swait(.4), lon(1));
+ MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, sput(.2), swait(.4), loff(.5), lon(1));
+
+ XBT_INFO("Will execute %i active scenarios out of %i.", ctx.active, ctx.index);
+ return ctx.start_time + 1;
+}
--- /dev/null
+$ ./comm-fault-scenarios 0 - 146
+> [0.000000] [comm_fault_scenarios/INFO] Will execute 147 active scenarios out of 147.
+> [0.000000] [comm_fault_scenarios/INFO] Will run for 290.000000 seconds
+> [290.000000] [comm_fault_scenarios/INFO] Done.
set(EXTRA_DIST
src/bindings/java/MANIFEST.in
src/bindings/python/simgrid_python.cpp
+ src/dag/dax.dtd
+ src/dag/dax_dtd.c
+ src/dag/dax_dtd.h
+ src/include/catch.hpp
src/include/mc/datatypes.h
src/include/mc/mc.h
src/include/simgrid/sg_config.hpp
src/include/xbt/coverage.h
- src/include/xbt/parmap.hpp
src/include/xbt/mmalloc.h
+ src/include/xbt/parmap.hpp
src/include/xbt/xbt_modinter.h
- src/include/catch.hpp
src/include/xxhash.hpp
src/kernel/actor/Simcall.hpp
src/kernel/resource/LinkImpl.hpp
src/mc/mc_mmu.hpp
src/mc/mc_record.hpp
src/msg/msg_private.hpp
- src/dag/dax.dtd
- src/dag/dax_dtd.c
- src/dag/dax_dtd.h
src/smpi/colls/coll_tuned_topo.hpp
src/smpi/colls/colls_private.hpp
src/smpi/colls/smpi_mvapich2_selector_stampede.hpp
src/smpi/include/smpi_utils.hpp
src/smpi/smpi_main.c
src/smpi/smpi_replay_main.cpp
+ src/surf/HostImpl.hpp
src/surf/cpu_cas01.hpp
src/surf/cpu_ti.hpp
+ src/surf/disk_s19.hpp
+ src/surf/host_clm03.hpp
src/surf/network_cm02.hpp
src/surf/network_constant.hpp
+ src/surf/network_ib.hpp
src/surf/network_ns3.hpp
src/surf/network_smpi.hpp
- src/surf/network_ib.hpp
src/surf/ns3/ns3_simulator.hpp
+ src/surf/ptask_L07.hpp
+ src/surf/surf_interface.hpp
src/surf/xml/simgrid.dtd
- src/surf/xml/simgrid_dtd.h
src/surf/xml/simgrid_dtd.c
+ src/surf/xml/simgrid_dtd.h
src/surf/xml/surfxml_sax_cb.cpp
- src/surf/disk_s19.hpp
- src/surf/surf_interface.hpp
- src/surf/host_clm03.hpp
- src/surf/HostImpl.hpp
- src/surf/ptask_L07.hpp
src/xbt/automaton/automaton_lexer.yy.c
src/xbt/automaton/parserPromela.lex
src/xbt/automaton/parserPromela.tab.cacc
src/xbt/mmalloc/mrealloc.c
src/xbt/mmalloc/swag.c
src/xbt/mmalloc/swag.h
- examples/smpi/mc/only_send_deterministic.tesh
)
set(SMPI_SRC
- src/smpi/internals/instr_smpi.cpp
- src/smpi/internals/smpi_bench.cpp
- src/smpi/internals/smpi_memory.cpp
- src/smpi/internals/smpi_shared.cpp
- src/smpi/internals/smpi_deployment.cpp
- src/smpi/internals/smpi_global.cpp
- src/smpi/internals/smpi_host.cpp
- src/smpi/internals/smpi_replay.cpp
- src/smpi/internals/smpi_actor.cpp
- src/smpi/internals/smpi_utils.cpp
- src/smpi/internals/smpi_config.cpp
- src/smpi/mpi/smpi_comm.cpp
- src/smpi/mpi/smpi_datatype.cpp
- src/smpi/mpi/smpi_datatype_derived.cpp
- src/smpi/mpi/smpi_errhandler.cpp
- src/smpi/mpi/smpi_f2c.cpp
- src/smpi/mpi/smpi_file.cpp
- src/smpi/mpi/smpi_group.cpp
- src/smpi/mpi/smpi_info.cpp
- src/smpi/mpi/smpi_keyvals.cpp
- src/smpi/mpi/smpi_op.cpp
- src/smpi/mpi/smpi_request.cpp
- src/smpi/mpi/smpi_status.cpp
- src/smpi/mpi/smpi_topo.cpp
- src/smpi/mpi/smpi_win.cpp
- src/smpi/include/smpi_actor.hpp
- src/smpi/include/smpi_coll.hpp
- src/smpi/include/smpi_comm.hpp
- src/smpi/include/smpi_config.hpp
- src/smpi/include/smpi_datatype_derived.hpp
- src/smpi/include/smpi_datatype.hpp
- src/smpi/include/smpi_errhandler.hpp
- src/smpi/include/smpi_f2c.hpp
- src/smpi/include/smpi_file.hpp
- src/smpi/include/smpi_group.hpp
- src/smpi/include/smpi_host.hpp
- src/smpi/include/smpi_info.hpp
- src/smpi/include/smpi_keyvals.hpp
- src/smpi/include/smpi_op.hpp
- src/smpi/include/smpi_replay.hpp
- src/smpi/include/smpi_request.hpp
- src/smpi/include/smpi_status.hpp
- src/smpi/include/smpi_topo.hpp
- src/smpi/include/smpi_win.hpp
- src/smpi/plugins/ampi/ampi.cpp
- src/smpi/plugins/ampi/ampi.hpp
- src/smpi/plugins/ampi/instr_ampi.cpp
- src/smpi/plugins/ampi/instr_ampi.hpp
- src/surf/network_smpi.cpp
- src/surf/network_ib.cpp
+ src/smpi/bindings/smpi_f77.cpp
+ src/smpi/bindings/smpi_f77_coll.cpp
+ src/smpi/bindings/smpi_f77_comm.cpp
+ src/smpi/bindings/smpi_f77_file.cpp
+ src/smpi/bindings/smpi_f77_request.cpp
+ src/smpi/bindings/smpi_f77_type.cpp
src/smpi/bindings/smpi_mpi.cpp
src/smpi/bindings/smpi_pmpi.cpp
src/smpi/bindings/smpi_pmpi_coll.cpp
src/smpi/bindings/smpi_pmpi_topo.cpp
src/smpi/bindings/smpi_pmpi_type.cpp
src/smpi/bindings/smpi_pmpi_win.cpp
- src/smpi/bindings/smpi_f77.cpp
- src/smpi/bindings/smpi_f77_coll.cpp
- src/smpi/bindings/smpi_f77_comm.cpp
- src/smpi/bindings/smpi_f77_file.cpp
- src/smpi/bindings/smpi_f77_request.cpp
- src/smpi/bindings/smpi_f77_type.cpp
- src/smpi/colls/smpi_coll.cpp
- src/smpi/colls/smpi_nbc_impl.cpp
- src/smpi/colls/smpi_automatic_selector.cpp
- src/smpi/colls/smpi_default_selector.cpp
- src/smpi/colls/smpi_mpich_selector.cpp
- src/smpi/colls/smpi_intel_mpi_selector.cpp
- src/smpi/colls/smpi_openmpi_selector.cpp
- src/smpi/colls/smpi_mvapich2_selector.cpp
src/smpi/colls/allgather/allgather-2dmesh.cpp
src/smpi/colls/allgather/allgather-3dmesh.cpp
src/smpi/colls/allgather/allgather-GB.cpp
src/smpi/colls/allgather/allgather-SMP-NTS.cpp
src/smpi/colls/allgather/allgather-bruck.cpp
src/smpi/colls/allgather/allgather-loosely-lr.cpp
+ src/smpi/colls/allgather/allgather-mvapich-smp.cpp
src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp
src/smpi/colls/allgather/allgather-pair.cpp
- src/smpi/colls/allgather/allgather-mvapich-smp.cpp
src/smpi/colls/allgather/allgather-rdb.cpp
src/smpi/colls/allgather/allgather-rhv.cpp
src/smpi/colls/allgather/allgather-ring.cpp
src/smpi/colls/allgatherv/allgatherv-pair.cpp
src/smpi/colls/allgatherv/allgatherv-ring.cpp
src/smpi/colls/allreduce/allreduce-lr.cpp
+ src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp
+ src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp
src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp
src/smpi/colls/allreduce/allreduce-rab-rdb.cpp
src/smpi/colls/allreduce/allreduce-rab1.cpp
src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp
src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp
src/smpi/colls/allreduce/allreduce-smp-rsag.cpp
- src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp
- src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp
- src/smpi/colls/alltoall/alltoall-basic-linear.cpp
src/smpi/colls/alltoall/alltoall-2dmesh.cpp
src/smpi/colls/alltoall/alltoall-3dmesh.cpp
+ src/smpi/colls/alltoall/alltoall-basic-linear.cpp
src/smpi/colls/alltoall/alltoall-bruck.cpp
+ src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp
src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp
src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp
src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp
src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp
src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp
src/smpi/colls/alltoall/alltoall-ring.cpp
- src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp
src/smpi/colls/alltoallv/alltoallv-bruck.cpp
src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp
src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp
src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp
src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp
src/smpi/colls/alltoallv/alltoallv-ring.cpp
- src/smpi/colls/barrier/barrier-ompi.cpp
- src/smpi/colls/barrier/barrier-mvapich2-pair.cpp
src/smpi/colls/barrier/barrier-mpich-smp.cpp
+ src/smpi/colls/barrier/barrier-mvapich2-pair.cpp
+ src/smpi/colls/barrier/barrier-ompi.cpp
src/smpi/colls/bcast/bcast-NTSB.cpp
src/smpi/colls/bcast/bcast-NTSL-Isend.cpp
src/smpi/colls/bcast/bcast-NTSL.cpp
src/smpi/colls/bcast/bcast-binomial-tree.cpp
src/smpi/colls/bcast/bcast-flattree-pipeline.cpp
src/smpi/colls/bcast/bcast-flattree.cpp
+ src/smpi/colls/bcast/bcast-mvapich-smp.cpp
src/smpi/colls/bcast/bcast-ompi-pipeline.cpp
src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp
- src/smpi/colls/bcast/bcast-mvapich-smp.cpp
src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp
src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp
src/smpi/colls/coll_tuned_topo.cpp
src/smpi/colls/colls_global.cpp
- src/smpi/colls/gather/gather-ompi.cpp
src/smpi/colls/gather/gather-mvapich.cpp
+ src/smpi/colls/gather/gather-ompi.cpp
src/smpi/colls/reduce/reduce-NTSL.cpp
src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp
src/smpi/colls/reduce/reduce-binomial.cpp
src/smpi/colls/reduce/reduce-flat-tree.cpp
+ src/smpi/colls/reduce/reduce-mvapich-knomial.cpp
+ src/smpi/colls/reduce/reduce-mvapich-two-level.cpp
src/smpi/colls/reduce/reduce-ompi.cpp
+ src/smpi/colls/reduce/reduce-rab.cpp
src/smpi/colls/reduce/reduce-scatter-gather.cpp
src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp
src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp
- src/smpi/colls/reduce/reduce-mvapich-knomial.cpp
- src/smpi/colls/reduce/reduce-mvapich-two-level.cpp
- src/smpi/colls/reduce/reduce-rab.cpp
- src/smpi/colls/scatter/scatter-ompi.cpp
src/smpi/colls/scatter/scatter-mvapich-two-level.cpp
+ src/smpi/colls/scatter/scatter-ompi.cpp
+ src/smpi/colls/smpi_automatic_selector.cpp
+ src/smpi/colls/smpi_coll.cpp
+ src/smpi/colls/smpi_default_selector.cpp
+ src/smpi/colls/smpi_intel_mpi_selector.cpp
+ src/smpi/colls/smpi_mpich_selector.cpp
+ src/smpi/colls/smpi_mvapich2_selector.cpp
+ src/smpi/colls/smpi_nbc_impl.cpp
+ src/smpi/colls/smpi_openmpi_selector.cpp
+ src/smpi/include/smpi_actor.hpp
+ src/smpi/include/smpi_coll.hpp
+ src/smpi/include/smpi_comm.hpp
+ src/smpi/include/smpi_config.hpp
+ src/smpi/include/smpi_datatype.hpp
+ src/smpi/include/smpi_datatype_derived.hpp
+ src/smpi/include/smpi_errhandler.hpp
+ src/smpi/include/smpi_f2c.hpp
+ src/smpi/include/smpi_file.hpp
+ src/smpi/include/smpi_group.hpp
+ src/smpi/include/smpi_host.hpp
+ src/smpi/include/smpi_info.hpp
+ src/smpi/include/smpi_keyvals.hpp
+ src/smpi/include/smpi_op.hpp
+ src/smpi/include/smpi_replay.hpp
+ src/smpi/include/smpi_request.hpp
+ src/smpi/include/smpi_status.hpp
+ src/smpi/include/smpi_topo.hpp
+ src/smpi/include/smpi_win.hpp
+ src/smpi/internals/instr_smpi.cpp
+ src/smpi/internals/smpi_actor.cpp
+ src/smpi/internals/smpi_bench.cpp
+ src/smpi/internals/smpi_config.cpp
+ src/smpi/internals/smpi_deployment.cpp
+ src/smpi/internals/smpi_global.cpp
+ src/smpi/internals/smpi_host.cpp
+ src/smpi/internals/smpi_memory.cpp
+ src/smpi/internals/smpi_replay.cpp
+ src/smpi/internals/smpi_shared.cpp
+ src/smpi/internals/smpi_utils.cpp
+ src/smpi/mpi/smpi_comm.cpp
+ src/smpi/mpi/smpi_datatype.cpp
+ src/smpi/mpi/smpi_datatype_derived.cpp
+ src/smpi/mpi/smpi_errhandler.cpp
+ src/smpi/mpi/smpi_f2c.cpp
+ src/smpi/mpi/smpi_file.cpp
+ src/smpi/mpi/smpi_group.cpp
+ src/smpi/mpi/smpi_info.cpp
+ src/smpi/mpi/smpi_keyvals.cpp
+ src/smpi/mpi/smpi_op.cpp
+ src/smpi/mpi/smpi_request.cpp
+ src/smpi/mpi/smpi_status.cpp
+ src/smpi/mpi/smpi_topo.cpp
+ src/smpi/mpi/smpi_win.cpp
+ src/smpi/plugins/ampi/ampi.cpp
+ src/smpi/plugins/ampi/ampi.hpp
+ src/smpi/plugins/ampi/instr_ampi.cpp
+ src/smpi/plugins/ampi/instr_ampi.hpp
+ src/surf/network_ib.cpp
+ src/surf/network_smpi.cpp
)
set(XBT_SRC
+ src/xbt/OsSemaphore.hpp
+ src/xbt/PropertyHolder.cpp
src/xbt/automaton/automaton.c
src/xbt/automaton/automatonparse_promela.c
src/xbt/backtrace.cpp
src/xbt/mallocator.c
src/xbt/memory_map.cpp
src/xbt/memory_map.hpp
- src/xbt/OsSemaphore.hpp
- src/xbt/PropertyHolder.cpp
src/xbt/parmap.cpp
src/xbt/random.cpp
src/xbt/snprintf.c
set(EXTRA_DIST ${EXTRA_DIST} src/xbt/mmalloc/mm.c)
endif()
-set(NS3_SRC src/surf/network_ns3.cpp
- src/surf/ns3/ns3_simulator.cpp )
+set(NS3_SRC
+ src/surf/network_ns3.cpp
+ src/surf/ns3/ns3_simulator.cpp
+ )
set(SURF_SRC
- src/kernel/lmm/fair_bottleneck.hpp
+ src/kernel/EngineImpl.cpp
+ src/kernel/EngineImpl.hpp
+
+ src/kernel/lmm/System.cpp
+ src/kernel/lmm/System.hpp
src/kernel/lmm/fair_bottleneck.cpp
- src/kernel/lmm/maxmin.hpp
+ src/kernel/lmm/fair_bottleneck.hpp
src/kernel/lmm/maxmin.cpp
- src/kernel/lmm/System.hpp
- src/kernel/lmm/System.cpp
+ src/kernel/lmm/maxmin.hpp
src/kernel/resource/Action.cpp
src/kernel/resource/CpuImpl.cpp
src/kernel/resource/Resource.hpp
src/kernel/resource/SplitDuplexLinkImpl.cpp
src/kernel/resource/StandardLinkImpl.cpp
- src/kernel/resource/VirtualMachineImpl.hpp
src/kernel/resource/VirtualMachineImpl.cpp
+ src/kernel/resource/VirtualMachineImpl.hpp
src/kernel/resource/WifiLinkImpl.cpp
src/kernel/resource/profile/Event.hpp
src/kernel/resource/profile/FutureEvtSet.cpp
src/kernel/resource/profile/FutureEvtSet.hpp
- src/kernel/resource/profile/ProfileBuilder.cpp
src/kernel/resource/profile/Profile.cpp
src/kernel/resource/profile/Profile.hpp
+ src/kernel/resource/profile/ProfileBuilder.cpp
src/kernel/resource/profile/StochasticDatedValue.cpp
src/kernel/resource/profile/StochasticDatedValue.hpp
src/kernel/timer/Timer.cpp
- src/kernel/EngineImpl.cpp
- src/kernel/EngineImpl.hpp
-
+ src/surf/HostImpl.cpp
src/surf/cpu_cas01.cpp
src/surf/cpu_ti.cpp
src/surf/disk_s19.cpp
+ src/surf/host_clm03.cpp
src/surf/network_cm02.cpp
src/surf/network_constant.cpp
+ src/surf/ptask_L07.cpp
src/surf/sg_platf.cpp
src/surf/surf_interface.cpp
src/surf/xml/platf.hpp
src/surf/xml/platf_private.hpp
- src/surf/xml/surfxml_sax_cb.cpp
src/surf/xml/surfxml_parseplatf.cpp
- src/surf/host_clm03.cpp
- src/surf/HostImpl.cpp
- src/surf/ptask_L07.cpp
+ src/surf/xml/surfxml_sax_cb.cpp
)
if (Eigen3_FOUND)
set(SURF_SRC
${SURF_SRC}
- src/kernel/lmm/bmf.hpp
- src/kernel/lmm/bmf.cpp)
+ src/kernel/lmm/bmf.cpp
+ src/kernel/lmm/bmf.hpp)
else()
set(EXTRA_DIST
${EXTRA_DIST}
- src/kernel/lmm/bmf.hpp
- src/kernel/lmm/bmf.cpp)
+ src/kernel/lmm/bmf.cpp
+ src/kernel/lmm/bmf.hpp)
endif()
set(PLUGINS_SRC
src/plugins/ProducerConsumer.cpp
src/plugins/chaos_monkey.cpp
+ src/plugins/file_system/s4u_FileSystem.cpp
src/plugins/host_dvfs.cpp
src/plugins/host_energy.cpp
+ src/plugins/host_load.cpp
src/plugins/link_energy.cpp
src/plugins/link_energy_wifi.cpp
- src/plugins/host_load.cpp
src/plugins/link_load.cpp
- src/plugins/file_system/s4u_FileSystem.cpp
- src/plugins/vm/dirty_page_tracking.cpp
src/plugins/vm/VmLiveMigration.cpp
src/plugins/vm/VmLiveMigration.hpp
+ src/plugins/vm/dirty_page_tracking.cpp
)
set(SIMIX_SRC
- src/kernel/context/Context.cpp
- src/kernel/context/Context.hpp
- src/kernel/context/ContextRaw.cpp
- src/kernel/context/ContextRaw.hpp
- src/kernel/context/ContextSwapped.cpp
- src/kernel/context/ContextSwapped.hpp
- src/kernel/context/ContextThread.cpp
- src/kernel/context/ContextThread.hpp
src/kernel/activity/ActivityImpl.cpp
src/kernel/activity/ActivityImpl.hpp
src/kernel/activity/BarrierImpl.cpp
src/kernel/activity/BarrierImpl.hpp
- src/kernel/activity/ConditionVariableImpl.cpp
- src/kernel/activity/ConditionVariableImpl.hpp
src/kernel/activity/CommImpl.cpp
src/kernel/activity/CommImpl.hpp
+ src/kernel/activity/ConditionVariableImpl.cpp
+ src/kernel/activity/ConditionVariableImpl.hpp
src/kernel/activity/ExecImpl.cpp
src/kernel/activity/ExecImpl.hpp
src/kernel/activity/IoImpl.cpp
src/kernel/actor/SimcallObserver.hpp
src/kernel/actor/SynchroObserver.cpp
src/kernel/actor/SynchroObserver.hpp
+ src/kernel/context/Context.cpp
+ src/kernel/context/Context.hpp
+ src/kernel/context/ContextRaw.cpp
+ src/kernel/context/ContextRaw.hpp
+ src/kernel/context/ContextSwapped.cpp
+ src/kernel/context/ContextSwapped.hpp
+ src/kernel/context/ContextThread.cpp
+ src/kernel/context/ContextThread.hpp
src/simix/libsmx.cpp
src/simix/smx_context.cpp
)
if (HAVE_BOOST_CONTEXTS)
set(SIMIX_SRC
${SIMIX_SRC}
- src/kernel/context/ContextBoost.hpp
- src/kernel/context/ContextBoost.cpp)
+ src/kernel/context/ContextBoost.cpp
+ src/kernel/context/ContextBoost.hpp)
else()
set(EXTRA_DIST
${EXTRA_DIST}
- src/kernel/context/ContextBoost.hpp
- src/kernel/context/ContextBoost.cpp)
+ src/kernel/context/ContextBoost.cpp
+ src/kernel/context/ContextBoost.hpp)
endif()
set(S4U_SRC
- src/s4u/s4u_Actor.cpp
src/s4u/s4u_Activity.cpp
+ src/s4u/s4u_Actor.cpp
src/s4u/s4u_Barrier.cpp
- src/s4u/s4u_ConditionVariable.cpp
src/s4u/s4u_Comm.cpp
+ src/s4u/s4u_ConditionVariable.cpp
src/s4u/s4u_Disk.cpp
src/s4u/s4u_Engine.cpp
src/s4u/s4u_Exec.cpp
)
set(MSG_SRC
- src/msg/msg_global.cpp
src/msg/msg_comm.cpp
+ src/msg/msg_global.cpp
src/msg/msg_legacy.cpp
src/msg/msg_process.cpp
src/msg/msg_task.cpp
)
set(JMSG_C_SRC
+ src/bindings/java/JavaContext.cpp
+ src/bindings/java/JavaContext.hpp
src/bindings/java/jmsg.cpp
src/bindings/java/jmsg.hpp
src/bindings/java/jmsg_as.cpp
src/bindings/java/jmsg_vm.h
src/bindings/java/jxbt_utilities.cpp
src/bindings/java/jxbt_utilities.hpp
- src/bindings/java/JavaContext.cpp
- src/bindings/java/JavaContext.hpp
-)
+ )
set(JMSG_JAVA_SRC
src/bindings/java/org/simgrid/NativeLib.java
src/bindings/java/org/simgrid/msg/TimeoutException.java
src/bindings/java/org/simgrid/msg/TransferFailureException.java
src/bindings/java/org/simgrid/msg/VM.java
-)
+ )
set(JTRACE_C_SRC
src/bindings/java/jtrace.cpp
src/bindings/java/jtrace.h
-)
+ )
set(JTRACE_JAVA_SRC src/bindings/java/org/simgrid/trace/Trace.java)
src/instr/instr_paje_values.hpp
src/instr/instr_platform.cpp
src/instr/instr_private.hpp
- src/instr/instr_smpi.hpp
src/instr/instr_resource_utilization.cpp
+ src/instr/instr_smpi.hpp
)
set(MC_SRC_BASE
src/mc/mc_base.cpp
src/mc/mc_base.hpp
- src/mc/mc_record.hpp
- src/mc/mc_replay.hpp
- src/mc/mc_record.cpp
src/mc/mc_config.cpp
src/mc/mc_config.hpp
src/mc/mc_global.cpp
+ src/mc/mc_record.cpp
+ src/mc/mc_record.hpp
+ src/mc/mc_replay.hpp
src/mc/transition/Transition.cpp
)
set(MC_SRC
- src/mc/explo/Exploration.hpp
src/mc/explo/CommunicationDeterminismChecker.cpp
src/mc/explo/DFSExplorer.cpp
src/mc/explo/DFSExplorer.hpp
+ src/mc/explo/Exploration.hpp
src/mc/explo/LivenessChecker.cpp
src/mc/explo/LivenessChecker.hpp
src/mc/explo/UdporChecker.cpp
src/mc/explo/UdporChecker.hpp
- src/mc/inspect/DwarfExpression.hpp
src/mc/inspect/DwarfExpression.cpp
- src/mc/inspect/Frame.hpp
+ src/mc/inspect/DwarfExpression.hpp
src/mc/inspect/Frame.cpp
- src/mc/inspect/LocationList.hpp
+ src/mc/inspect/Frame.hpp
src/mc/inspect/LocationList.cpp
- src/mc/inspect/ObjectInformation.hpp
+ src/mc/inspect/LocationList.hpp
src/mc/inspect/ObjectInformation.cpp
+ src/mc/inspect/ObjectInformation.hpp
src/mc/inspect/Type.hpp
src/mc/inspect/Variable.hpp
- src/mc/inspect/mc_dwarf.hpp
src/mc/inspect/mc_dwarf.cpp
+ src/mc/inspect/mc_dwarf.hpp
src/mc/inspect/mc_dwarf_attrnames.cpp
src/mc/inspect/mc_dwarf_tagnames.cpp
src/mc/inspect/mc_member.cpp
- src/mc/inspect/mc_unw.hpp
src/mc/inspect/mc_unw.cpp
+ src/mc/inspect/mc_unw.hpp
src/mc/inspect/mc_unw_vmread.cpp
src/mc/remote/AppSide.cpp
src/mc/remote/Channel.hpp
src/mc/remote/CheckerSide.cpp
src/mc/remote/CheckerSide.hpp
- src/mc/remote/RemoteProcess.hpp
src/mc/remote/RemoteProcess.cpp
+ src/mc/remote/RemoteProcess.hpp
src/mc/remote/RemotePtr.hpp
src/mc/remote/mc_protocol.h
- src/mc/sosp/PageStore.hpp
- src/mc/sosp/PageStore.cpp
- src/mc/sosp/ChunkedData.hpp
src/mc/sosp/ChunkedData.cpp
+ src/mc/sosp/ChunkedData.hpp
+ src/mc/sosp/PageStore.cpp
+ src/mc/sosp/PageStore.hpp
src/mc/sosp/Region.cpp
src/mc/sosp/Region.hpp
- src/mc/sosp/Snapshot.hpp
src/mc/sosp/Snapshot.cpp
+ src/mc/sosp/Snapshot.hpp
+
+ src/mc/transition/Transition.hpp
+ src/mc/transition/TransitionAny.cpp
+ src/mc/transition/TransitionAny.hpp
+ src/mc/transition/TransitionComm.cpp
+ src/mc/transition/TransitionComm.hpp
+ src/mc/transition/TransitionRandom.cpp
+ src/mc/transition/TransitionRandom.hpp
+ src/mc/transition/TransitionSynchro.cpp
+ src/mc/transition/TransitionSynchro.hpp
src/mc/AddressSpace.hpp
- src/mc/ModelChecker.hpp
src/mc/ModelChecker.cpp
- src/mc/mc_forward.hpp
+ src/mc/ModelChecker.hpp
src/mc/Session.cpp
src/mc/Session.hpp
- src/mc/mc_pattern.hpp
- src/mc/compare.cpp
+ src/mc/VisitedState.cpp
+ src/mc/VisitedState.hpp
src/mc/api.cpp
src/mc/api.hpp
- src/mc/mc_hash.hpp
+ src/mc/api/State.cpp
+ src/mc/api/State.hpp
+ src/mc/compare.cpp
+ src/mc/mc_client_api.cpp
+ src/mc/mc_exit.hpp
+ src/mc/mc_forward.hpp
src/mc/mc_hash.cpp
+ src/mc/mc_hash.hpp
src/mc/mc_ignore.hpp
- src/mc/mc_record.cpp
+ src/mc/mc_pattern.hpp
src/mc/mc_private.hpp
+ src/mc/mc_record.cpp
src/mc/mc_safety.hpp
- src/mc/VisitedState.cpp
- src/mc/VisitedState.hpp
- src/mc/mc_client_api.cpp
src/mc/mc_smx.cpp
- src/mc/mc_exit.hpp
- src/mc/api/State.hpp
- src/mc/api/State.cpp
- src/mc/transition/Transition.hpp
- src/mc/transition/TransitionAny.cpp
- src/mc/transition/TransitionAny.hpp
- src/mc/transition/TransitionComm.cpp
- src/mc/transition/TransitionComm.hpp
- src/mc/transition/TransitionRandom.cpp
- src/mc/transition/TransitionRandom.hpp
- src/mc/transition/TransitionSynchro.cpp
- src/mc/transition/TransitionSynchro.hpp
src/mc/udpor_global.cpp
src/mc/udpor_global.hpp
)
# these files get copied automatically to the html documentation
set(DOC_IMG
- ${CMAKE_HOME_DIRECTORY}/doc/webcruft/eclipseScreenShot.png
${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot.jpg
${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot_thn.jpg
+ ${CMAKE_HOME_DIRECTORY}/doc/webcruft/eclipseScreenShot.png
${CMAKE_HOME_DIRECTORY}/doc/webcruft/output.goal.pdf
)
${bin_files}
src/smpi/smpicc.in
src/smpi/smpicxx.in
- src/smpi/smpiff.in
src/smpi/smpif90.in
+ src/smpi/smpiff.in
src/smpi/smpirun.in
src/smpi/smpitools.sh
)
${txt_files}
AUTHORS
COPYING
- README.md
ChangeLog
LICENSE-LGPL-2.1
NEWS
+ README.md
)
# The list of cmake build directories is constructed from the following list.
# Add your CMakeLists file here to see your subdir built.
set(CMAKEFILES_TXT
- examples/platforms/CMakeLists.txt
examples/c/CMakeLists.txt
examples/cpp/CMakeLists.txt
+ examples/deprecated/java/CMakeLists.txt
+ examples/platforms/CMakeLists.txt
+ examples/python/CMakeLists.txt
examples/smpi/CMakeLists.txt
- examples/smpi/comm_dynamic_costs/CMakeLists.txt
examples/smpi/NAS/CMakeLists.txt
- examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
+ examples/smpi/comm_dynamic_costs/CMakeLists.txt
examples/smpi/replay_multiple/CMakeLists.txt
examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
- examples/python/CMakeLists.txt
- examples/deprecated/java/CMakeLists.txt
+ examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
teshsuite/java/CMakeLists.txt
teshsuite/kernel/CMakeLists.txt
teshsuite/python/CMakeLists.txt
teshsuite/s4u/CMakeLists.txt
teshsuite/smpi/CMakeLists.txt
- teshsuite/surf/CMakeLists.txt
- teshsuite/xbt/CMakeLists.txt
teshsuite/smpi/MBI/CMakeLists.txt
teshsuite/smpi/mpich3-test/CMakeLists.txt
teshsuite/smpi/mpich3-test/errhan/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt
- teshsuite/smpi/mpich3-test/f77/info/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/f77/info/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt
- teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
- teshsuite/smpi/mpich3-test/f77/topo/CMakeLists.txt
teshsuite/smpi/mpich3-test/f77/rma/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/f77/topo/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/info/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt
- teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
teshsuite/smpi/mpich3-test/f90/rma/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
teshsuite/smpi/mpich3-test/group/CMakeLists.txt
teshsuite/smpi/mpich3-test/info/CMakeLists.txt
- teshsuite/smpi/mpich3-test/io/CMakeLists.txt
teshsuite/smpi/mpich3-test/init/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/io/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/perf/CMakeLists.txt
teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt
- teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
teshsuite/smpi/mpich3-test/rma/CMakeLists.txt
- teshsuite/smpi/mpich3-test/perf/CMakeLists.txt
+ teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
+ teshsuite/surf/CMakeLists.txt
+ teshsuite/xbt/CMakeLists.txt
tools/CMakeLists.txt
tools/graphicator/CMakeLists.txt
tools/tesh/CMakeLists.txt
set(CMAKE_SOURCE_FILES
CMakeLists.txt
FindSimGrid.cmake
- tools/cmake/Tests.cmake
+ MANIFEST.in
+ MANIFEST.in.in
+ setup.py
tools/cmake/CTestConfig.cmake
tools/cmake/CTestCustom.cmake
tools/cmake/DefinePackages.cmake
tools/cmake/Distrib.cmake
- tools/cmake/Flags.cmake
tools/cmake/Documentation.cmake
- tools/cmake/MaintainerMode.cmake
+ tools/cmake/Flags.cmake
tools/cmake/Java.cmake
+ tools/cmake/MaintainerMode.cmake
tools/cmake/MakeLib.cmake
tools/cmake/MakeLibWin.cmake
tools/cmake/Modules/FindGraphviz.cmake
tools/cmake/Modules/FindLibdw.cmake
tools/cmake/Modules/FindLibelf.cmake
- tools/cmake/Modules/FindLibunwind.cmake
tools/cmake/Modules/FindLibevent.cmake
+ tools/cmake/Modules/FindLibunwind.cmake
tools/cmake/Modules/FindNS3.cmake
tools/cmake/Modules/FindPAPI.cmake
- tools/cmake/Modules/pybind11Config.cmake
tools/cmake/Modules/FindValgrind.cmake
+ tools/cmake/Modules/pybind11Config.cmake
tools/cmake/Option.cmake
+ tools/cmake/Tests.cmake
+ tools/cmake/cross-mingw.cmake
tools/cmake/scripts/fixup_simgrid_dtd_l.pl
tools/cmake/scripts/my_valgrind.pl
tools/cmake/scripts/update_tesh.pl
tools/cmake/test_prog/prog_stackgrowth.c
tools/cmake/test_prog/prog_stacksetup.c
tools/cmake/test_prog/prog_tsan.cpp
- tools/cmake/cross-mingw.cmake
tools/simgrid-monkey
tools/smpi/generate_smpi_defines.pl
+ tools/stack-cleaner/README
tools/stack-cleaner/as
- tools/stack-cleaner/cc
tools/stack-cleaner/c++
- tools/stack-cleaner/fortran
+ tools/stack-cleaner/cc
tools/stack-cleaner/clean-stack-filter
tools/stack-cleaner/compiler-wrapper
- tools/stack-cleaner/README
-
- setup.py
- MANIFEST.in
- MANIFEST.in.in
+ tools/stack-cleaner/fortran
)
set(PLATFORMS_EXAMPLES
- examples/platforms/bypassZoneRoute.xml
examples/platforms/bypassRoute.xml
+ examples/platforms/bypassZoneRoute.xml
examples/platforms/cloud.xml
- examples/platforms/cluster_backbone.xml
- examples/platforms/cluster_backbone.svg
- examples/platforms/cluster_multi.xml
examples/platforms/cluster_and_one_host.xml
- examples/platforms/cluster_crossbar.xml
+ examples/platforms/cluster_backbone.svg
+ examples/platforms/cluster_backbone.xml
examples/platforms/cluster_crossbar.svg
- examples/platforms/cluster_fat_tree.xml
+ examples/platforms/cluster_crossbar.xml
+ examples/platforms/cluster_dragonfly.svg
+ examples/platforms/cluster_dragonfly.xml
examples/platforms/cluster_fat_tree.svg
- examples/platforms/cluster_torus.xml
+ examples/platforms/cluster_fat_tree.xml
+ examples/platforms/cluster_multi.xml
examples/platforms/cluster_torus.svg
- examples/platforms/cluster_dragonfly.xml
- examples/platforms/cluster_dragonfly.svg
- examples/platforms/crosstraffic.xml
- examples/platforms/optorsim/gridpp_grid_2004.conf
- examples/platforms/optorsim/lcg_sept2004_grid.conf
- examples/platforms/optorsim/transform_optorsim_platform.pl
+ examples/platforms/cluster_torus.xml
examples/platforms/config.xml
examples/platforms/config_tracing.xml
- examples/platforms/model_checker_platform.xml
- examples/platforms/profiles/fafard_state.profile
- examples/platforms/profiles/faulty_host.profile
- examples/platforms/profiles/ginette_state.profile
- examples/platforms/profiles/jupiter_speed.profile
- examples/platforms/profiles/jupiter_state.profile
- examples/platforms/profiles/link1_bandwidth.profile
- examples/platforms/profiles/link1_latency.profile
- examples/platforms/profiles/link3_state.profile
- examples/platforms/profiles/link4_state.profile
- examples/platforms/profiles/trace_A_failure.txt
- examples/platforms/profiles/trace_A.txt
- examples/platforms/profiles/trace_B.txt
+ examples/platforms/crosstraffic.xml
examples/platforms/data_center.xml
examples/platforms/dogbone.xml
examples/platforms/energy_boot.xml
- examples/platforms/energy_platform.xml
examples/platforms/energy_cluster.xml
+ examples/platforms/energy_platform.xml
examples/platforms/faulty_host.xml
examples/platforms/g5k.xml
examples/platforms/griffon.cpp
examples/platforms/griffon.xml
examples/platforms/hosts_with_disks.xml
examples/platforms/meta_cluster.xml
+ examples/platforms/model_checker_platform.xml
examples/platforms/multicore_machine.xml
examples/platforms/ns3-big-cluster.xml
examples/platforms/onelink.xml
- examples/platforms/ptask_L07.xml
+ examples/platforms/optorsim/gridpp_grid_2004.conf
+ examples/platforms/optorsim/lcg_sept2004_grid.conf
+ examples/platforms/optorsim/transform_optorsim_platform.pl
+ examples/platforms/profiles/fafard_state.profile
+ examples/platforms/profiles/faulty_host.profile
+ examples/platforms/profiles/ginette_state.profile
+ examples/platforms/profiles/jupiter_speed.profile
+ examples/platforms/profiles/jupiter_state.profile
+ examples/platforms/profiles/link1_bandwidth.profile
+ examples/platforms/profiles/link1_latency.profile
+ examples/platforms/profiles/link3_state.profile
+ examples/platforms/profiles/link4_state.profile
+ examples/platforms/profiles/trace_A.txt
+ examples/platforms/profiles/trace_A_failure.txt
+ examples/platforms/profiles/trace_B.txt
examples/platforms/prop.xml
- examples/platforms/routing_cluster.xml
+ examples/platforms/ptask_L07.xml
examples/platforms/routing_cluster.cpp
+ examples/platforms/routing_cluster.xml
examples/platforms/simulacrum_7_hosts.xml
- examples/platforms/storage/content/small_content.txt
- examples/platforms/storage/content/storage_content.txt
examples/platforms/small_platform.xml
- examples/platforms/small_platform_routing_none.xml
examples/platforms/small_platform_failures.xml
examples/platforms/small_platform_fatpipe.xml
examples/platforms/small_platform_one_link_routes.xml
examples/platforms/small_platform_profile.xml
+ examples/platforms/small_platform_routing_none.xml
examples/platforms/small_platform_with_routers.xml
+ examples/platforms/storage/content/small_content.txt
+ examples/platforms/storage/content/storage_content.txt
+ examples/platforms/supernode.cpp
+ examples/platforms/supernode.py
+ examples/platforms/supernode.svg
examples/platforms/syscoord/generate_peer_platform.pl
examples/platforms/syscoord/median_harvard.syscoord
examples/platforms/syscoord/median_meridian.syscoord
examples/platforms/three_multicore_hosts.xml
examples/platforms/two_hosts.xml
examples/platforms/two_hosts_platform_shared.xml
- examples/platforms/two_hosts_profiles.xml
examples/platforms/two_hosts_platform_with_availability_included.xml
+ examples/platforms/two_hosts_profiles.xml
examples/platforms/two_peers.xml
examples/platforms/vivaldi.xml
+ examples/platforms/wifi.xml
examples/platforms/wifi_energy.xml
examples/platforms/wifi_ns3.xml
- examples/platforms/wifi.xml
)
set(generated_src_files
target_link_libraries(graphicator simgrid)
set_target_properties(graphicator PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
ADD_TESH(graphicator --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin
+ --setenv libdir=${CMAKE_BINARY_DIR}/lib
--cd ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/graphicator.tesh)
install(TARGETS graphicator DESTINATION ${CMAKE_INSTALL_BINDIR}/)
xbt_assert(argc == 3, "Usage: %s <platform_file.xml> <graphviz_file.dot|graphviz_file.csv>", argv[0]);
e.load_platform(argv[1]);
+ e.seal_platform();
const std::string outputfile(argv[2]);
const std::string extension = outputfile.substr(outputfile.find_last_of(".") + 1);
$ rm -f test.dot
-$ ${bindir:=.}/graphicator ${srcdir:=.}/teshsuite/platforms/one_cluster.xml test.csv
+$ ${bindir:=.}/graphicator ${libdir:=.}/libsupernode.so test.csv
> Dumping to CSV file
$ cat test.csv
> src,dst
-> bob_cluster_link_0_DOWN,bob0.hamburger.edu
-> bob_cluster_link_2_DOWN,bob2.hamburger.edu
-> bob_cluster_link_3_DOWN,bob3.hamburger.edu
-> bob_cluster_link_4_DOWN,bob4.hamburger.edu
-> bob_cluster_link_6_DOWN,bob6.hamburger.edu
-> bob_cluster_link_0_UP,bob_cluster_backbone
-> bob_cluster_link_2_UP,bob_cluster_backbone
-> bob_cluster_link_3_UP,bob_cluster_backbone
-> bob_cluster_link_4_UP,bob_cluster_backbone
-> bob_cluster_link_6_UP,bob_cluster_backbone
-> bob_cluster_backbone,bob_cluster_link_0_DOWN
-> bob0.hamburger.edu,bob_cluster_link_0_UP
-> bob_cluster_backbone,bob_cluster_link_2_DOWN
-> bob2.hamburger.edu,bob_cluster_link_2_UP
-> bob_cluster_backbone,bob_cluster_link_3_DOWN
-> bob3.hamburger.edu,bob_cluster_link_3_UP
-> bob_cluster_backbone,bob_cluster_link_4_DOWN
-> bob4.hamburger.edu,bob_cluster_link_4_UP
-> bob_cluster_backbone,bob_cluster_link_6_DOWN
-> bob6.hamburger.edu,bob_cluster_link_6_UP
-> bob_cluster_backbone,bob_cluster
-> bobbob_cluster_router.hamburger.edu,bob_cluster
+> link_cluster_supernode-00_node-00_cpu-00_DOWN,cluster_supernode-00_node-00_cpu-00
+> link_cluster_supernode-00_node-00_cpu-01_DOWN,cluster_supernode-00_node-00_cpu-01
+> link_cluster_supernode-00_node-00_cpu-00_UP,cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-00_cpu-01_UP,cluster_supernode-00_node-00
+> router_cluster_supernode-00_node-00,cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-01_cpu-00_DOWN,cluster_supernode-00_node-01_cpu-00
+> link_cluster_supernode-00_node-01_cpu-01_DOWN,cluster_supernode-00_node-01_cpu-01
+> link_cluster_supernode-00_node-01_cpu-00_UP,cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-01_cpu-01_UP,cluster_supernode-00_node-01
+> router_cluster_supernode-00_node-01,cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-02_cpu-00_DOWN,cluster_supernode-00_node-02_cpu-00
+> link_cluster_supernode-00_node-02_cpu-01_DOWN,cluster_supernode-00_node-02_cpu-01
+> link_cluster_supernode-00_node-02_cpu-00_UP,cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-02_cpu-01_UP,cluster_supernode-00_node-02
+> router_cluster_supernode-00_node-02,cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-03_cpu-00_DOWN,cluster_supernode-00_node-03_cpu-00
+> link_cluster_supernode-00_node-03_cpu-01_DOWN,cluster_supernode-00_node-03_cpu-01
+> link_cluster_supernode-00_node-03_cpu-00_UP,cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-03_cpu-01_UP,cluster_supernode-00_node-03
+> router_cluster_supernode-00_node-03,cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-04_cpu-00_DOWN,cluster_supernode-00_node-04_cpu-00
+> link_cluster_supernode-00_node-04_cpu-01_DOWN,cluster_supernode-00_node-04_cpu-01
+> link_cluster_supernode-00_node-04_cpu-00_UP,cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-04_cpu-01_UP,cluster_supernode-00_node-04
+> router_cluster_supernode-00_node-04,cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-05_cpu-00_DOWN,cluster_supernode-00_node-05_cpu-00
+> link_cluster_supernode-00_node-05_cpu-01_DOWN,cluster_supernode-00_node-05_cpu-01
+> link_cluster_supernode-00_node-05_cpu-00_UP,cluster_supernode-00_node-05
+> link_cluster_supernode-00_node-05_cpu-01_UP,cluster_supernode-00_node-05
+> router_cluster_supernode-00_node-05,cluster_supernode-00_node-05
+> link_cluster_supernode-00_node-00_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-01_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-02_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-03_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-04_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-05_UP,cluster_supernode-00
+> router_cluster_supernode-00,cluster_supernode-00
+> link_cluster_supernode-01_node-00_cpu-00_DOWN,cluster_supernode-01_node-00_cpu-00
+> link_cluster_supernode-01_node-00_cpu-01_DOWN,cluster_supernode-01_node-00_cpu-01
+> link_cluster_supernode-01_node-00_cpu-00_UP,cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-00_cpu-01_UP,cluster_supernode-01_node-00
+> router_cluster_supernode-01_node-00,cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-01_cpu-00_DOWN,cluster_supernode-01_node-01_cpu-00
+> link_cluster_supernode-01_node-01_cpu-01_DOWN,cluster_supernode-01_node-01_cpu-01
+> link_cluster_supernode-01_node-01_cpu-00_UP,cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-01_cpu-01_UP,cluster_supernode-01_node-01
+> router_cluster_supernode-01_node-01,cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-02_cpu-00_DOWN,cluster_supernode-01_node-02_cpu-00
+> link_cluster_supernode-01_node-02_cpu-01_DOWN,cluster_supernode-01_node-02_cpu-01
+> link_cluster_supernode-01_node-02_cpu-00_UP,cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-02_cpu-01_UP,cluster_supernode-01_node-02
+> router_cluster_supernode-01_node-02,cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-03_cpu-00_DOWN,cluster_supernode-01_node-03_cpu-00
+> link_cluster_supernode-01_node-03_cpu-01_DOWN,cluster_supernode-01_node-03_cpu-01
+> link_cluster_supernode-01_node-03_cpu-00_UP,cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-03_cpu-01_UP,cluster_supernode-01_node-03
+> router_cluster_supernode-01_node-03,cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-04_cpu-00_DOWN,cluster_supernode-01_node-04_cpu-00
+> link_cluster_supernode-01_node-04_cpu-01_DOWN,cluster_supernode-01_node-04_cpu-01
+> link_cluster_supernode-01_node-04_cpu-00_UP,cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-04_cpu-01_UP,cluster_supernode-01_node-04
+> router_cluster_supernode-01_node-04,cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-05_cpu-00_DOWN,cluster_supernode-01_node-05_cpu-00
+> link_cluster_supernode-01_node-05_cpu-01_DOWN,cluster_supernode-01_node-05_cpu-01
+> link_cluster_supernode-01_node-05_cpu-00_UP,cluster_supernode-01_node-05
+> link_cluster_supernode-01_node-05_cpu-01_UP,cluster_supernode-01_node-05
+> router_cluster_supernode-01_node-05,cluster_supernode-01_node-05
+> link_cluster_supernode-01_node-00_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-01_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-02_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-03_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-04_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-05_UP,cluster_supernode-01
+> router_cluster_supernode-01,cluster_supernode-01
+> link_cluster_supernode-02_node-00_cpu-00_DOWN,cluster_supernode-02_node-00_cpu-00
+> link_cluster_supernode-02_node-00_cpu-01_DOWN,cluster_supernode-02_node-00_cpu-01
+> link_cluster_supernode-02_node-00_cpu-00_UP,cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-00_cpu-01_UP,cluster_supernode-02_node-00
+> router_cluster_supernode-02_node-00,cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-01_cpu-00_DOWN,cluster_supernode-02_node-01_cpu-00
+> link_cluster_supernode-02_node-01_cpu-01_DOWN,cluster_supernode-02_node-01_cpu-01
+> link_cluster_supernode-02_node-01_cpu-00_UP,cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-01_cpu-01_UP,cluster_supernode-02_node-01
+> router_cluster_supernode-02_node-01,cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-02_cpu-00_DOWN,cluster_supernode-02_node-02_cpu-00
+> link_cluster_supernode-02_node-02_cpu-01_DOWN,cluster_supernode-02_node-02_cpu-01
+> link_cluster_supernode-02_node-02_cpu-00_UP,cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-02_cpu-01_UP,cluster_supernode-02_node-02
+> router_cluster_supernode-02_node-02,cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-03_cpu-00_DOWN,cluster_supernode-02_node-03_cpu-00
+> link_cluster_supernode-02_node-03_cpu-01_DOWN,cluster_supernode-02_node-03_cpu-01
+> link_cluster_supernode-02_node-03_cpu-00_UP,cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-03_cpu-01_UP,cluster_supernode-02_node-03
+> router_cluster_supernode-02_node-03,cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-04_cpu-00_DOWN,cluster_supernode-02_node-04_cpu-00
+> link_cluster_supernode-02_node-04_cpu-01_DOWN,cluster_supernode-02_node-04_cpu-01
+> link_cluster_supernode-02_node-04_cpu-00_UP,cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-04_cpu-01_UP,cluster_supernode-02_node-04
+> router_cluster_supernode-02_node-04,cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-05_cpu-00_DOWN,cluster_supernode-02_node-05_cpu-00
+> link_cluster_supernode-02_node-05_cpu-01_DOWN,cluster_supernode-02_node-05_cpu-01
+> link_cluster_supernode-02_node-05_cpu-00_UP,cluster_supernode-02_node-05
+> link_cluster_supernode-02_node-05_cpu-01_UP,cluster_supernode-02_node-05
+> router_cluster_supernode-02_node-05,cluster_supernode-02_node-05
+> link_cluster_supernode-02_node-00_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-01_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-02_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-03_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-04_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-05_UP,cluster_supernode-02
+> router_cluster_supernode-02,cluster_supernode-02
+> link_cluster_supernode-03_node-00_cpu-00_DOWN,cluster_supernode-03_node-00_cpu-00
+> link_cluster_supernode-03_node-00_cpu-01_DOWN,cluster_supernode-03_node-00_cpu-01
+> link_cluster_supernode-03_node-00_cpu-00_UP,cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-00_cpu-01_UP,cluster_supernode-03_node-00
+> router_cluster_supernode-03_node-00,cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-01_cpu-00_DOWN,cluster_supernode-03_node-01_cpu-00
+> link_cluster_supernode-03_node-01_cpu-01_DOWN,cluster_supernode-03_node-01_cpu-01
+> link_cluster_supernode-03_node-01_cpu-00_UP,cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-01_cpu-01_UP,cluster_supernode-03_node-01
+> router_cluster_supernode-03_node-01,cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-02_cpu-00_DOWN,cluster_supernode-03_node-02_cpu-00
+> link_cluster_supernode-03_node-02_cpu-01_DOWN,cluster_supernode-03_node-02_cpu-01
+> link_cluster_supernode-03_node-02_cpu-00_UP,cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-02_cpu-01_UP,cluster_supernode-03_node-02
+> router_cluster_supernode-03_node-02,cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-03_cpu-00_DOWN,cluster_supernode-03_node-03_cpu-00
+> link_cluster_supernode-03_node-03_cpu-01_DOWN,cluster_supernode-03_node-03_cpu-01
+> link_cluster_supernode-03_node-03_cpu-00_UP,cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-03_cpu-01_UP,cluster_supernode-03_node-03
+> router_cluster_supernode-03_node-03,cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-04_cpu-00_DOWN,cluster_supernode-03_node-04_cpu-00
+> link_cluster_supernode-03_node-04_cpu-01_DOWN,cluster_supernode-03_node-04_cpu-01
+> link_cluster_supernode-03_node-04_cpu-00_UP,cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-04_cpu-01_UP,cluster_supernode-03_node-04
+> router_cluster_supernode-03_node-04,cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-05_cpu-00_DOWN,cluster_supernode-03_node-05_cpu-00
+> link_cluster_supernode-03_node-05_cpu-01_DOWN,cluster_supernode-03_node-05_cpu-01
+> link_cluster_supernode-03_node-05_cpu-00_UP,cluster_supernode-03_node-05
+> link_cluster_supernode-03_node-05_cpu-01_UP,cluster_supernode-03_node-05
+> router_cluster_supernode-03_node-05,cluster_supernode-03_node-05
+> link_cluster_supernode-03_node-00_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-01_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-02_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-03_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-04_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-05_UP,cluster_supernode-03
+> router_cluster_supernode-03,cluster_supernode-03
+> link_cluster_supernode-00_UP,cluster
+> link_cluster_supernode-01_UP,cluster
+> link_cluster_supernode-02_UP,cluster
+> link_cluster_supernode-03_UP,cluster
+> cluster,link_cluster_supernode-00_DOWN
+> router_cluster_supernode-00,link_cluster_supernode-00_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-00_DOWN
+> router_cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_UP
+> cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_cpu-00_DOWN
+> cluster_supernode-00_node-00_cpu-00,link_cluster_supernode-00_node-00_cpu-00_UP
+> cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_cpu-01_DOWN
+> cluster_supernode-00_node-00_cpu-01,link_cluster_supernode-00_node-00_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-01_DOWN
+> router_cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_UP
+> cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_cpu-00_DOWN
+> cluster_supernode-00_node-01_cpu-00,link_cluster_supernode-00_node-01_cpu-00_UP
+> cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_cpu-01_DOWN
+> cluster_supernode-00_node-01_cpu-01,link_cluster_supernode-00_node-01_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-02_DOWN
+> router_cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_UP
+> cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_cpu-00_DOWN
+> cluster_supernode-00_node-02_cpu-00,link_cluster_supernode-00_node-02_cpu-00_UP
+> cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_cpu-01_DOWN
+> cluster_supernode-00_node-02_cpu-01,link_cluster_supernode-00_node-02_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-03_DOWN
+> router_cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_UP
+> cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_cpu-00_DOWN
+> cluster_supernode-00_node-03_cpu-00,link_cluster_supernode-00_node-03_cpu-00_UP
+> cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_cpu-01_DOWN
+> cluster_supernode-00_node-03_cpu-01,link_cluster_supernode-00_node-03_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-04_DOWN
+> router_cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_UP
+> cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_cpu-00_DOWN
+> cluster_supernode-00_node-04_cpu-00,link_cluster_supernode-00_node-04_cpu-00_UP
+> cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_cpu-01_DOWN
+> cluster_supernode-00_node-04_cpu-01,link_cluster_supernode-00_node-04_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-05_DOWN
+> router_cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_UP
+> cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_cpu-00_DOWN
+> cluster_supernode-00_node-05_cpu-00,link_cluster_supernode-00_node-05_cpu-00_UP
+> cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_cpu-01_DOWN
+> cluster_supernode-00_node-05_cpu-01,link_cluster_supernode-00_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-01_DOWN
+> router_cluster_supernode-01,link_cluster_supernode-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-00_DOWN
+> router_cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_UP
+> cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_cpu-00_DOWN
+> cluster_supernode-01_node-00_cpu-00,link_cluster_supernode-01_node-00_cpu-00_UP
+> cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_cpu-01_DOWN
+> cluster_supernode-01_node-00_cpu-01,link_cluster_supernode-01_node-00_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-01_DOWN
+> router_cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_UP
+> cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_cpu-00_DOWN
+> cluster_supernode-01_node-01_cpu-00,link_cluster_supernode-01_node-01_cpu-00_UP
+> cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_cpu-01_DOWN
+> cluster_supernode-01_node-01_cpu-01,link_cluster_supernode-01_node-01_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-02_DOWN
+> router_cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_UP
+> cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_cpu-00_DOWN
+> cluster_supernode-01_node-02_cpu-00,link_cluster_supernode-01_node-02_cpu-00_UP
+> cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_cpu-01_DOWN
+> cluster_supernode-01_node-02_cpu-01,link_cluster_supernode-01_node-02_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-03_DOWN
+> router_cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_UP
+> cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_cpu-00_DOWN
+> cluster_supernode-01_node-03_cpu-00,link_cluster_supernode-01_node-03_cpu-00_UP
+> cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_cpu-01_DOWN
+> cluster_supernode-01_node-03_cpu-01,link_cluster_supernode-01_node-03_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-04_DOWN
+> router_cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_UP
+> cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_cpu-00_DOWN
+> cluster_supernode-01_node-04_cpu-00,link_cluster_supernode-01_node-04_cpu-00_UP
+> cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_cpu-01_DOWN
+> cluster_supernode-01_node-04_cpu-01,link_cluster_supernode-01_node-04_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-05_DOWN
+> router_cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_UP
+> cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_cpu-00_DOWN
+> cluster_supernode-01_node-05_cpu-00,link_cluster_supernode-01_node-05_cpu-00_UP
+> cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_cpu-01_DOWN
+> cluster_supernode-01_node-05_cpu-01,link_cluster_supernode-01_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-02_DOWN
+> router_cluster_supernode-02,link_cluster_supernode-02_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-00_DOWN
+> router_cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_UP
+> cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_cpu-00_DOWN
+> cluster_supernode-02_node-00_cpu-00,link_cluster_supernode-02_node-00_cpu-00_UP
+> cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_cpu-01_DOWN
+> cluster_supernode-02_node-00_cpu-01,link_cluster_supernode-02_node-00_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-01_DOWN
+> router_cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_UP
+> cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_cpu-00_DOWN
+> cluster_supernode-02_node-01_cpu-00,link_cluster_supernode-02_node-01_cpu-00_UP
+> cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_cpu-01_DOWN
+> cluster_supernode-02_node-01_cpu-01,link_cluster_supernode-02_node-01_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-02_DOWN
+> router_cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_UP
+> cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_cpu-00_DOWN
+> cluster_supernode-02_node-02_cpu-00,link_cluster_supernode-02_node-02_cpu-00_UP
+> cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_cpu-01_DOWN
+> cluster_supernode-02_node-02_cpu-01,link_cluster_supernode-02_node-02_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-03_DOWN
+> router_cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_UP
+> cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_cpu-00_DOWN
+> cluster_supernode-02_node-03_cpu-00,link_cluster_supernode-02_node-03_cpu-00_UP
+> cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_cpu-01_DOWN
+> cluster_supernode-02_node-03_cpu-01,link_cluster_supernode-02_node-03_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-04_DOWN
+> router_cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_UP
+> cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_cpu-00_DOWN
+> cluster_supernode-02_node-04_cpu-00,link_cluster_supernode-02_node-04_cpu-00_UP
+> cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_cpu-01_DOWN
+> cluster_supernode-02_node-04_cpu-01,link_cluster_supernode-02_node-04_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-05_DOWN
+> router_cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_UP
+> cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_cpu-00_DOWN
+> cluster_supernode-02_node-05_cpu-00,link_cluster_supernode-02_node-05_cpu-00_UP
+> cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_cpu-01_DOWN
+> cluster_supernode-02_node-05_cpu-01,link_cluster_supernode-02_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-03_DOWN
+> router_cluster_supernode-03,link_cluster_supernode-03_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-00_DOWN
+> router_cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_UP
+> cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_cpu-00_DOWN
+> cluster_supernode-03_node-00_cpu-00,link_cluster_supernode-03_node-00_cpu-00_UP
+> cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_cpu-01_DOWN
+> cluster_supernode-03_node-00_cpu-01,link_cluster_supernode-03_node-00_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-01_DOWN
+> router_cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_UP
+> cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_cpu-00_DOWN
+> cluster_supernode-03_node-01_cpu-00,link_cluster_supernode-03_node-01_cpu-00_UP
+> cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_cpu-01_DOWN
+> cluster_supernode-03_node-01_cpu-01,link_cluster_supernode-03_node-01_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-02_DOWN
+> router_cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_UP
+> cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_cpu-00_DOWN
+> cluster_supernode-03_node-02_cpu-00,link_cluster_supernode-03_node-02_cpu-00_UP
+> cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_cpu-01_DOWN
+> cluster_supernode-03_node-02_cpu-01,link_cluster_supernode-03_node-02_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-03_DOWN
+> router_cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_UP
+> cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_cpu-00_DOWN
+> cluster_supernode-03_node-03_cpu-00,link_cluster_supernode-03_node-03_cpu-00_UP
+> cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_cpu-01_DOWN
+> cluster_supernode-03_node-03_cpu-01,link_cluster_supernode-03_node-03_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-04_DOWN
+> router_cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_UP
+> cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_cpu-00_DOWN
+> cluster_supernode-03_node-04_cpu-00,link_cluster_supernode-03_node-04_cpu-00_UP
+> cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_cpu-01_DOWN
+> cluster_supernode-03_node-04_cpu-01,link_cluster_supernode-03_node-04_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-05_DOWN
+> router_cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_UP
+> cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_cpu-00_DOWN
+> cluster_supernode-03_node-05_cpu-00,link_cluster_supernode-03_node-05_cpu-00_UP
+> cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_cpu-01_DOWN
+> cluster_supernode-03_node-05_cpu-01,link_cluster_supernode-03_node-05_cpu-01_UP
+> link_cluster_supernode-00_node-00_DOWN,router_cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-01_DOWN,router_cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-02_DOWN,router_cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-03_DOWN,router_cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-04_DOWN,router_cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-05_DOWN,router_cluster_supernode-00_node-05
+> link_cluster_supernode-00_DOWN,router_cluster_supernode-00
+> link_cluster_supernode-01_node-00_DOWN,router_cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-01_DOWN,router_cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-02_DOWN,router_cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-03_DOWN,router_cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-04_DOWN,router_cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-05_DOWN,router_cluster_supernode-01_node-05
+> link_cluster_supernode-01_DOWN,router_cluster_supernode-01
+> link_cluster_supernode-02_node-00_DOWN,router_cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-01_DOWN,router_cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-02_DOWN,router_cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-03_DOWN,router_cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-04_DOWN,router_cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-05_DOWN,router_cluster_supernode-02_node-05
+> link_cluster_supernode-02_DOWN,router_cluster_supernode-02
+> link_cluster_supernode-03_node-00_DOWN,router_cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-01_DOWN,router_cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-02_DOWN,router_cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-03_DOWN,router_cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-04_DOWN,router_cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-05_DOWN,router_cluster_supernode-03_node-05
+> link_cluster_supernode-03_DOWN,router_cluster_supernode-03
$ rm -f test.csv