Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
completely revamp the MSG tutorial
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 8 Mar 2018 16:01:32 +0000 (17:01 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 8 Mar 2018 16:01:36 +0000 (17:01 +0100)
I should have converted this to S4U while I was at it, I know.

18 files changed:
.gitignore
doc/Doxyfile.in
doc/doxygen/tutorial_msg.doc [deleted file]
doc/tuto-msg/Makefile [moved from doc/msg-tuto-src/Makefile with 77% similarity]
doc/tuto-msg/deployment0.xml [moved from doc/msg-tuto-src/deployment0.xml with 100% similarity]
doc/tuto-msg/deployment1.xml [moved from doc/msg-tuto-src/deployment1.xml with 100% similarity]
doc/tuto-msg/deployment2.xml [moved from doc/msg-tuto-src/deployment2.xml with 81% similarity]
doc/tuto-msg/deployment3.xml [moved from doc/msg-tuto-src/deployment3.xml with 55% similarity]
doc/tuto-msg/deployment_general.xml [moved from doc/msg-tuto-src/deployment_general.xml with 100% similarity]
doc/tuto-msg/masterworker-sol1.c [moved from doc/msg-tuto-src/masterworker1.c with 75% similarity]
doc/tuto-msg/masterworker-sol2.c [moved from doc/msg-tuto-src/masterworker2.c with 73% similarity]
doc/tuto-msg/masterworker-sol3.c [moved from doc/msg-tuto-src/masterworker3.c with 76% similarity]
doc/tuto-msg/masterworker-sol4.c [moved from doc/msg-tuto-src/masterworker4.c with 61% similarity]
doc/tuto-msg/masterworker.c [moved from doc/msg-tuto-src/masterworker0.c with 81% similarity]
doc/tuto-msg/overview.svg [new file with mode: 0644]
doc/tuto-msg/tuto-msg.doc [new file with mode: 0644]
tools/cmake/DefinePackages.cmake
tools/cmake/Tests.cmake

index 58d9eba..7004580 100644 (file)
@@ -117,11 +117,11 @@ tags
 callgrind.out.*
 ### Examples and traces
 *.exe
 callgrind.out.*
 ### Examples and traces
 *.exe
-doc/msg-tuto-src/masterworker0
-doc/msg-tuto-src/masterworker1
-doc/msg-tuto-src/masterworker2
-doc/msg-tuto-src/masterworker3
-doc/msg-tuto-src/masterworker4
+doc/tuto-msg/masterworker
+doc/tuto-msg/masterworker-sol1
+doc/tuto-msg/masterworker2
+doc/tuto-msg/masterworker3
+doc/tuto-msg/masterworker4
 examples/msg/cloud-masterworker/cloud-masterworker
 examples/msg/dht-kademlia/dht-kademlia
 examples/msg/dht-pastry/dht-pastry
 examples/msg/cloud-masterworker/cloud-masterworker
 examples/msg/dht-kademlia/dht-kademlia
 examples/msg/dht-pastry/dht-pastry
index bb6958f..c40b913 100644 (file)
@@ -659,7 +659,7 @@ INPUT                  = doxygen/index.doc \
                           doxygen/outcomes_logs.doc \
                           doxygen/outcomes_vizu.doc \
                           doxygen/outcomes_MC.doc \
                           doxygen/outcomes_logs.doc \
                           doxygen/outcomes_vizu.doc \
                           doxygen/outcomes_MC.doc \
-                         doxygen/tutorial_msg.doc \
+                         tuto-msg/tuto-msg.doc \
                          doxygen/tutorial_smpi.doc \
                          doxygen/examples.doc \
                         doxygen/howtos.doc \
                          doxygen/tutorial_smpi.doc \
                          doxygen/examples.doc \
                         doxygen/howtos.doc \
@@ -772,7 +772,8 @@ EXAMPLE_PATH           = ./ \
                          @CMAKE_HOME_DIRECTORY@/src/xbt/ \
                          @CMAKE_HOME_DIRECTORY@/include \
                          @CMAKE_HOME_DIRECTORY@/examples \
                          @CMAKE_HOME_DIRECTORY@/src/xbt/ \
                          @CMAKE_HOME_DIRECTORY@/include \
                          @CMAKE_HOME_DIRECTORY@/examples \
-                         @CMAKE_HOME_DIRECTORY@/doc/example_lists
+                         @CMAKE_HOME_DIRECTORY@/doc/example_lists \
+                         @CMAKE_HOME_DIRECTORY@/doc/tuto-msg
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
diff --git a/doc/doxygen/tutorial_msg.doc b/doc/doxygen/tutorial_msg.doc
deleted file mode 100644 (file)
index 3149ffc..0000000
+++ /dev/null
@@ -1,438 +0,0 @@
-/*! @page tutorial_msg SimGrid Tutorial with MSG
-
-SimGrid is a toolkit providing the core functionalities for the
-simulation of distributed applications in heterogeneous distributed
-environments.
-
-The project goal is both to facilitate research and to help improving
-real applications in the area of distributed and parallel systems,
-ranging from simple network of workstations to Computational Grids to
-Clouds and to supercomputers.
-
-\tableofcontents
-
-\section  Scenario
-The goal of this practical session is to illustrate various usage of
-the MSG interface. To this end we will use the following simple setting:
-
-> Assume we have a (possibly large) bunch of (possibly large) data to
-> process and which originally reside on a server (a.k.a. master). For
-> sake of simplicity, we assume all input file require the same amount
-> of computation. We assume the server can be helped by a (possibly
-> large) set of worker machines. What is the best way to organize the
-> computations ?
-
-Although this looks like a very simple setting it raises several
-interesting questions:
-
-- Which algorithm should the master use to send workload?
-
-    The most obvious algorithm would be to send tasks to workers in a
-    round-robin fashion. This is the initial code we provide you.
-
-    A less obvious but probably more efficient approach would be to set up
-    a request mechanism where a client first ask for tasks, which allows
-    the server to decide which request to answer and possibly to send
-    the tasks to the fastest machines. Maybe you can think of a
-    smarter mechanism...
-
-- How many tasks should the client ask for?
-
-    Indeed, if we set up a request mechanism so that workers only
-    send request whenever they have no more task to process, they are
-    likely to be poorly exploited since they will have to wait for the
-    master to consider their request and for the input data to be
-    transferred. A client should thus probably request a pool of tasks
-    but if it requests too many tasks, it is likely to lead to a poor
-    load-balancing...
-
-- How is the quality of such algorithm dependent on the platform
-    characteristics and on the task characteristics?
-
-    Whenever the input communication time is very small compared to
-    processing time and workers are homogeneous, it is likely that the
-    round-robin algorithm performs very well. Would it still hold true
-    when transfer time is not negligible and the platform is, say,
-    a volunteer computing system ?
-
-- The network topology interconnecting the master and the workers
-  may be quite complicated. How does such a topology impact the
-  previous result?
-
-    When data transfers are the bottleneck, it is likely that a good
-    modeling of the platform becomes essential. In this case, you may
-    want to be able to account for complex platform topologies.
-
-- Do the algorithms depend on a perfect knowledge of this
-  topology?
-
-    Should we still use a flat master worker deployment or should we
-    use a
-
-- How is such an algorithm sensitive to external workload variation?
-
-    What if bandwidth, latency and power can vary with no warning?
-    Shouldn't you study whether your algorithm is sensitive to such
-    load variations?
-
-- Although an algorithm may be more efficient than another, how
-  does it interfere with other applications?
-
-    As you can see, this very simple setting may need to evolve way
-    beyond what you initially imagined.
-
-    <blockquote> Premature optimization is  the root of all evil. -- D.E.Knuth</blockquote>
-
-    Furthermore, writing your own simulator is much harder than you
-    may imagine. This is why you should rely on an established and flexible
-    one.
-
-The following figure is a screenshot of [triva][fn:1] visualizing a [SimGrid
-simulation][fn:2] of two master worker applications (one in light gray and
-the other in dark gray) running in concurrence and showing resource
-usage over a long period of time.
-
-![Test](./sc3-description.png)
-
-\section Prerequisites
-
-Of course, you need to install SimGrid before taking this tutorial.
-Please refer to the relevant Section: \ref install.
-
-## Tutorials
-
-A lot of information on how to install and use Simgrid are
-provided by the [online documentation][fn:4] and by several tutorials:
-
-- http://simgrid.gforge.inria.fr/tutorials/simgrid-use-101.pdf
-- http://simgrid.gforge.inria.fr/tutorials/simgrid-tracing-101.pdf
-- http://simgrid.gforge.inria.fr/tutorials/simgrid-platf-101.pdf
-
-## Installing the visualization softwares
-
-Several tools can be used to visualize the result of SimGrid
-simulations and get a better understanding of simulations.
-
-- [pajeng][fn:5] provides a Gantt-chart visualization.
-- [Vite][fn:6] also provides a Gantt-chart visualization.
-
-Under Debian or Ubuntu, this is really easy with apt-get, while you
-may have to install from the source on other systems. Check the
-documentation of each software for more details.
-
-~~~~{.sh}
-sudo apt-get install pajeng vite
-~~~~
-
-\section intro_start Let's get started
-
-\anchor intro_setup
-## Setting up and Compiling
-
-The corresponding source files can be obtained
-[online on GitLab](https://gitlab.inria.fr/simgrid/simgrid/tree/master/doc/msg-tuto-src). 
-If you find the right button on the top right of the interface, you can download the whole 
-directory in one archive file. If you wish, you can find other platform file in 
-[this GitLab directory](https://gitlab.inria.fr/simgrid/simgrid/tree/master/examples/platforms).
-
-As you can see, there is already a little Makefile that compiles
-everything for you. If you struggle with the compilation, then you should double check 
-your @ref install "SimGrid installation". 
-On need, please refer to the @ref install_yours_trouble section.
-
-Once the tiny example has been compiled and it can be easily run as follows:
-
-~~~~{.sh}
-./masterworker0 platforms/platform.xml deployment0.xml
-~~~~
-
-For a more "fancy" output, you can use simgrid-colorizer. 
-
-~~~~{.sh}
-./masterworker0 platforms/platform.xml deployment0.xml 2>&1 | simgrid-colorizer
-~~~~
-
-If you installed SimGrid to a non-standard path, you may have to
-specify the full path to simgrid-colorizer on the above line, such as
-\c /opt/simgrid/bin/simgrid-colorizer. If you did not install it at all,
-you can find it in <simgrid_root_directory>/bin/colorize.
-
-For a classical Gantt-Chart visualization, you can produce a [Paje][fn:5] trace:
-
-~~~~{.sh}
-./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \
-    --cfg=tracing/msg/process:yes
-pajeng simgrid.trace
-~~~~
-
-Alternatively, you can use [vite][fn:6].
-
-~~~~{.sh}
-./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \
-    --cfg=tracing/msg/process:yes --cfg=tracing/basic:yes
-vite simgrid.trace
-~~~~
-
-## Getting Rid of Workers in the Deployment File
-
-In the previous example, the deployment file `deployment0.xml`
-is tightly connected to the platform file `platform.xml` and a
-worker process is launched on each host:
-
-~~~~{.xml}
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
-     <argument value="20"/>       <!-- Number of tasks -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="1000000"/>   <!-- Communication size of tasks -->
-     <argument value="Jupiter"/>  <!-- First worker -->
-     <argument value="Fafard"/>   <!-- Second worker -->
-     <argument value="Ginette"/>  <!-- Third worker -->
-     <argument value="Bourassa"/> <!-- Last worker -->
-     <argument value="Tremblay"/> <!-- Me! I can work too! -->
-  </process>
-  <!-- The worker process (with no argument) -->
-  <process host="Tremblay" function="worker" on_failure="RESTART"/>
-  <process host="Jupiter" function="worker" on_failure="RESTART"/>
-  <process host="Fafard" function="worker" on_failure="RESTART"/>
-  <process host="Ginette" function="worker" on_failure="RESTART"/>
-  <process host="Bourassa" function="worker" on_failure="RESTART"/>
-</platform>
-~~~~
-
-This is ok as the platform is rather small but will be painful when
-using larger platforms. Instead, modify the simulator
-`masterworker0.c` into `masterworker1.c` so that the master
-launches a worker process on all the other machines at startup. The
-new deployment file `deployment1.xml` should thus now simply be:
-
-~~~~{.xml}
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
-     <argument value="20"/>       <!-- Number of tasks -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="1000000"/>   <!-- Communication size of tasks -->
-  </process>
-</platform>
-~~~~
-
-To this end you may need the following MSG functions (click on the links
-to see their descriptions):
-
-~~~~{.c}
-int MSG_get_host_number(void);
-xbt_dynar_t MSG_hosts_as_dynar(void);
-void * xbt_dynar_to_array (xbt_dynar_t dynar);
-msg_process_t MSG_process_create(const char *name, xbt_main_func_t code,
-                                 void *data, msg_host_t host);
-~~~~
-
-\note
-    It may avoid bugs later to avoid launching a worker on
-    the master host so you probably want to remove it from the host
-    list.
-
-The `data` field of the @ref MSG_process_create can be used to pass
-a channel name that will be private between master
-and workers (e.g., `master_name:worker_name`). Adding the
-`master_name` in the channel name will allow to easily have several
-masters and a worker per master on each machine. To this end, you
-may need to use the following functions:
-
-~~~~{.c}
-msg_host_t MSG_host_self(void);
-const char * MSG_host_get_name(msg_host_t host);
-msg_process_t MSG_process_self(void);
-void * MSG_process_get_data(msg_process_t process);
-~~~~
-
-If you are not too familiar with string
-manipulation in C, you may want to use the following functions
-(see the C reference for details):
-
-~~~~{.c}
-char *strcpy(char *dest, const char *src);
-char *strcat(char *dest, const char *src);
-~~~~
-
-## Setting up a Time Limit Mechanism
-
-In the current version, the number of tasks is defined through the
-worker arguments. Hence, tasks are created at the very beginning of
-the simulation. Instead, create tasks as needed and provide a time
-limit indicating when it stops sending tasks. To this end, you will
-obviously need to know what time it is:
-
-~~~~{.c}
-double MSG_get_clock(void);
-~~~~
-
-Otherwise, a quite effective way of terminating the simulation
-would be to use some of the following functions:
-
-~~~~{.c}
-void MSG_process_kill(msg_process_t process);
-int MSG_process_killall(int reset_PIDs);
-~~~~
-
-Anyway, the new deployment `deployment2.xml` file should thus look
-like this:
-
-~~~~{.xml}
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="1000000"/>   <!-- Communication size of tasks -->
-  </process>
-</platform>
-~~~~
-
-It may also be a good idea to transform most of the `XBT_INFO` into
-`XBT_DEBUG` (e.g., keep the information on the total number of
-tasks processed). These debug messages can be activated as follows:
-
-~~~~{.sh}
-./masterworker2 platforms/platform.xml deployment2.xml --log=msg_test.thres:debug
-~~~~
-
-## Using the Tracing Mechanism
-
-SimGrid can trace all resource consumption and the outcome can be
-displayed as illustrated in the section \ref intro_setup. However, when several
-masters are deployed, it is hard to understand what happens.
-
-~~~~{.xml}
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
-  <process host="Tremblay" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
-  <process host="Fafard" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
-  <process host="Jupiter" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
-     <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
-</platform>
-~~~~
-
-So let's use categories to track more precisely who does what and when:
-
-~~~~{.c}
-void TRACE_category(const char *category);
-void MSG_task_set_category (msg_task_t task, const char *category);
-~~~~
-
-The outcome can then be visualized as a Gantt-chart as follows:
-
-~~~~{.sh}
-./masterworker3 platforms/platform.xml deployment3.xml --cfg=tracing:yes \
-    --cfg=tracing/msg/process:yes
-pajeng simgrid.trace
-~~~~
-
-Right now, you should realize that nothing is behaving like you expect. Most
-workers are idle even though input data are ridiculous and there are several
-masters deployed on the platform. So it should now be obvious that round robin
-is actually very bad.
-
-## Improving the Scheduling
-
-Instead of a round-robin scheduling, let's implement a first-come
-first-served mechanism. To this end, workers need to send a tiny
-request first. A possible way to implement such a request with MSG
-is to send on a specific channel (e.g., the name of the master
-name) a task with payload 0 and whose attached data is the worker
-name. This way, the master can keep track of which workers are idle
-and willing to work.
-
-To know whether it has pending requests, the master can use the
-following [function][fn:7]:
-
-~~~~{.c}
-int MSG_task_listen(const char *alias);
-~~~~
-
-If so, it should get the request and push the corresponding host
-into a dynar so that they can later be retrieved when sending a
-real [task][fn:7].
-
-~~~~{.c}
-xbt_dynar_t xbt_dynar_new(const unsigned long elm_size,
-                          void_f_pvoid_t const free_f);
-void xbt_dynar_push(xbt_dynar_t const dynar, const void *src);
-void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst);
-unsigned long xbt_dynar_length(const xbt_dynar_t dynar);
-~~~~
-
-As you will soon realize, with such simple mechanisms, simple
-deadlocks will soon appear. They can easily be removed with a
-simple polling mechanism, hence the need for the following
-[function][fn:7]:
-
-~~~~{.c}
-msg_error_t MSG_process_sleep(double nb_sec);
-~~~~
-
-As you should quickly realize, on the simple previous example, it
-will double the throughput of the platform but will be quite
-ineffective when input size of the tasks is not negligible anymore.
-
-From this, many things can easily be added. For example, you could:
-- add a performance measurement mechanism;
-- enable the master to make smart scheduling choices using
-  measurement information;
-- allow workers to have several pending requests so as to overlap
-  communication and computations as much as possible;
-- ...
-
-## Using More Elaborate Platforms
-
-SimGrid offers a rather powerful platform modeling mechanism. The
-`src/examples/platforms/` repository comprises a variety of platforms ranging
-from simple to elaborate. Associated to a good
-visualization tool to ensure your simulation is meaningful, they
-can allow you to study to which extent your algorithm scales...
-
-What is the largest number of tasks requiring 50e6 flops and 1e5
-bytes that you manage to distribute and process in one hour on
-`g5k.xml` (you should use `deployment_general.xml`)?
-
-\section intro_todo TODO: Points to improve for the next time
-
-- Propose equivalent exercises and skeleton in java.
-- Propose a virtualbox image with everything (simgrid, pajeng, ...) already set
-  up.
-- Ease the installation on mac OS X (binary installer) and
-  windows.
-- Explain that programming in C or java and having a working
-  development environment is a prerequisite.
-
-[fn:1]: http://triva.gforge.inria.fr/index.html
-[fn:2]: http://hal.inria.fr/inria-00529569
-[fn:3]: http://hal.inria.fr/hal-00738321
-[fn:4]: http://simgrid.gforge.inria.fr/simgrid/latest/doc/
-[fn:5]: https://github.com/schnorr/pajeng/
-[fn:6]: http://vite.gforge.inria.fr/
-
-
-
-
-
-*/
similarity index 77%
rename from doc/msg-tuto-src/Makefile
rename to doc/tuto-msg/Makefile
index 316c306..01981ad 100644 (file)
@@ -4,23 +4,20 @@
 # http://simgrid.gforge.inria.fr/simgrid/latest/doc/install_yours.html
 
 # Some configuration
 # http://simgrid.gforge.inria.fr/simgrid/latest/doc/install_yours.html
 
 # Some configuration
-SIMGRID_INSTALL_PATH = /opt/simgrid # Where you installed simgrid
+SIMGRID_INSTALL_PATH = ../.. # Where you installed simgrid 
 CC = gcc                            # Your compiler (on Mac, use clang instead)
 
 # No change needed bellow for this tutorial.
 ############################################################################
 
 CC = gcc                            # Your compiler (on Mac, use clang instead)
 
 # No change needed bellow for this tutorial.
 ############################################################################
 
-all: masterworker0 masterworker1 masterworker2 masterworker3 masterworker4
-masterworker0: masterworker0.o
-masterworker1: masterworker1.o
-masterworker2: masterworker2.o
-masterworker3: masterworker3.o
-masterworker4: masterworker4.o
+all: masterworker
+masterworker: masterworker.o
 
 WARNING = -Wshadow -Wcast-align -Waggregate-return -Wmissing-prototypes \
           -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes \
           -Wmissing-declarations -Wmissing-noreturn -Wredundant-decls \
          -Wnested-externs -Wpointer-arith -Wwrite-strings
 
 WARNING = -Wshadow -Wcast-align -Waggregate-return -Wmissing-prototypes \
           -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes \
           -Wmissing-declarations -Wmissing-noreturn -Wredundant-decls \
          -Wnested-externs -Wpointer-arith -Wwrite-strings
+WARNING += -Werror # Comment that line to not be in paranoid mode
 
 # CFLAGS = -g -O0 $(WARNINGS) # Use this line to make debugging easier
 CFLAGS = -g -O2 $(WARNINGS) # Use this line to get better performance
 
 # CFLAGS = -g -O0 $(WARNINGS) # Use this line to make debugging easier
 CFLAGS = -g -O2 $(WARNINGS) # Use this line to get better performance
@@ -35,8 +32,10 @@ CFLAGS = -g -O2 $(WARNINGS) # Use this line to get better performance
        $(CC) -L$(strip $(SIMGRID_INSTALL_PATH))/lib/    $(CFLAGS) $^ -lsimgrid -o $@
 %.o: %.c
        $(CC) -I$(strip $(SIMGRID_INSTALL_PATH))/include $(CFLAGS) -c -o $@ $<
        $(CC) -L$(strip $(SIMGRID_INSTALL_PATH))/lib/    $(CFLAGS) $^ -lsimgrid -o $@
 %.o: %.c
        $(CC) -I$(strip $(SIMGRID_INSTALL_PATH))/include $(CFLAGS) -c -o $@ $<
+%: %.c
+       $(CC) -I$(strip $(SIMGRID_INSTALL_PATH))/include -L$(strip $(SIMGRID_INSTALL_PATH))/lib/  $(CFLAGS) $^ -lsimgrid -o $@ 
 
 clean:
 
 clean:
-       rm -f *.o *~ masterworker0 masterworker1 masterworker2 masterworker3 masterworker4
+       rm -f *.o *~ masterworker
 .PHONY: clean
 
 .PHONY: clean
 
similarity index 81%
rename from doc/msg-tuto-src/deployment2.xml
rename to doc/tuto-msg/deployment2.xml
index 99a9fca..6cddb86 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4.1">
   <actor host="Tremblay" function="master">
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4.1">
   <actor host="Tremblay" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
+     <argument value="600"/>       <!-- Simulation timeout, in seconds -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
   </actor>
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
   </actor>
similarity index 55%
rename from doc/msg-tuto-src/deployment3.xml
rename to doc/tuto-msg/deployment3.xml
index c602a27..e5dcfe1 100644 (file)
@@ -2,18 +2,18 @@
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4.1">
   <actor host="Tremblay" function="master">
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4.1">
   <actor host="Tremblay" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
+     <argument value="600"/>       <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
+     <argument value="10"/>        <!-- Communication size of tasks -->
   </actor>
   <actor host="Fafard" function="master">
   </actor>
   <actor host="Fafard" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
+     <argument value="600"/>       <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
+     <argument value="10"/>        <!-- Communication size of tasks -->
   </actor>
   <actor host="Jupiter" function="master">
   </actor>
   <actor host="Jupiter" function="master">
-     <argument value="3600"/>      <!-- Simulation timeout -->
+     <argument value="600"/>       <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
-     <argument value="10"/>   <!-- Communication size of tasks -->
+     <argument value="10"/>        <!-- Communication size of tasks -->
   </actor>
 </platform>
   </actor>
 </platform>
similarity index 75%
rename from doc/msg-tuto-src/masterworker1.c
rename to doc/tuto-msg/masterworker-sol1.c
index 35deb99..c0ceffc 100644 (file)
@@ -7,9 +7,9 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
-#define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
 
 
-static char * build_channel_name(char *buffer, const char *sender, const char* receiver)
+static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
@@ -21,15 +21,15 @@ static char * build_channel_name(char *buffer, const char *sender, const char* r
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
-static int master(int argc, char *argv[])
+static int master(int argc, charargv[])
 {
 {
-  msg_host_t host_self = MSG_host_self();
+  msg_host_t host_self    = MSG_host_self();
   const char* master_name = MSG_host_get_name(host_self);
   char channel[1024];
 
   const char* master_name = MSG_host_get_name(host_self);
   char channel[1024];
 
-  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");    /** - Number of tasks      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");  /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");  /** - Task communication size */
+  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");       /** - Number of tasks      */
+  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
+  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
 
   /* Create the tasks in advance */
   msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
 
   /* Create the tasks in advance */
   msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
@@ -41,7 +41,7 @@ static int master(int argc, char *argv[])
   }
 
   /* Get the info about the worker processes (directly from SimGrid) */
   }
 
   /* Get the info about the worker processes (directly from SimGrid) */
-  int workers_count   = argc - 4;
+  int workers_count   = MSG_get_host_number();
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++)
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++)
@@ -65,20 +65,20 @@ static int master(int argc, char *argv[])
     XBT_INFO("Sent");
   }
 
     XBT_INFO("Sent");
   }
 
-  XBT_INFO ("All tasks have been dispatched. Let's tell everybody the computation is over.");
+  XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel,master_name, MSG_host_get_name(workers[i % workers_count])));
+    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % workers_count])));
   }
 
   XBT_INFO("Goodbye now!");
   free(workers);
   free(todo);
   return 0;
   }
 
   XBT_INFO("Goodbye now!");
   free(workers);
   free(todo);
   return 0;
-}                               /* end_of_master */
+} /* end_of_master */
 
 /** Receiver function  */
 
 /** Receiver function  */
-static int worker(int argc, char *argv[])
+static int worker(int argc, charargv[])
 {
   char channel[1024];
 
 {
   char channel[1024];
 
@@ -88,7 +88,7 @@ static int worker(int argc, char *argv[])
 
   while (1) {
     msg_task_t task = NULL;
 
   while (1) {
     msg_task_t task = NULL;
-    int res = MSG_task_receive(&(task), channel);
+    int res         = MSG_task_receive(&(task), channel);
     xbt_assert(res == MSG_OK, "MSG_task_receive failed");
 
     XBT_INFO("Received '%s'", MSG_task_get_name(task));
     xbt_assert(res == MSG_OK, "MSG_task_receive failed");
 
     XBT_INFO("Received '%s'", MSG_task_get_name(task));
@@ -104,14 +104,16 @@ static int worker(int argc, char *argv[])
   }
   XBT_INFO("I'm done. See you!");
   return 0;
   }
   XBT_INFO("I'm done. See you!");
   return 0;
-}                               /* end_of_worker */
+} /* end_of_worker */
 
 /** Main function */
 
 /** Main function */
-int main(int argc, char *argv[])
+int main(int argc, charargv[])
 {
   MSG_init(&argc, argv);
 {
   MSG_init(&argc, argv);
-  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 2,
+             "Usage: %s platform_file deployment_file\n"
+             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
+             argv[0], argv[0]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
similarity index 73%
rename from doc/msg-tuto-src/masterworker2.c
rename to doc/tuto-msg/masterworker-sol2.c
index 1974889..317335f 100644 (file)
@@ -7,9 +7,9 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
-#define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
 
 
-static char * build_channel_name(char *buffer, const char *sender, const char* receiver)
+static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
@@ -21,18 +21,18 @@ static char * build_channel_name(char *buffer, const char *sender, const char* r
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
-static int master(int argc, char *argv[])
+static int master(int argc, charargv[])
 {
   msg_host_t host_self = MSG_host_self();
 {
   msg_host_t host_self = MSG_host_self();
-  char *master_name = (char *) MSG_host_get_name(host_self);
+  char* master_name    = (char*)MSG_host_get_name(host_self);
   char channel[1024];
 
   char channel[1024];
 
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");             /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");  /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");  /** - Task communication size */
+  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
+  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
+  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
 
   /* Get the info about the worker processes (directly from SimGrid) */
 
   /* Get the info about the worker processes (directly from SimGrid) */
-  int workers_count   = argc - 4;
+  int workers_count   = MSG_get_host_number();
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
@@ -64,31 +64,29 @@ static int master(int argc, char *argv[])
     task_num++;
   }
 
     task_num++;
   }
 
-
-  XBT_DEBUG ("All tasks have been dispatched. Let's tell everybody the computation is over.");
+  XBT_DEBUG("All tasks have been dispatched. Let's tell everybody the computation is over.");
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel,master_name,
-        MSG_host_get_name(workers[i % workers_count])));
+    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % workers_count])));
   }
 
   }
 
-  XBT_INFO("Sent %d tasks in total!", task_num);
+  XBT_DEBUG("Sent %d tasks in total!", task_num);
   free(workers);
   return 0;
 }
 
 /** Worker function  */
   free(workers);
   return 0;
 }
 
 /** Worker function  */
-static int worker(int argc, char *argv[])
+static int worker(int argc, charargv[])
 {
   char channel[1024];
 
 {
   char channel[1024];
 
-  build_channel_name(channel,MSG_process_get_data(MSG_process_self()),  MSG_host_get_name(MSG_host_self()));
+  build_channel_name(channel, MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
 
   XBT_DEBUG("Receiving on channel '%s'", channel);
 
   while (1) {
     msg_task_t task = NULL;
 
   XBT_DEBUG("Receiving on channel '%s'", channel);
 
   while (1) {
     msg_task_t task = NULL;
-    int res = MSG_task_receive(&(task), channel);
+    int res         = MSG_task_receive(&(task), channel);
     xbt_assert(res == MSG_OK, "MSG_task_receive failed");
 
     XBT_DEBUG("Received '%s'", MSG_task_get_name(task));
     xbt_assert(res == MSG_OK, "MSG_task_receive failed");
 
     XBT_DEBUG("Received '%s'", MSG_task_get_name(task));
@@ -107,11 +105,13 @@ static int worker(int argc, char *argv[])
 }
 
 /** Main function */
 }
 
 /** Main function */
-int main(int argc, char *argv[])
+int main(int argc, charargv[])
 {
   MSG_init(&argc, argv);
 {
   MSG_init(&argc, argv);
-  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 2,
+             "Usage: %s platform_file deployment_file\n"
+             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
+             argv[0], argv[0]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
similarity index 76%
rename from doc/msg-tuto-src/masterworker3.c
rename to doc/tuto-msg/masterworker-sol3.c
index 7919c37..29d10fa 100644 (file)
@@ -7,9 +7,9 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
-#define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
 
 
-static char * build_channel_name(char *buffer, const char *sender, const char* receiver)
+static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
@@ -21,20 +21,20 @@ static char * build_channel_name(char *buffer, const char *sender, const char* r
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
-static int master(int argc, char *argv[])
+static int master(int argc, charargv[])
 {
   msg_host_t host_self = MSG_host_self();
 {
   msg_host_t host_self = MSG_host_self();
-  char *master_name = (char *) MSG_host_get_name(host_self);
+  char* master_name    = (char*)MSG_host_get_name(host_self);
   char channel[1024];
 
   TRACE_category(master_name);
 
   char channel[1024];
 
   TRACE_category(master_name);
 
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");             /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");  /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");  /** - Task communication size */
+  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
+  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
+  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
 
   /* Get the info about the worker processes */
 
   /* Get the info about the worker processes */
-  int workers_count   = argc - 4;
+  int workers_count   = MSG_get_host_number();
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
@@ -65,12 +65,13 @@ static int master(int argc, char *argv[])
     XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
     MSG_task_send(task, channel);
     XBT_DEBUG("Sent");
     XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
     MSG_task_send(task, channel);
     XBT_DEBUG("Sent");
+    task_num++;
   }
 
   }
 
-  XBT_DEBUG ("All tasks have been dispatched. Let's tell everybody the computation is over.");
+  XBT_DEBUG("All tasks have been dispatched. Let's tell everybody the computation is over.");
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
   for (int i = 0; i < workers_count; i++) {
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel,master_name, MSG_host_get_name(workers[i % workers_count])));
+    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(workers[i % workers_count])));
   }
 
   XBT_INFO("Sent %d tasks in total!", task_num);
   }
 
   XBT_INFO("Sent %d tasks in total!", task_num);
@@ -79,10 +80,10 @@ static int master(int argc, char *argv[])
 }
 
 /** Worker function  */
 }
 
 /** Worker function  */
-static int worker(int argc, char *argv[])
+static int worker(int argc, charargv[])
 {
   char channel[1024];
 {
   char channel[1024];
-  build_channel_name(channel,MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
+  build_channel_name(channel, MSG_process_get_data(MSG_process_self()), MSG_host_get_name(MSG_host_self()));
 
   XBT_DEBUG("Receiving on channel '%s'", channel);
 
 
   XBT_DEBUG("Receiving on channel '%s'", channel);
 
@@ -107,11 +108,13 @@ static int worker(int argc, char *argv[])
 }
 
 /** Main function */
 }
 
 /** Main function */
-int main(int argc, char *argv[])
+int main(int argc, charargv[])
 {
   MSG_init(&argc, argv);
 {
   MSG_init(&argc, argv);
-  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 2,
+             "Usage: %s platform_file deployment_file\n"
+             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
+             argv[0], argv[0]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
similarity index 61%
rename from doc/msg-tuto-src/masterworker4.c
rename to doc/tuto-msg/masterworker-sol4.c
index acec325..a322cbb 100644 (file)
@@ -7,9 +7,9 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
-#define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
 
 
-static char * build_channel_name(char *buffer, const char *sender, const char* receiver)
+static char* build_channel_name(char* buffer, const char* sender, const char* receiver)
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
 {
   strcpy(buffer, sender);
   strcat(buffer, ":");
@@ -21,20 +21,20 @@ static char * build_channel_name(char *buffer, const char *sender, const char* r
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
 static int master(int argc, char* argv[]);
 static int worker(int argc, char* argv[]);
 
-static int master(int argc, char *argv[])
+static int master(int argc, charargv[])
 {
   msg_host_t host_self = MSG_host_self();
 {
   msg_host_t host_self = MSG_host_self();
-  char *master_name = (char *) MSG_host_get_name(host_self);
+  char* master_name    = (char*)MSG_host_get_name(host_self);
   char channel[1024];
 
   TRACE_category(master_name);
 
   char channel[1024];
 
   TRACE_category(master_name);
 
-  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");             /** - timeout      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");  /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");  /** - Task communication size */
+  double timeout   = xbt_str_parse_double(argv[1], "Invalid timeout: %s");            /** - timeout      */
+  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
+  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
 
   /* Get the info about the worker processes */
 
   /* Get the info about the worker processes */
-  int workers_count   = argc - 4;
+  int workers_count   = MSG_get_host_number();
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
   msg_host_t* workers = xbt_dynar_to_array(MSG_hosts_as_dynar());
 
   for (int i = 0; i < workers_count; i++) // Remove my host from the list
@@ -50,41 +50,25 @@ static int master(int argc, char *argv[])
 
   /* Dispatch the tasks */
   xbt_dynar_t idle_hosts = xbt_dynar_new(sizeof(msg_host_t), NULL);
 
   /* Dispatch the tasks */
   xbt_dynar_t idle_hosts = xbt_dynar_new(sizeof(msg_host_t), NULL);
-  msg_host_t request_host = NULL;
-  int task_num            = 0;
-  while (1) {
-
-    while (MSG_task_listen(master_name)) {
-      msg_task_t request = NULL;
-      int res            = MSG_task_receive(&(request), master_name);
-      xbt_assert(res == MSG_OK, "MSG_task_receive failed");
-      request_host = MSG_task_get_data(request);
-      xbt_dynar_push(idle_hosts, &request_host);
-      MSG_task_destroy(request);
-    }
+  int task_num           = 0;
+  while (MSG_get_clock() < timeout) {
 
 
-    if(MSG_get_clock()>timeout) {
-      if(xbt_dynar_length(idle_hosts) == workers_count) break;
-      else {
-        MSG_process_sleep(.1);
-        continue;
-      }
-    }
-
-    if(xbt_dynar_length(idle_hosts)<=0) {
-      /* No request. Let's wait... */
-      MSG_process_sleep(.1);
-      continue;
-    }
+    /* Retrieve the next incomming request */
+    XBT_DEBUG("Retrieve the next incomming request on %s", master_name);
+    msg_task_t request = NULL;
+    int res            = MSG_task_receive(&(request), master_name);
+    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
+    msg_host_t requester = MSG_task_get_data(request);
+    MSG_task_destroy(request);
 
 
+    /* Prepare the task to be sent */
     char sprintf_buffer[64];
     sprintf(sprintf_buffer, "Task_%d", task_num);
     msg_task_t task = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
     MSG_task_set_category(task, master_name);
 
     char sprintf_buffer[64];
     sprintf(sprintf_buffer, "Task_%d", task_num);
     msg_task_t task = MSG_task_create(sprintf_buffer, comp_size, comm_size, NULL);
     MSG_task_set_category(task, master_name);
 
-    xbt_dynar_shift(idle_hosts, &request_host);
-
-    build_channel_name(channel,master_name, MSG_host_get_name(request_host));
+    /* Send this out */
+    build_channel_name(channel, master_name, MSG_host_get_name(requester));
 
     XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
     MSG_task_send(task, channel);
 
     XBT_DEBUG("Sending '%s' to channel '%s'", task->name, channel);
     MSG_task_send(task, channel);
@@ -92,10 +76,19 @@ static int master(int argc, char *argv[])
     task_num++;
   }
 
     task_num++;
   }
 
-  XBT_DEBUG ("All tasks have been dispatched. Let's tell everybody the computation is over.");
-  for (int i = 0; i < workers_count; i++) {
+  XBT_DEBUG("Time is up. Let's tell everybody the computation is over.");
+  for (int i = 0; i < workers_count; i++) { /* We don't write in order, but the total amount is right
+
+    /* Don't write to a worker that did not request for work, or it will deadlock: both would be sending something */
+    msg_task_t request = NULL;
+    int res            = MSG_task_receive(&(request), master_name);
+    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
+    msg_host_t requester = MSG_task_get_data(request);
+    MSG_task_destroy(request);
+
+    XBT_DEBUG("Stop worker %s", MSG_host_get_name(requester));
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
     msg_task_t finalize = MSG_task_create("finalize", 0, 0, FINALIZE);
-    MSG_task_send(finalize, build_channel_name(channel,master_name, MSG_host_get_name(workers[i % workers_count])));
+    MSG_task_send(finalize, build_channel_name(channel, master_name, MSG_host_get_name(requester)));
   }
 
   XBT_INFO("Sent %d tasks in total!", task_num);
   }
 
   XBT_INFO("Sent %d tasks in total!", task_num);
@@ -104,17 +97,18 @@ static int master(int argc, char *argv[])
 }
 
 /** Worker function  */
 }
 
 /** Worker function  */
-static int worker(int argc, char *argv[])
+static int worker(int argc, charargv[])
 {
   char channel[1024];
 
 {
   char channel[1024];
 
-  const char *my_master = MSG_process_get_data(MSG_process_self());
+  const charmy_master = MSG_process_get_data(MSG_process_self());
   build_channel_name(channel, my_master, MSG_host_get_name(MSG_host_self()));
 
   XBT_DEBUG("Receiving on channel \"%s\"", channel);
 
   while (1) {
     /* Send a request */
   build_channel_name(channel, my_master, MSG_host_get_name(MSG_host_self()));
 
   XBT_DEBUG("Receiving on channel \"%s\"", channel);
 
   while (1) {
     /* Send a request */
+    XBT_DEBUG("Sent a request to my master on %s", my_master);
     msg_task_t request = MSG_task_create("request", 0, 0, MSG_host_self());
     MSG_task_send(request, my_master);
 
     msg_task_t request = MSG_task_create("request", 0, 0, MSG_host_self());
     MSG_task_send(request, my_master);
 
@@ -139,11 +133,13 @@ static int worker(int argc, char *argv[])
 }
 
 /** Main function */
 }
 
 /** Main function */
-int main(int argc, char *argv[])
+int main(int argc, charargv[])
 {
   MSG_init(&argc, argv);
 {
   MSG_init(&argc, argv);
-  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 2,
+             "Usage: %s platform_file deployment_file\n"
+             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
+             argv[0], argv[0]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
similarity index 81%
rename from doc/msg-tuto-src/masterworker0.c
rename to doc/tuto-msg/masterworker.c
index e20b2eb..64cccb6 100644 (file)
@@ -7,14 +7,14 @@
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
 
-#define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
+#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */
 
 /** Master expects 3+ arguments given in the XML deployment file: */
 
 /** Master expects 3+ arguments given in the XML deployment file: */
-static int master(int argc, char *argv[])
+static int master(int argc, charargv[])
 {
 {
-  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");    /** - Number of tasks      */
-  double comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");  /** - Task compute cost    */
-  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s");  /** - Task communication size */
+  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");       /** - Number of tasks      */
+  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /** - Task compute cost    */
+  double comm_size = xbt_str_parse_double(argv[3], "Invalid communication size: %s"); /** - Task communication size */
 
   /* Create the tasks in advance */
   msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
 
   /* Create the tasks in advance */
   msg_task_t* todo = xbt_new0(msg_task_t, number_of_tasks);
@@ -58,8 +58,8 @@ static int master(int argc, char *argv[])
   return 0;
 }
 
   return 0;
 }
 
-/** Worker expects a single argument given in the XML deployment file: */
-static int worker(int argc, char *argv[])
+/** Worker does not expect any argument from XML deployment file. */
+static int worker(int argc, charargv[])
 {
   while (1) {
     msg_task_t task = NULL;
 {
   while (1) {
     msg_task_t task = NULL;
@@ -79,15 +79,17 @@ static int worker(int argc, char *argv[])
   }
   XBT_INFO("I'm done. See you!");
   return 0;
   }
   XBT_INFO("I'm done. See you!");
   return 0;
-}                               /* end_of_worker */
+} /* end_of_worker */
 
 /** Main function */
 
 /** Main function */
-int main(int argc, char *argv[])
+int main(int argc, charargv[])
 {
 
   MSG_init(&argc, argv);
 {
 
   MSG_init(&argc, argv);
-  xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n"
-             "\tExample: %s msg_platform.xml msg_deployment.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 2,
+             "Usage: %s platform_file deployment_file\n"
+             "\tExample: %s msg_platform.xml msg_deployment.xml\n",
+             argv[0], argv[0]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
 
   /*  Create a simulated platform */
   MSG_create_environment(argv[1]);
@@ -102,4 +104,4 @@ int main(int argc, char *argv[])
 
   XBT_INFO("Simulation time %g", MSG_get_clock());
   return (res != MSG_OK);
 
   XBT_INFO("Simulation time %g", MSG_get_clock());
   return (res != MSG_OK);
-}                               /* end_of_main */
+} /* end_of_main */
diff --git a/doc/tuto-msg/overview.svg b/doc/tuto-msg/overview.svg
new file mode 100644 (file)
index 0000000..c318876
--- /dev/null
@@ -0,0 +1,1240 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   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#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="86.313606mm"
+   height="41.106529mm"
+   viewBox="0 0 86.313605 41.106529"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="overview.svg">
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1496"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1502"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-1"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1496-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-8"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1496-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-3"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1496-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-9"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         inkscape:connector-curvature="0"
+         id="path1496-8"
+         d="M 0,0 5,-5 -12.5,0 5,5 Z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="75.667359"
+     inkscape:cy="76.402423"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1019"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-29.950586,-101.20699)">
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.80246687px;line-height:4.0930109px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="47.823597"
+       y="119.2951"
+       id="text817"><tspan
+         sodipodi:role="line"
+         id="tspan815"
+         x="47.823597"
+         y="119.2951"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.16372044px">Master</tspan></text>
+    <ellipse
+       style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.43658787;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path819"
+       cx="55.781475"
+       cy="121.76025"
+       rx="12.693116"
+       ry="8.3518229" />
+    <g
+       id="g5649"
+       transform="matrix(0.61878596,0,0,0.61878596,10.598982,54.807393)">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,62.219405,60.11345)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-15"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-06"
+         y="107.92625"
+         x="85.694588"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="107.92625"
+           x="85.694588"
+           id="tspan815-8-50"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       id="g5641"
+       transform="matrix(0.61878596,0,0,0.61878596,11.505291,54.982808)">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       id="g1489"
+       transform="matrix(0.61878596,0,0,0.61878596,19.779021,54.251913)">
+      <g
+         transform="translate(0.29020366)"
+         id="g1294">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="125.17461"
+           y="85.676834"
+           id="text817-3"><tspan
+             sodipodi:role="line"
+             id="tspan815-8"
+             x="125.17461"
+             y="85.676834"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
+        <ellipse
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path1289"
+           cx="138.98015"
+           cy="82.78347"
+           rx="16.30344"
+           ry="6.5481029" />
+      </g>
+      <g
+         id="g1294-6"
+         transform="translate(0.29020366,13.157293)">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="125.17461"
+           y="85.676834"
+           id="text817-3-0"><tspan
+             sodipodi:role="line"
+             id="tspan815-8-89"
+             x="125.17461"
+             y="85.676834"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
+        <ellipse
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path1289-2"
+           cx="138.98015"
+           cy="82.78347"
+           rx="16.30344"
+           ry="6.5481029" />
+      </g>
+      <g
+         id="g1294-2"
+         transform="translate(0.29020366,26.31459)">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="125.17461"
+           y="85.676834"
+           id="text817-3-3"><tspan
+             sodipodi:role="line"
+             id="tspan815-8-18"
+             x="125.17461"
+             y="85.676834"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
+        <ellipse
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path1289-3"
+           cx="138.98015"
+           cy="82.78347"
+           rx="16.30344"
+           ry="6.5481029" />
+      </g>
+      <g
+         id="g1294-4"
+         transform="translate(0.29020366,52.629172)">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="125.17461"
+           y="85.676834"
+           id="text817-3-2"><tspan
+             sodipodi:role="line"
+             id="tspan815-8-2"
+             x="125.17461"
+             y="85.676834"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
+        <ellipse
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path1289-4"
+           cx="138.98015"
+           cy="82.78347"
+           rx="16.30344"
+           ry="6.5481029" />
+      </g>
+      <g
+         id="g1294-5"
+         transform="translate(0.29020366,39.471889)">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="125.17461"
+           y="85.676834"
+           id="text817-3-1"><tspan
+             sodipodi:role="line"
+             id="tspan815-8-75"
+             x="125.17461"
+             y="85.676834"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px">Worker</tspan></text>
+        <ellipse
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="path1289-7"
+           cx="138.98015"
+           cy="82.78347"
+           rx="16.30344"
+           ry="6.5481029" />
+      </g>
+    </g>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 68.602797,121.43899 27.144559,-16.2551"
+       id="path1491"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
+       d="m 68.602797,121.43899 27.144559,-8.05361"
+       id="path1491-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
+       d="m 68.602797,121.43899 27.144559,0.14787"
+       id="path1491-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-3)"
+       d="m 68.602797,121.43899 27.144559,8.34936"
+       id="path1491-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-9)"
+       d="m 68.602797,121.43899 27.144559,16.55085"
+       id="path1491-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.80246687px;line-height:4.0930109px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.16372044px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="58.617321"
+       y="135.63525"
+       id="text4842"><tspan
+         sodipodi:role="line"
+         id="tspan4840"
+         x="58.617321"
+         y="135.63525"
+         style="text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.16372044px">How should the master</tspan><tspan
+         sodipodi:role="line"
+         x="58.617321"
+         y="139.81946"
+         style="text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.16372044px"
+         id="tspan5522">distribute the tasks?</tspan></text>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,12.703959,52.631832)"
+       id="g5641-0">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-4"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-8"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-4"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,14.01957,54.912224)"
+       id="g5641-8">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-1"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-6"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-8"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,12.236186,57.484974)"
+       id="g5641-5">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-2"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-1"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-9"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,14.896644,57.777332)"
+       id="g5641-9">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-6"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-0"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-6"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,17.586337,57.046437)"
+       id="g5641-4">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-9"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-9"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-0"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,17.264743,54.093622)"
+       id="g5641-89">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-3"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-14"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-89"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,18.083346,59.765366)"
+       id="g5641-6">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-7"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-7"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-3"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,15.422888,60.262374)"
+       id="g5641-7">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-12"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-2"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-1"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,19.282013,61.987286)"
+       id="g5641-50">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-90"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-4"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-01"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,20.539152,59.414536)"
+       id="g5641-3">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-74"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-11"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-30"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,20.042144,56.05242)"
+       id="g5641-32">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-17"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-5"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-65"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,22.614894,54.473687)"
+       id="g5641-42">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-21"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-72"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-41"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,22.84878,56.987965)"
+       id="g5641-65">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-78"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-59"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-2"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,23.024194,59.882309)"
+       id="g5641-73">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-64"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-79"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-7"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,28.081987,59.18065)"
+       id="g5641-2">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-216"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-3"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-02"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,25.713888,57.572681)"
+       id="g5641-1">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-5"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-65"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-00"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,28.929825,56.841786)"
+       id="g5641-34">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-66"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-02"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-5"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,25.129172,55.029167)"
+       id="g5641-895">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-0"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-60"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-83"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,28.023516,54.269036)"
+       id="g5641-78">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-210"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-58"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-55"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,22.264064,62.133465)"
+       id="g5641-07">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-38"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-23"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-07"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,25.450765,61.431807)"
+       id="g5641-77">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-69"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-119"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-08"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,28.052752,61.519514)"
+       id="g5641-98">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-8"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-03"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-70"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,31.151746,59.794602)"
+       id="g5641-69">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-217"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-797"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-62"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,31.736462,57.309559)"
+       id="g5641-71">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-58"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-84"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-56"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <g
+       transform="matrix(0.61878596,0,0,0.61878596,34.163033,55.263054)"
+       id="g5641-56">
+      <path
+         transform="matrix(0.53833311,-0.02069077,0.02257551,0.49338976,28.863006,60.727662)"
+         inkscape:transform-center-y="-0.1233255"
+         inkscape:transform-center-x="0.088729829"
+         d="m 44.366742,100.02236 c -0.493309,0.45536 -2.681943,0.19034 -3.352755,0.16351 -0.670812,-0.0268 -2.873621,0.0625 -3.328983,-0.430784 -0.455362,-0.493309 -0.19035,-2.681944 -0.163517,-3.352755 0.02683,-0.670812 -0.06252,-2.873621 0.430786,-3.328983 0.493309,-0.455362 2.681944,-0.19035 3.352756,-0.163517 0.670811,0.02683 2.873621,-0.06252 3.328983,0.430786 0.455362,0.493309 0.190349,2.681944 0.163517,3.352755 -0.02683,0.670812 0.06252,2.873621 -0.430787,3.328988 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0.2"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.610775"
+         sodipodi:arg1="0.82537685"
+         sodipodi:r2="3.6409302"
+         sodipodi:r1="4.7284808"
+         sodipodi:cy="96.547852"
+         sodipodi:cx="41.159508"
+         sodipodi:sides="4"
+         id="path823-226-84"
+         style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.70555556;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         sodipodi:type="star" />
+      <text
+         id="text817-8-91-88"
+         y="108.54047"
+         x="52.338184"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.76111126px;line-height:6.61458349px;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222223px;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.26458332px"
+           y="108.54047"
+           x="52.338184"
+           id="tspan815-8-04-38"
+           sodipodi:role="line">T</tspan></text>
+    </g>
+    <ellipse
+       style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.44087529;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path5967"
+       cx="75.089897"
+       cy="120.15488"
+       rx="3.0595784"
+       ry="6.408577" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.57525826px;line-height:3.97712588px;font-family:'Amiri Quran Colored';-inkscape-font-specification:'Amiri Quran Colored';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.15908505px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="72.321075"
+       y="130.08104"
+       id="text5965"
+       transform="scale(1.0291379,0.97168708)"><tspan
+         sodipodi:role="line"
+         id="tspan5963"
+         x="72.321075"
+         y="130.08104"
+         style="font-size:13.57525826px;fill:#ff0000;stroke-width:0.15908505px">?</tspan></text>
+  </g>
+</svg>
diff --git a/doc/tuto-msg/tuto-msg.doc b/doc/tuto-msg/tuto-msg.doc
new file mode 100644 (file)
index 0000000..86813ba
--- /dev/null
@@ -0,0 +1,422 @@
+/*! @page tutorial_msg SimGrid Tutorial with MSG
+
+\tableofcontents
+
+\section tuto-msg-intro Introduction
+
+\subsection tuto-msg-intro-settings Settings
+
+This tutorial will guide your create and run your first SimGrid
+simulator. Let's consider the following scenario:
+
+> Assume we have a (possibly large) bunch of (possibly large) data to
+> process and which originally reside on a server (a.k.a. master). For
+> sake of simplicity, we assume all input file require the same amount
+> of computation. We assume the server can be helped by a (possibly
+> large) set of worker machines. What is the best way to organize the
+> computations ?
+
+\htmlonly
+<div align="center">
+\endhtmlonly
+\htmlinclude tuto-msg/overview.svg
+\htmlonly
+</div>
+\endhtmlonly
+
+\subsection tuto-msg-intro-questions Raised Questions
+
+Although this looks like a very simple setting it raises several
+interesting questions:
+
+- Which algorithm should the master use to send workload?
+
+    The provided code sends the tasks to the workers with a trivial
+    round-robin algorithm. It would probably be more efficient if the
+    workers were asking for tasks, to let the master distribute the
+    tasks in a more cleaver way.
+
+- Should the worker specify how many tasks they want? Or should the
+  master decide everything?
+
+    The workers will starve if they don't get the tasks fast
+    enough. One possibility to reduce latency would be to send tasks
+    in pools instead of one by one. But if the pools are too big, the
+    load balancing will likely get uneven, in particular when
+    distributing the last tasks.
+
+- How does the quality of such algorithm dependent on the platform
+    characteristics and on the task characteristics?
+
+    Whenever the input communication time is very small compared to
+    processing time and workers are homogeneous, it is likely that the
+    round-robin algorithm performs very well. Would it still hold true
+    when transfer time is not negligible and the platform is, say, a
+    volunteer computing system ? What if some tasks are performed
+    faster on some specific nodes?
+
+- The network topology interconnecting the master and the workers
+  may be quite complicated. How does such a topology impact the
+  previous result?
+
+    When data transfers are the bottleneck, it is likely that a good
+    modeling of the platform becomes essential. The SimGrid platform
+    models are particularly handy to account for complex platform
+    topologies.
+
+- What topology to use for the application? 
+
+    Is a flat master worker deployment sufficient? Should we go for a
+    hierarchical algorithm, with some forwarders taking large pools of
+    tasks from the master, each of them distributing their tasks to a
+    sub-pool of workers? Or should we introduce super-peers,
+    dupplicating the master's role in a peer-to-peer manner?  Do the
+    algorithms require a perfect knowledge of the network?
+
+- How is such an algorithm sensitive to external workload variation?
+
+    What if bandwidth, latency and computing speed can vary with no
+    warning?  Shouldn't you study whether your algorithm is sensitive
+    to such load variations?
+
+- Although an algorithm may be more efficient than another, how
+  does it interfere with other applications?
+
+
+- Etc, etc.
+
+As you can see, this very simple setting may need to evolve way beyond
+what you initially imagined. And this is a good news.
+
+But don't believe the fools saying that all you need to study such
+settings is a simple discrete event simulator. Do you really want to
+reinvent the wheel, write your own tool, debug it, optimize it and
+validate its models against real settings for ages, or do you prefer
+to sit on the shoulders of a giant?<br>
+With SimGrid, you can forget about most technical details (but not
+all), and focus on your algorithm. The whole simulation mechanism is
+already working.
+
+\subsection tuto-msg-intro-goal Envisionned Study
+
+
+The following figure is a screenshot of [triva][fn:1] visualizing a [SimGrid
+simulation][fn:2] of two master worker applications (one in light gray and
+the other in dark gray) running in concurrence and showing resource
+usage over a long period of time.
+
+![Test](./sc3-description.png)
+
+\section tuto-msg-starting Getting Started
+
+\subsection tuto-msg-prerequesite Prerequisite
+
+In this example, we use Pajeng and Vite to visualize the result of
+SimGrid simulations. These external tools are usually very easy to
+install. On Debian and Ubuntu for example, you can get them as follows:
+
+~~~~{.sh}
+sudo apt-get install pajeng vite
+~~~~
+
+\subsection tuto-msg-setup Setting up and Compiling
+
+The corresponding source files can be obtained
+[online on GitLab](https://gitlab.inria.fr/simgrid/simgrid/tree/master/doc/tuto-msg/src). 
+There is a button on the top right to download the whole 
+directory in one archive file. If you wish, other platform files are available from 
+[this GitLab directory](https://gitlab.inria.fr/simgrid/simgrid/tree/master/examples/platforms).
+
+As you can see, there is already a little Makefile that compiles
+everything for you. If you struggle with the compilation, then you should double check 
+your @ref install "SimGrid installation". 
+On need, please refer to the @ref install_yours_trouble section.
+
+\section tuto-msg-ex0 Discovering the provided simulator
+
+Please compile and execute the provided simulator as follows:
+
+~~~~{.sh}
+make masterworker
+./masterworker examples/platforms/small_platform.xml deployment0.xml
+~~~~
+
+For a more "fancy" output, you can use simgrid-colorizer. 
+
+~~~~{.sh}
+./masterworker examples/platforms/small_platform.xml deployment0.xml 2>&1 | simgrid-colorizer
+~~~~
+
+If you installed SimGrid to a non-standard path, you may have to
+specify the full path to simgrid-colorizer on the above line, such as
+\c /opt/simgrid/bin/simgrid-colorizer. If you did not install it at all,
+you can find it in <simgrid_root_directory>/bin/colorize.
+
+For a classical Gantt-Chart visualization, you can produce a [Paje][fn:5] trace:
+
+~~~~{.sh}
+./masterworker platforms/platform.xml deployment0.xml --cfg=tracing:yes \
+    --cfg=tracing/msg/process:yes
+pajeng simgrid.trace
+~~~~
+
+Alternatively, you can use [vite][fn:6].
+
+~~~~{.sh}
+./masterworker platforms/platform.xml deployment0.xml --cfg=tracing:yes \
+    --cfg=tracing/msg/process:yes --cfg=tracing/basic:yes
+vite simgrid.trace
+~~~~
+
+\subsection tuto-msg-exo0-source Understanding this source code
+
+Explore the \ref doc/tuto-msg/masterworker.c source file. It contains 3 functions:
+ - \c master: that's the code executed by the master process.<br>
+   It creates a large array containing all tasks,
+   dispatches all tasks to the workers and then dispatch
+   specific tasks which name is "finalize". 
+ - \c worker: each workers will execute this function.<br>
+   That's an infinite loop waiting for incomming tasks.
+   We exit the loop if the name of the received task is "finalize", or process the task otherwise.
+ - \c main: this setups the simulation.
+
+How does SimGrid know that we need one master and several workers?
+Because it's written in the deployment file (called \c
+deployment0.xml), that we pass to MSG_create_environment() during the setup.
+
+\include doc/tuto-msg/deployment0.xml
+
+\section tuto-msg-exo1 Exercise 1: Simplifying the deployment file
+
+In the provided example, the deployment file `deployment0.xml` is
+tightly connected to the platform file `small_platform.xml` and adding
+more workers quickly becomes a pain: You need to start them (at the
+bottom of the file), add to inform the master that they are available
+(in the master parameters list).
+
+Instead, modify the simulator `masterworker.c` into `masterworker-exo1.c`
+so that the master launches a worker process on all the other machines
+at startup. The new deployment file `deployment1.xml` should be as
+simple as:
+
+\include doc/tuto-msg/deployment1.xml
+
+For that, the master needs to retrieve the list of hosts declared in
+the platform, with the following functions (follow the links for their
+documentation):
+
+~~~~{.c}
+int MSG_get_host_number(void);
+xbt_dynar_t MSG_hosts_as_dynar(void);
+void * xbt_dynar_to_array (xbt_dynar_t dynar);
+~~~~
+
+Then, the master should start the worker processes with the following function:
+
+~~~~{.c}
+msg_process_t MSG_process_create(const char *name, xbt_main_func_t code, void *data, msg_host_t host);
+~~~~
+
+\subsection tuto-msg-exo1-config Increasing configurability
+
+The worker processes wait for incomming messages on a channel which
+name they need to know beforehand. In the provided code, each worker
+uses the name of its host as a channel name. You can see this in the
+receiver source code:
+
+~~~~{.c}
+    int res = MSG_task_receive(&(task), MSG_host_get_name(MSG_host_self()));
+    xbt_assert(res == MSG_OK, "MSG_task_receive failed");
+~~~~
+
+This way, you can have at most one worker per host. To later study the
+behavior of concurrent applications on the platform, we need to
+alleviate this. Several solutions exist:
+
+Now that the the master creates the workers, it knows their PID
+(process ID -- given by @ref MSG_process_get_pid()), so you could use
+it in the channel name.
+
+Another possibility for the master is to determine a channel name
+before the process creation, and give that name as a parameter to the
+starting process. This is what the `data` parameter of @ref
+MSG_process_create is meant for. You can pass any arbitrary pointer,
+and the created process can retrieve this value later with the @ref
+MSG_process_get_data and @ref MSG_process_self functions.  Since we
+want later to study concurrent applications, it is advised to use a
+channel name such as `master_name:worker_name`.
+
+A third possibility would be to inverse the communication architecture
+and have the workers pulling work from the master. This require to
+pass the master's channel to the workers.
+
+\subsection tuto-msg-exo1-wrapup Wrap up 
+
+In this exercise, we reduced the amount of configuration that our
+simulator requests. This is both a good idea, and a dangerous
+trend. This simplification is an application of the good old DRY/SPOT
+programming principle (Don't Repeat Yourself / Single Point Of Truth
+-- <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">more on wikipedia</a>),
+and you really want your programming artefacts to follow these software engineering principles.
+
+But at the same time, you should be careful in separating your
+scientific contribution (the master/wokers algorithm) and the
+artefacts used to test it (platform, deployment and workload). This is
+why SimGrid forces you to expres your platform and deployment files in
+XML instead of using a programming interface: it forces a clear
+separation of concerns between things that are of very different
+nature.
+
+If you struggle with this exercise, have a look at
+our solution in \ref doc/tuto-msg/masterworker-sol1.c
+This is not perfect at all, and many other solutions would have been possible, of course.
+
+\section tuto-msg-exo2 Exercise 2: Infinite amount of work, fixed experiment duration
+
+In the current version, the number of tasks is defined through the
+worker arguments. Hence, tasks are created at the very beginning of
+the simulation. Instead, have the master dispatching tasks for a
+predetermined amount of time.  The tasks must now be created on demand
+instead of beforehand.
+
+Of course, usual time functions like `gettimeofday` will give you the
+time on your real machine, which is prety useless in the
+simulation. Instead, retrieve the time in the simulated world with
+@ref MSG_get_clock.
+
+You can still stop your workers with a specific task as previously,
+but other methods exist. You can forcefully stop processes with the
+following functions, but be warned that SimGrid traditionnally had
+issues with forcefully stopping procsses involved in computations or
+communications. We hope that it's better now, but YMMV.
+
+~~~~{.c}
+void MSG_process_kill(msg_process_t process);
+int MSG_process_killall(int reset_PIDs);
+~~~~
+
+Anyway, the new deployment `deployment2.xml` file should thus look
+like this:
+
+\include doc/tuto-msg/deployment2.xml
+
+\subsection tuto-msg-exo2-verbosity Controlling the message verbosity
+
+Not all messages are equally informative, so you probably want to
+change most of the `XBT_INFO` into `XBT_DEBUG` so that they are hidden
+by default. You could for example show only the total number of tasks
+processed by default. You can still see the debug messages as follows:
+
+~~~~{.sh}
+./masterworker examples/platforms/small_platform.xml deployment2.xml --log=msg_test.thres:debug
+~~~~
+
+\subsection tuto-msg-exo2-wrapup Wrap up
+
+Our imperfect solution to this exercise is available as @ref doc/tuto-msg/masterworker-sol2.c
+But there is still much to improve in that code.
+
+\section tuto-msg-exo3 Exercise 3: Understanding how competing applications behave
+
+It is now time to start several applications at once, with the following `deployment3.xml` file.
+
+\include doc/tuto-msg/deployment3.xml
+
+Things happen when you do so, but it remains utterly difficult to
+understand what's happening exactely. Even visualizations with pajeng
+and Vite contain too much information to be useful: it is impossible
+to understand which task belong to which application. To fix this, we
+will categorize the tasks.
+
+For that, first let each master create its own category of tasks with
+@ref TRACE_category(), and then assign this category to each task using
+@ref MSG_task_set_category().
+
+The outcome can then be visualized as a Gantt-chart as follows:
+
+~~~~{.sh}
+./masterworker examples/platforms/small_platform.xml deployment3.xml --cfg=tracing:yes --cfg=tracing/msg/process:yes
+vite simgrid.trace
+~~~~
+
+\subsection tuto-msg-exo3-further Going further
+
+vite is not enough to understand the situation, because it does not
+deal with categorization. That is why you should switch to R to
+visualize your outcomes, as explained on <a
+href="http://simgrid.gforge.inria.fr/contrib/R_visualization.php">this
+page</a>.
+
+As usual, you can explore our imperfect solution, in @ref doc/tuto-msg/masterworker-sol3.c.
+
+\section tuto-msg-exo4 Exercise 4: Better scheduling: FCFS
+
+You don't need a very advanced visualization solution to notice that
+round-robin is completely suboptimal: most of the workers keep waiting
+for more work. We will move to a First-Come First-Served mechanism
+instead.
+
+For that, your workers should explicitely request for work with a
+message sent to a channel that is specific to their master. The name
+of their private channel name should be attached (using the last
+parameter of @ref MSG_task_create()) to the message sent, so that
+their master can answer.
+
+The master should serve requests in a round-robin manner, until the
+time is up. Things get a bit more complex to stop the workers
+afterward: the master cannot simply send a terminating task, as the
+workers are blocked until their request for work is accepted. So
+instead, the master should wait for incomming requests even once the
+time is up, and answer with a terminating task.
+
+Once it works, you will see that such as simple FCFS schema allows to
+double the amount of tasks handled over time in this case.
+
+\subsection tuto-msg-exo4-further Going further
+
+From this, many things can easily be added. For example, you could:
+- Allow workers to have several pending requests so as to overlap
+  communication and computations as much as possible. Non-blocking communication will probably become handy here.
+- Add a performance measurement mechanism, enabling the master to make smart scheduling choices.
+- Test your code on other platforms, from the `examples/platforms` directory in your archive.<br>
+  What is the largest number of tasks requiring 50e6 flops and 1e5
+  bytes that you manage to distribute and process in one hour on
+  `g5k.xml` (you should use `deployment_general.xml`)?
+- Optimize not only for the amount of tasks handled, but also for the total energy dissipated.
+- And so on. If you come up with a really nice extension, please share it with us so that we can extend this tutorial.
+
+\section tuto-msg-further Where to go from here?
+
+This tutorial is now terminated. You could keep reading the [online documentation][fn:4] or
+[tutorials][fn:7], or you could head up to the example section to read some code.
+
+\subsection tuto-msg-further-todo TODO: Points to improve for the next time
+
+- Propose equivalent exercises and skeleton in java.
+- Propose a virtualbox image with everything (simgrid, pajeng, ...) already set
+  up.
+- Ease the installation on mac OS X (binary installer) and
+  windows.
+- Explain that programming in C or java and having a working
+  development environment is a prerequisite.
+
+
+[fn:1]: http://triva.gforge.inria.fr/index.html
+[fn:2]: http://hal.inria.fr/inria-00529569
+[fn:3]: http://hal.inria.fr/hal-00738321
+[fn:4]: http://simgrid.gforge.inria.fr/simgrid/latest/doc/
+[fn:5]: https://github.com/schnorr/pajeng/
+[fn:6]: http://vite.gforge.inria.fr/
+[fn:7]: http://simgrid.org/tutorials/
+
+
+*/
+
+
+/**
+ *  @example doc/tuto-msg/masterworker.c
+ *  @example doc/tuto-msg/masterworker-sol1.c
+ *  @example doc/tuto-msg/masterworker-sol2.c
+ *  @example doc/tuto-msg/masterworker-sol3.c
+ *  @example doc/tuto-msg/masterworker-sol4.c
+ */
\ No newline at end of file
index 1b87e2d..ba15c8c 100644 (file)
@@ -863,7 +863,7 @@ set(DOC_SOURCES
   doc/doxygen/install.doc
   doc/doxygen/install_yours.doc
   doc/doxygen/java.doc
   doc/doxygen/install.doc
   doc/doxygen/install_yours.doc
   doc/doxygen/java.doc
-  doc/doxygen/tutorial_msg.doc
+  doc/tuto-msg/tuto-msg.doc
   doc/doxygen/tutorial_smpi.doc
   doc/doxygen/models.doc
   doc/doxygen/module-msg.doc
   doc/doxygen/tutorial_smpi.doc
   doc/doxygen/models.doc
   doc/doxygen/module-msg.doc
@@ -896,17 +896,17 @@ set(DOC_SOURCES
   doc/manpage/smpirun.1
   doc/manpage/tesh.pod
 
   doc/manpage/smpirun.1
   doc/manpage/tesh.pod
 
-  doc/msg-tuto-src/deployment0.xml
-  doc/msg-tuto-src/deployment1.xml
-  doc/msg-tuto-src/deployment2.xml
-  doc/msg-tuto-src/deployment3.xml
-  doc/msg-tuto-src/deployment_general.xml
-  doc/msg-tuto-src/Makefile
-  doc/msg-tuto-src/masterworker0.c
-  doc/msg-tuto-src/masterworker1.c
-  doc/msg-tuto-src/masterworker2.c
-  doc/msg-tuto-src/masterworker3.c
-  doc/msg-tuto-src/masterworker4.c
+  doc/tuto-msg/deployment0.xml
+  doc/tuto-msg/deployment1.xml
+  doc/tuto-msg/deployment2.xml
+  doc/tuto-msg/deployment3.xml
+  doc/tuto-msg/deployment_general.xml
+  doc/tuto-msg/Makefile
+  doc/tuto-msg/masterworker.c
+  doc/tuto-msg/masterworker-sol1.c
+  doc/tuto-msg/masterworker-sol2.c
+  doc/tuto-msg/masterworker-sol3.c
+  doc/tuto-msg/masterworker-sol4.c
 
   CITATION.bib
   )
 
   CITATION.bib
   )
index 85f7d06..b4c8613 100644 (file)
@@ -89,8 +89,6 @@ ENDIF()
 ADD_TEST(testall                                 ${CMAKE_BINARY_DIR}/testall)
 
 # New tests should use the Boost Unit Test Framework
 ADD_TEST(testall                                 ${CMAKE_BINARY_DIR}/testall)
 
 # New tests should use the Boost Unit Test Framework
-
-
 if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
   add_executable       (unit_tmgr src/surf/trace_mgr_test.cpp)
   target_link_libraries(unit_tmgr simgrid ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
 if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
   add_executable       (unit_tmgr src/surf/trace_mgr_test.cpp)
   target_link_libraries(unit_tmgr simgrid ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
@@ -99,3 +97,7 @@ if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
 else()
   set(EXTRA_DIST       ${EXTRA_DIST}       src/surf/trace_mgr_test.cpp)
 endif()
 else()
   set(EXTRA_DIST       ${EXTRA_DIST}       src/surf/trace_mgr_test.cpp)
 endif()
+
+
+# Also test the tutorial
+ADD_TEST(tuto-msg-1 sh -c "make -C doc/tuto-msg/src masterworker0 && doc/tuto-msg/src/masterworker0 examples/platforms/small_platform.xml doc/tuto-msg/src/deployment0.xml")
\ No newline at end of file