diff --git a/guides/users/README.md b/guides/users/README.md index f033facf01a4c7f7a76427c13829d736d4c61b71..1c7e052095eba1a5b221a9158d7af48e03d79dcf 100644 --- a/guides/users/README.md +++ b/guides/users/README.md @@ -1,42 +1,42 @@ -- [TL;DR](#orgc82f76b) -- [Topology](#orgf1bf668) -- [Algorithms](#org675fb02) -- [Examples](#orgd0a590c) -- [Batch mode](#org7bb68a4) - - [Running batch simulations](#org4b6393c) - - [Running batch simulations with Built-in daemons](#orgfe448db) - - [Running batch simulations with manual (a.k.a. custom) daemons](#orgadfdca2) - - [Running batch simulations with `lurette`](#org347b172) - - [Viewing Results](#orgba27fbc) - - [The `sasa` CLI](#orgae5deb1) -- [Interactive mode](#orga63cb12) - - [Example: use `rdbg` from the `test/alea-coloring/` directory](#org913b4b7) - - [The examples of test directory](#orgeb18210) - - [Running interactive sessions with `rdbg`](#org3a65716) - - [Getting `rdbg` on-line help](#org48fa50d) - - [A `rdbg` `sasa` GUI](#orgad6bf70) - - [Useful Modules](#org9d9173a) -- [Install](#org282e5ca) - - [TL;DR](#org45124dd) - - [Not strictly mandatory, but useful, third-party software](#org8d183f0) - - [Install `sasa` via opam (version >= 2.\*)](#org2504ba4) - - [Install `sasa` via `git`](#orgc5e8c3e) - - [Use `sasa` via docker](#org03256dd) - - [Use `sasa` via a Virtual Machine](#org9f93471) -- [Screencasts](#org57f191d) -- [More](#orgbc6bd0b) -- [FAQ](#org046be58) - - [Is there a FAQ?](#org99b42b5) - - [I have a compilation error that I don't understand](#orgbd579cf) - - [I have the error `Invalid_argument("compare: functional value")`](#org1d85558) - - - -<a id="orgc82f76b"></a> +- [TL;DR](#orgfb6de52) +- [Topology](#org2744ac5) +- [Algorithms](#org59056c6) +- [Examples](#orgcb4db19) +- [Batch mode](#orgf3689c0) + - [Running batch simulations](#orgd68d0b3) + - [Running batch simulations with Built-in daemons](#org489a669) + - [Running batch simulations with manual (a.k.a. custom) daemons](#org14c0bf6) + - [Running batch simulations with `lurette`](#orgae85a46) + - [Viewing Results](#orgd0df37c) + - [The `sasa` CLI](#org3826451) +- [Interactive mode](#org51d255d) + - [Example: use `rdbg` from the `test/alea-coloring/` directory](#orgf1f33df) + - [The examples of test directory](#orgba2643a) + - [Running interactive sessions with `rdbg`](#org8e0608b) + - [Getting `rdbg` on-line help](#orga0e4b56) + - [A `rdbg` `sasa` GUI](#orgc178a5b) + - [Useful Modules](#org104bb05) +- [Install](#org82c0381) + - [TL;DR](#orgaa9dedc) + - [Not strictly mandatory, but useful, third-party software](#org73fe296) + - [Install `sasa` via opam (version >= 2.\*)](#org73891dc) + - [Install `sasa` via `git`](#org0593787) + - [Use `sasa` via docker](#orgc204a38) + - [Use `sasa` via a Virtual Machine](#org6a314b3) +- [Screencasts](#org823ffcf) +- [More](#org92ef883) +- [FAQ](#org7a3d43b) + - [Is there a FAQ?](#orgc33433c) + - [I have a compilation error that I don't understand](#orgebe736a) + - [I have the error `Invalid_argument("compare: functional value")`](#orge399e50) + + + +<a id="orgfb6de52"></a> # TL;DR -<a id="orgc076fc7"></a> SASA is a **Self-stabilizing Algorithms SimulAtor**, based on the so-called **Atomic State model** (ASM) introduced by <span class="underline">Dijkstra</span> in its seminal article on [Self-stabilizing distributed algorithms](http://www.cs.utexas.edu/~EWD/ewd04xx/EWD426.PDF). This model is also sometimes named "locally shared memory model with composite atomicity" +<a id="orgee82fbd"></a> SASA is a **Self-stabilizing Algorithms SimulAtor**, based on the so-called **Atomic State model** (ASM) introduced by <span class="underline">Dijkstra</span> in its seminal article on [Self-stabilizing distributed algorithms](http://www.cs.utexas.edu/~EWD/ewd04xx/EWD426.PDF). This model is also sometimes named "locally shared memory model with composite atomicity" Basically, one needs to provide: @@ -61,11 +61,11 @@ sasa ring.dot -l 4 # run a batch simulation for 4 steps [](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/sasa/poster.pdf) -<a id="orgf1bf668"></a> +<a id="org2744ac5"></a> # Topology -<a id="orga98bc12"></a> <a id="orge45f409"></a> The topology is given via `.dot` files, that should +<a id="org32c18d2"></a> <a id="orga2b2179"></a> The topology is given via `.dot` files, that should 1. follow the [graphviz/dot format](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) 2. have nodes **labeled** by the `algo` field @@ -86,6 +86,8 @@ graph ring { Of course the `some_algo.ml` file must exist and contains an algorithm. +nb : sasa uses ml files, and salut lustre files. Therefore the extension used in this `algo` field is actually ignored by tools. Then sasa will remove the extension, and add an `.ml` one, while salut will add a `.lus` one. + In order to define an initial configuration, one can use the `init` node [attribute](http://www.graphviz.org/doc/info/attrs.html). ```dot @@ -121,14 +123,14 @@ graph ring { Such parameters can be retrieved in algorithms using the `Algo.get_graph_attribute : string -> string` function. For example, if you know the graph diameter, you can define it as a graph attribute (a `Algo.diameter: unit -> int` function is provided, but it can be expensive to use for large graphs). -Some tools are provided in the `sasa` [distributions](#orgd3c4718) to generate such kinds of `dot` graphs: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/articles/sasa-gg/> +Some tools are provided in the `sasa` [distributions](#org8d572c2) to generate such kinds of `dot` graphs: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/articles/sasa-gg/> -<a id="org675fb02"></a> +<a id="org59056c6"></a> # Algorithms -<a id="org7a9490c"></a> +<a id="orgda68756"></a> The following has been generated from [algo.mli](https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/blob/master/lib/algo/algo.mli) @@ -140,7 +142,7 @@ The following has been generated from [algo.mli](https://gricad-gitlab.univ-gren </iframe> -<a id="orgd0a590c"></a> +<a id="orgcb4db19"></a> # Examples @@ -180,14 +182,14 @@ The `test` directory also contains sub-directories which gathers programs shared - `test/*/my-rdbg-tuning.ml`: includes `test/my-rdbg-tuning.ml` and defines commands specific to the example of the directory. Indeed, `rdbg`, once launched, first tries to read the content of the file name `my-rdbg-tuning.ml` (if it exists). -<a id="org7bb68a4"></a> +<a id="orgf3689c0"></a> # Batch mode  -<a id="org4b6393c"></a> +<a id="orgd68d0b3"></a> ## Running batch simulations @@ -228,39 +230,37 @@ All the CLI commands above can be run automatically using a `make` rule containe sasa ring.dot # launch the simulation ``` - make: 'ring.cmxs' is up to date. - # Automatically generated by /home/jahier/.opam/4.14.0/bin/sasa version "v4.7.0" ("1f6fd7d") - # on crevetete the 21/7/2022 at 11:05:40 + sasa -reg ring.dot + ocamlfind ocamlopt -bin-annot -package algo -shared state.ml p.ml config.ml ring.ml -o ring.cmxs + # Automatically generated by /home/jahier/.opam/4.14.0/bin/sasa version "v4.8.0" ("f7eaf99") + # on crevetete the 29/11/2022 at 15:15:13 #sasa ring.dot - #seed 839491647 + #seed 750070073 #inputs #outputs "p1_c":int "p2_c":int "p3_c":int "p4_c":int "p5_c":int "p6_c":int "p7_c":int "Enab_p1_conflict":bool "Enab_p2_conflict":bool "Enab_p3_conflict":bool "Enab_p4_conflict":bool "Enab_p5_conflict":bool "Enab_p6_conflict":bool "Enab_p7_conflict":bool "p1_conflict":bool "p2_conflict":bool "p3_conflict":bool "p4_conflict":bool "p5_conflict":bool "p6_conflict":bool "p7_conflict":bool "legitimate":bool potential:real round:bool round_nb:int #step 0 - #outs 1 1 0 0 1 0 0 t t t t f t t t f f f f t f f 6. f 0 + #outs 1 1 0 0 1 0 1 t t t t f f t f t t t f f t f 6. f 0 #step 1 - #outs 2 1 0 0 1 2 0 f f t t f f f f f t t f f f f 2. f 1 + #outs 1 2 2 2 1 0 2 f t t t f f f f f t t f f f f 4. t 2 #step 2 - #outs 2 1 2 2 1 2 0 f f t t f f f f f t t f f f f 2. t 2 + #outs 1 2 0 0 1 0 2 f f t t f f f f f t f f f f f 2. t 3 #step 3 - #outs 2 1 0 0 1 2 0 f f t t f f f f f f t f f f f 2. t 3 - - #step 4 - #outs 2 1 0 2 1 2 0 f f f f f f f f f f f f f f t 0. t 3 + #outs 1 2 1 0 1 0 2 f f f f f f f f f f f f f f t 0. t 3 - This algo is silent after 7 moves, 4 steps, 3 rounds. + This algo is silent after 7 moves, 3 steps, 3 rounds. #quit nb: the simulation output (in the green frame) follows the [RIF](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v6/#outline-container-orga43b00b) conventions. -<a id="orgfe448db"></a> +<a id="org489a669"></a> ## Running batch simulations with Built-in daemons @@ -279,7 +279,7 @@ sasa -h | grep "\-daemon" --greedy-daemon, -gd -<a id="orgadfdca2"></a> +<a id="org14c0bf6"></a> ## Running batch simulations with manual (a.k.a. custom) daemons @@ -317,7 +317,7 @@ In order to enter such input more easily, one can use (requires [the lustre V4 t Daemons can also by simulated by [`lutin`](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v6/#outline-container-sec-4) programs via the use of [`lurette`](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v6/#outline-container-sec-9) (for batch executions) or [`rdbg`](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v6/#outline-container-sec-10) (for interactive sessions). -<a id="org347b172"></a> +<a id="orgae85a46"></a> ## Running batch simulations with `lurette` @@ -342,14 +342,14 @@ Note that for `lurette`, the role of the SUT (System Under Test) and the one of For more information on this topic: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/articles/sasa-daemons/> -<a id="orgba27fbc"></a> +<a id="orgd0df37c"></a> ## Viewing Results `sasa -rif` and `lurette` generates `.rif` files that can be viewed with `gnuplot-rif` or `sim2chro`; cf <http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/reactive-toolbox/> -<a id="orgae5deb1"></a> +<a id="org3826451"></a> ## The `sasa` CLI @@ -436,11 +436,11 @@ More `sasa` options: Display the version ocaml version sasa was compiled with and exit. -<a id="orga63cb12"></a> +<a id="org51d255d"></a> # Interactive mode -<a id="org4f2e672"></a> If you want to perform step-by-step simulations, you can use the `-custd` option. But if you want to perform step-by-step simulations without the burden of playing the role of the daemon, you can launch `sasa` under the control of [rdbg](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/rdbg/). +<a id="org62bde61"></a> If you want to perform step-by-step simulations, you can use the `-custd` option. But if you want to perform step-by-step simulations without the burden of playing the role of the daemon, you can launch `sasa` under the control of [rdbg](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/rdbg/). Another advantage of [rdbg](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/rdbg/) is its ability to display a graphical view of the current configuration during the simulation, to move step by step, or round by round, forward or backwards. @@ -449,7 +449,7 @@ cf <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/articles/rdbg-sasa/> Before reading this section, please read at least the [Basic usage Section if the rdbg documentation](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/rdbg/README.html#outline-container-sec-3). -<a id="org913b4b7"></a> +<a id="orgf1f33df"></a> ## Example: use `rdbg` from the `test/alea-coloring/` directory @@ -492,7 +492,7 @@ rdbg [q] quit -<a id="orgeb18210"></a> +<a id="orgba2643a"></a> ## The examples of test directory @@ -503,7 +503,7 @@ The [test](https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/t - `test/*/my-rdbg-tuning.ml`: includes `test/my-rdbg-tuning.ml` and defines commands specific to the example of the directory. Indeed, `rdbg`, once launched, first tries to read the content of the file name `my-rdbg-tuning.ml` (it it exists). -<a id="org3a65716"></a> +<a id="org8e0608b"></a> ## Running interactive sessions with `rdbg` @@ -520,7 +520,7 @@ The [test](https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/t All those commands are defined in (the common) [test/my-rdbg-tuning.ml](https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/tree/master/test/my-rdbg-tuning.ml) that is included in (locals) `test/*/my-rdbg-tuning.ml` that are included in (generated) `test/*/rdbg-session.ml` files. `my-rdbg-tuning.ml` contains straigthforward `ocaml` code that defines various `rdbg` shortcuts to ease the simulation of `sasa` systems. Feel free to tailor those command to yours needs by modyfying the local `my-rdbg-tuning.ml`! -<a id="org48fa50d"></a> +<a id="orga0e4b56"></a> ## Getting `rdbg` on-line help @@ -616,7 +616,7 @@ Here are 2 useful entry-points to rdbg on-line help: (rdbg) -<a id="orgad6bf70"></a> +<a id="orgc178a5b"></a> ## A `rdbg` `sasa` GUI @@ -630,7 +630,7 @@ opam install -y rdbgui4ocaml To use it: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/articles/rdbgui4sasa/> -<a id="org9d9173a"></a> +<a id="org104bb05"></a> ## Useful Modules @@ -665,14 +665,14 @@ Some modules, used by the sasa core engine, can be useful from `rdbg`. </iframe> -<a id="org282e5ca"></a> +<a id="org82c0381"></a> # Install -<a id="orgd3c4718"></a> <a id="org61057ff"></a> +<a id="org8d572c2"></a> <a id="orga187057"></a> -<a id="org45124dd"></a> +<a id="orgaa9dedc"></a> ## TL;DR @@ -726,7 +726,7 @@ git clone https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa.gi ``` -<a id="org8d183f0"></a> +<a id="org73fe296"></a> ## Not strictly mandatory, but useful, third-party software @@ -769,7 +769,7 @@ sudo apt install -y wish Otherwise: <http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v4/distrib/index.html> -<a id="org2504ba4"></a> +<a id="org73891dc"></a> ## Install `sasa` via opam (version >= 2.\*) @@ -803,7 +803,7 @@ opam upgrade ``` -<a id="orgc5e8c3e"></a> +<a id="org0593787"></a> ## Install `sasa` via `git` @@ -847,14 +847,14 @@ make test One can also mimic the content of the `test` job in the project [.gitlab-ci.yml Gitlab CI script](https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/tree/master/.gitlab-ci.yml). -<a id="org03256dd"></a> +<a id="orgc204a38"></a> ## Use `sasa` via docker cf the Docker Install section of the [Synchrone Reactive Tool Box](http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/lustre-v6/#docker). This docker image contains all the tools mentioned in this section (`sasa`, `lustre`, `opam`, `ocaml`, emacs, graphviz, etc.). -<a id="org9f93471"></a> +<a id="org6a314b3"></a> ## Use `sasa` via a Virtual Machine @@ -864,7 +864,7 @@ cf the Docker Install section of the [Synchrone Reactive Tool Box](http://www-ve - passwd:sasa -<a id="org57f191d"></a> +<a id="org823ffcf"></a> # Screencasts @@ -880,7 +880,7 @@ cf the Docker Install section of the [Synchrone Reactive Tool Box](http://www-ve cf <http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/sasa/screencasts/> -<a id="orgbc6bd0b"></a> +<a id="org92ef883"></a> # More @@ -889,12 +889,12 @@ cf <http://www-verimag.imag.fr/DIST-TOOLS/SYNCHRONE/sasa/screencasts/> - Tutorials: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt//tags/sasa/> -<a id="org046be58"></a> +<a id="org7a3d43b"></a> # FAQ -<a id="org99b42b5"></a> +<a id="orgc33433c"></a> ## Is there a FAQ? @@ -903,7 +903,7 @@ Yes. Beside, some tutorials are also available here: <https://verimag.gricad-pages.univ-grenoble-alpes.fr/vtt/tags/sasa/> -<a id="orgbd579cf"></a> +<a id="orgebe736a"></a> ## I have a compilation error that I don't understand @@ -913,7 +913,7 @@ Beside, some tutorials are also available here: <https://verimag.gricad-pages.un - If the message is totally useless, please feel free to add an issue here <https://gricad-gitlab.univ-grenoble-alpes.fr/verimag/synchrone/sasa/issues> -<a id="org1d85558"></a> +<a id="orge399e50"></a> ## I have the error `Invalid_argument("compare: functional value")` diff --git a/guides/users/README.org b/guides/users/README.org index 016e893761ae0ef0c5d9f4527a064b3ae92d6572..54e04d380e6c68949a0229cd4c10a0ccad7dd5ed 100644 --- a/guides/users/README.org +++ b/guides/users/README.org @@ -120,6 +120,11 @@ graph ring { Of course the =some_algo.ml= file must exist and contains an algorithm. +nb : sasa uses ml files, and salut lustre files. Therefore the extension used +in this =algo= field is actually ignored by tools. Then sasa will +remove the extension, and add an =.ml= one, while salut will +add a =.lus= one. + In order to define an initial configuration, one can use the =init= node [[http://www.graphviz.org/doc/info/attrs.html][attribute]]. diff --git a/lib/sasacore/genRegister.ml b/lib/sasacore/genRegister.ml index f688fe23f3a64af2aaa505ca32bdb21d9b043acd..0d2aebeaab637631cc32d4f2a27cd2c71aeadd25 100644 --- a/lib/sasacore/genRegister.ml +++ b/lib/sasacore/genRegister.ml @@ -17,7 +17,7 @@ the following interface: *) let ml_filename_to_module fn = - let str = Filename.chop_extension fn in + let str = Filename.remove_extension fn in String.capitalize_ascii str let from_ml ml = diff --git a/lib/sasacore/process.ml b/lib/sasacore/process.ml index b28577d4050123d183e7cda74fc9703ec1642419..dcc19f8f12d53ed1d5b90aca9ea55ed8486a9a9f 100644 --- a/lib/sasacore/process.ml +++ b/lib/sasacore/process.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/02/2020 (at 09:35) by Erwan Jahier> *) +(* Time-stamp: <modified the 28/11/2022 (at 17:41) by Erwan Jahier> *) type 'v t = { pid : string; @@ -12,7 +12,7 @@ let (make: bool -> Topology.node -> 'v -> 'v t) = fun custom_mode n init -> let pid = n.Topology.id in let ml = n.Topology.file in - let id = Filename.chop_suffix ml ".ml" in + let id = Filename.remove_extension ml in let actions = Register.get_actions () in if custom_mode && actions = [] then failwith diff --git a/lib/sasacore/simuState.ml b/lib/sasacore/simuState.ml index a62f42ca6b88bb0c1e38865af00e87a2d618c3e1..4c984363b5f6a30653bf092f8c1b5002c4fd09a4 100644 --- a/lib/sasacore/simuState.ml +++ b/lib/sasacore/simuState.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 22/06/2022 (at 22:49) by Erwan Jahier> *) +(* Time-stamp: <modified the 28/11/2022 (at 17:38) by Erwan Jahier> *) open Register open Topology @@ -199,22 +199,31 @@ let (make : bool -> string array -> 'v t) = let dot_file = args.topo in let g = Topology.read dot_file in let nl = g.nodes in + let algo_files = List.map (fun n -> n.Topology.file) nl in + let algo_files = List.sort_uniq compare algo_files in + let algo_files = + (* we should have ml files here; even if the dot file refers + to, e.g., lustre files. The justification for doing that + is that only the file name matters, not the extension. + This is necessary if we want to share dot files with sasa + and salut. Probably it would be better to have no + extension at all in the .dot files, and let the tools that + are using it decide what the real file extension is + supposed to be (sasa => .ml, salut => .lus) *) + List.map (fun f -> (Filename.remove_extension f)^".ml") algo_files + in if args.output_algos then ( - let fl = List.map (fun n -> n.Topology.file) nl in - let fl = List.sort_uniq compare fl in - Printf.printf "%s\n%!" (String.concat " " fl); + Printf.printf "%s\n%!" (String.concat " " algo_files); exit 0 ); - let cmxs = (Filename.chop_extension dot_file) ^ ".cmxs" in + let cmxs = (Filename.remove_extension dot_file) ^ ".cmxs" in if args.gen_register then ( - let base = Filename.chop_extension dot_file in + let base = Filename.remove_extension dot_file in let base = Filename.basename base in let base = Str.global_replace (Str.regexp "\\.") "" base in let ml_register_file = base ^ ".ml" in let ml_state_file = "state.ml" in let ml_config_file = "config.ml" in - let algo_files = List.map (fun n -> n.Topology.file) nl in - let algo_files = List.sort_uniq compare algo_files in let ml_inputs = String.concat " " algo_files in GenRegister.f algo_files (ml_state_file, ml_config_file, ml_register_file); Printf.eprintf " [sasa] Hint: you may wish to generate %s out of %s with:\n" @@ -245,7 +254,7 @@ let (make : bool -> string array -> 'v t) = Printf.eprintf " [sasa] Empty algo attribute in %s.\n%!" dot_file; exit 1 ); - let algo_id = Filename.chop_suffix n.Topology.file ".ml" in + let algo_id = Filename.remove_extension n.Topology.file in let value_of_string_opt = Register.get_value_of_string () in if value_of_string_opt = None || n.Topology.init = "" then (* Use the init functions if initial values are not in the dot *) diff --git a/lib/sasacore/worstInit.ml b/lib/sasacore/worstInit.ml index 93ee105a8b5e6fa179b9f98de5e55cc31b13d829..c8826f2daf90fb3f15df115fa3de516cdc0f0ea5 100644 --- a/lib/sasacore/worstInit.ml +++ b/lib/sasacore/worstInit.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/04/2022 (at 15:20) by Erwan Jahier> *) +(* Time-stamp: <modified the 28/11/2022 (at 17:41) by Erwan Jahier> *) open Register @@ -291,7 +291,7 @@ let reinit_simu g ss = let pl = List.map2 (fun n p -> { p with - init = let algo_id = Filename.chop_suffix n.Topology.file ".ml" in + init = let algo_id = Filename.remove_extension n.Topology.file in Register.get_init_state algo_id (List.length (g.succ p.pid)) p.pid }) g.nodes