diff --git a/doc/source/developers_guide.rst b/doc/source/developers_guide.rst index 1417ce96f240f17f714eb515cabb410fa1a559b8..71b039aa993a424601bf42ec5bb4f17086c5ee3f 100644 --- a/doc/source/developers_guide.rst +++ b/doc/source/developers_guide.rst @@ -1,1320 +1,1208 @@ -Developer's guide +Developer's Guide ================= -Introduction and disclaimer ---------------------------- +.. admonition:: Disclaimer -This guide intends to work as an introduction into kmos3s internal -structure, including both the automatically generated Fortran code, as -well as the code generation procedure. As the name suggest, the intended -audience are those who want to contribute to kmos3 as developers. This -guide will assume that you are familiar with the way in which kmos3 is -used. If that is not the case, you should start reading the sections of -the `documentation <http://kmos3.readthedocs.io>`__ intended for users -and/or go through the `Intro to -kmos3 <http://github.com/jmlorenzi/intro2kmcos>`__ tutorial. + The information in this guide is provided with the hope that it will ease your way into the + codebase kmos3, but it may contain errors. In the end, only the interpretation of the code + itself can really let you effectively add functionality to kmos3. -**DISCLAIMER**: This is information is provided with the hopes that it -will ease your way into kmos3s codebase, but it may contain errors. In -the end only the interpretation of the code itself can really let you -effectively add functionality to kmos3. +Introduction +------------ -For developers of the project, branch management will follow -`this flowchart <https://github.com/kmos3/kmos3/tree/master/doc/source/topic_guides/GithubGuideKmcos.pptx>`__ +This guide intends to work as an introduction into the internal structure of kmos3, including both +the automatically generated Fortran code as well as the code generation procedure. As the name +suggest, the intended audience are those who want to contribute to kmos3 as developers. This guide +will assume that you are familiar with the way in which kmos3 is used. If that is not the case, +you should start reading the sections of the :ref:`tutorials` and :ref:`topic-guides` intended for +users and/or go through the `intro2kmos3 <https://gitlab.mpcdf.mpg.de/fhi-theory/intro2kmos3>`_ +tutorial. -How to edit, install, and test your changes locally ---------------------------------------------------- - -First, install kmos3, then you must locate your kmos3 installation. Typically it will be in a directory similar to: ~/VENV/kmos3/lib/python3/site-packages/ -If you have difficulty finding it, use | python3 -c"import sys; print(sys.path)" | Then, inside tthe site-packages directory, if kmos3 has an "egg" file, you must copy the kmos3 directory out of the egg file directly into the site_packages directory. After that, delete any other kmos3 egg files or directories so that there is a single kmos3 directory inside of site_packages. +For developers of the project, repository and branch management will follow this flow chart: -OPTION 1 (recommended): Edit the source code directly inside site_packages, or edit the code elsewhere and then paste over the files in site_packages. Usually, this will be sufficient. +.. figure:: img/gitlab_guide.svg + :width: 75% + :align: center -OPTION 2: Edit the source code elsewhere (such as in a shared folder) and reinstall using the setup.py:: +How to Edit, Install, and Test Your Changes Locally +--------------------------------------------------- - source ~/VENV/kmos3/bin/activate #this is the command to enter the python virtual environment - pip install . +If you want to make changes to the source code, you can edit the respective file(s) in the cloned +repository. After that, be sure to have activated the virtual environment and reinstall kmos3 :: -This will reinstall kmos3. + source $HOME/kmos3_venv/bin/activate + pip install . -Before pushing to github, you should enter the the tests directory and run the unit tests. +Before pushing to GitLab, you should enter the the tests directory and run the unit tests. -Some nomenclature +Some Nomenclature ----------------- -For some terms used frequently in this guide, there might exist some -ambiguity on exact meaning. Here we present some definitions to try to -alleviate this. Probably some ambiguity will remain, but hopefully not -anything that cannot be discerned from context. - -**site**: In kmos3, this can have two different interpretations: either a -specific node of the lattice or a type of site, e.g. a crystallographic -site (top, fcc, hollow…). In this guide we use the former meaning: an -specific position on the simulation lattice. When we need to indicate -the second meaning, we will use **site type**. - -**coordinate**: indicates the relative position of a site in the lattice -with respect to some other site. In general, a coordinate will be given -as a pair of site pair and an offset representing the relative positions -of the unit cells (in units of the unit cell vector). The site used as -reference will depend on the context. - -**process**: a set of elementary changes that can occur on the lattice -state on a single kMC step. A process is defined by a list of conditions -and actions, and a rate constant expression. - -**executing coordinate**: A coordinate associated to each process to be -used as a reference for the relative positions of conditions and actions -when defining the Fortran routines. In ``local_smart`` and ``lat_int`` -the executing coordinate is found with the help of the -``kmos3.types.Process.executing_coord`` method. In ``otf`` the concept of -executing coordinate is not used, the reference position in the lattice -is the central position implied by the user during model definition, -i.e. the position in which coordinates have ``offset = (0, 0, 0)``. - -**event**: a process for which an specific site has been selected. - -**active event**: An event that can be executed given the current state -of the lattice, i.e. an event for which all associated conditions are -fulfilled. - -**lateral interactions**: For kmos3 models built for the ``local_smart`` -or ``lat_int``, we will say that such model includes *lateral -interactions* if there is one or more groups of processes with the -following characteristics: - -a. their actions are all identical -b. the conditions occurring on the same sites as the actions are identical -c. there is a group of additional sites in which these processes have conditions, but these conditions are different for each process in the group - -These processes represent the same change in the lattice, but under a -difference state of the rest of the sites. These groups of processes are -typically used to account for the effect of surrounding species on the -values of the rate constants, i.e. the lateral interactions. - -**lateral interaction group**: The group of processes defined by items -a, b, c above. - -**bystander** (``local_smart`` or ``lat_int`` backends) The set of -conditions of item c above, i.e. conditions of a process in a lateral -interaction groups that do not have an action associated to it. - -**bystander site/coordinate**: A site/coordinate associated with a -bystanders. - -**participating sites**: Sites associated with actions from item a and -conditions from item b of the definition of a lateral interaction group. - -**lateral interaction event group**: a collection of events occurring on -the same lattice site and whose associated processes belong to the same -lateral interaction group. Due to the nature of lateral interaction -groups, only one of such events can be possible in a lattice at any -given time. - -**bystander** (``otf`` backend): In the ``otf`` backend, the concept of -bystander is explicitly included in the model definition, i.e. it is a -new class ``kmos3.types.Bystander`` exclusive to this backend. An ``otf`` -model is said to include lateral interactions if one of its processes -includes such bystanders. Note that models *without* lateral -interactions should not be built using the ``otf`` backend, as -``local_smart`` will definitely be more efficient. - -The three *backends* --------------------- - -While most kmos3 users will only need to worry about the Python interface -to build and run the model, developers will also need to familiarize -with the FORTRAN core code. The exact structure of this code depends on -the *backend* that one selects. Which backend is most appropriate -depends on the nature of the kMC model being implemented. Below we -present a qualitative description of each backend. +For some terms used frequently in this guide, there might exist some ambiguity on exact meaning. +Here we present some definitions to try to alleviate this. Probably some ambiguity will remain, +but hopefully not anything that cannot be discerned from context. + +site + In kmos3, this can have two different interpretations: either a specific node of the lattice or + a type of site, e.g., a crystallographic site (top, fcc, hollow…). In this guide we use the + former meaning: a specific position on the simulation lattice. When we need to indicate the + second meaning, we will use **site type**. + +coordinate + Indicates the relative position of a site in the lattice with respect to some other site. In + general, a coordinate will be given as a pair of a site and an offset representing the relative + positions of the unit cells (in units of the unit cell vector). The site used as reference will + depend on the context. + +process + A set of elementary changes that can occur on the lattice state on a single KMC step. A process + is defined by a list of conditions and actions, and a rate constant expression. + +executing coordinate + A coordinate associated to each process to be used as a reference for the relative positions of + conditions and actions when defining the Fortran routines. In ``local_smart`` and ``lat_int`` + the executing coordinate is found with the help of the ``kmos3.types.Process.executing_coord`` + method. In ``otf`` the concept of executing coordinate is not used. The reference position in + the lattice is the central position implied by the user during model definition, i.e., the + position in which coordinates have ``offset = (0, 0, 0)``. + +event + A process for which a specific site has been selected. + +active event + An event that can be executed given the current state of the lattice, i.e., an event for which + all associated conditions are fulfilled. + +lateral interactions + For kmos3 models built for the ``local_smart`` or ``lat_int``, we will say that such model + includes *lateral interactions* if there is one or more groups of processes with the following + characteristics: + + a. Their actions are all identical. + b. The conditions occurring on the same sites as the actions are identical. + c. There is a group of additional sites in which these processes have conditions, but these + conditions are different for each process in the group. + + These processes represent the same change in the lattice, but under a difference state of the + rest of the sites. These groups of processes are typically used to account for the effect of + surrounding species on the values of the rate constants, i.e., lateral interactions. + +lateral interaction group + The group of processes defined by items a, b, and c above. + +bystander (``local_smart`` or ``lat_int`` backends) + The set of conditions of item c above, i.e., conditions of a process in a lateral interaction + group that does not have an action associated to it. + +bystander site/coordinate + A site/coordinate associated with a bystander. + +participating sites + Sites associated with actions from item a and conditions from item b of the definition of a + **lateral interaction group**. + +lateral interaction event group + A collection of events occurring on the same lattice site and whose associated processes belong + to the same lateral interaction group. Due to the nature of lateral interaction groups, only + one of such events can be possible in a lattice at any given time. + +bystander (``otf`` backend) + In the ``otf`` backend, the concept of bystander is explicitly included in the model + definition, i.e., it is a new class ``kmos3.types.Bystander`` exclusive to this backend. An + ``otf`` model is said to include lateral interactions if one of its processes includes such + bystanders. Note that models *without* lateral interactions should not be built using the + ``otf`` backend, as ``local_smart`` will definitely be more efficient. + +The Three Backends +------------------ + +While most kmos3 users will only need to worry about the Python interface to build and run a +model, developers will also need to familiarize with the Fortran core code. The exact structure of +this code depends on the *backend* that one selects. Which backend is most appropriate depends on +the nature of the KMC model being implemented. Below we present a qualitative description of each +backend. ``local_smart`` ~~~~~~~~~~~~~~~ -This is the original kmos3 backend and has been used as a basis and -inspiration for the rest of the backends. It was built with the implicit -objective of offering the best run time performance at the expense of -memory usage. For this reason, a key element in this backend is a -precalculated list of rate constants, stored in the ``base/rates`` -array. +This is the original kmos3 backend and has been used as a basis and inspiration for the other +backends. It was built with the implicit objective of offering the best run time performance at +the expense of memory usage. For this reason, a key element in this backend is a precalculated +list of rate constants, stored in the ``base/rates`` array. -This is the most efficient backend when the number of different rate -constants list is reasonable small. +This is the most efficient backend if the number of different rate constants is reasonably small. -For models with very large number of different processes ``nproc`` (such -as cases in which large lateral interaction groups exist) some -undesirable effects can occur: +For models with a very large number of different processes ``nproc`` (such as cases in which large +lateral interaction groups exist) some undesirable effects can occur: -- The time needed to run a kMC step can become large, as it scales as - :math:`\mathcal{O}(\texttt{nproc})`. -- The bookkeeping data structures, which scale in size with the total - number of processes, can become too big for available memory. -- The size of individual source code files can become very large, - making compilation very slow or even impossible due to memory - requirements. +- The time needed to run a KMC step can become large, as it scales as + :math:`\mathcal{O}(`\ ``nproc``\ :math:`)`. +- The bookkeeping data structures, which scale in size with the total number of processes, can + become too big for available memory. +- The size of individual source code files can become very large, making compilation very slow or + even impossible due to memory requirements. ``lat_int`` ~~~~~~~~~~~ -The ``lat_int`` backend is the first attempt to alleviate the problems -of ``local_smart`` for models with lateral interaction groups of -moderate size. The main differences between them is that ``lat_int`` -structures the generated code around the different lateral interaction -groups and splits the source files accordingly. This way compilation is -faster and requires less memory. A necessary consequence of this is that -the logic for the lattice update needs to be different. +The ``lat_int`` backend is the first attempt to alleviate the problems of ``local_smart`` for +models with lateral interaction groups of moderate size. The main differences between them is that +``lat_int`` structures the generated code around the different lateral interaction groups and +splits the source files accordingly. This way compilation is faster and requires less memory. A +necessary consequence of this is that the logic for the lattice update needs to be different. -TODO: I seem to recall that there are models for which ``lat_int`` -outperforms ``local_smart``, even when ``local_smart`` can eventually -compile and run. This should be verified and interpreted (i.e. is -``lat_int`` smarter than ``local_smart`` some times? If so, why?). +.. todo:: + I (who?) seem to recall that there are models for which ``lat_int`` outperforms ``local_smart``, + even when ``local_smart`` can eventually compile and run. This should be verified and + interpreted (i.e., is ``lat_int`` smarter than ``local_smart`` some times? If so, why?). ``otf`` ~~~~~~~ -For processes with lots of lateral interactions, i.e. very large lateral -interaction groups, keeping a list of precalculated rate constants (and -the proportionally large bookkeeping arrays) is unfeasible. The -alternative is to evaluate rate constants during runtime, i.e. *on the -fly*. kMC models built using the ``otf`` array do just that. To -accommodate for this, the concept of a process in ``otf`` is different -to that in the other backends. In ``otf``, all members of a lateral -interaction group are represented by a single process. Therefore, the -total number of processes and, consequently, the size of bookkeeping -arrays is much smaller. The counterpart from this improvement is that -now a kMC step scales linearly with the system size (instead of being +For processes with lots of lateral interactions, i.e., very large lateral interaction groups, +keeping a list of precalculated rate constants (and the proportionally large bookkeeping arrays) +is unfeasible. The alternative is to evaluate rate constants during runtime, i.e., *on the fly*. +KMC models built using the ``otf`` backend do just that. To accommodate for this, the concept of a +process in ``otf`` is different to that in the other backends. In ``otf``, all members of a +lateral interaction group are represented by a single process. Therefore, the total number of +processes and, consequently, the size of bookkeeping arrays is much smaller. The counterpart from +this improvement is that now a KMC step scales linearly with the system size (instead of being constant time). -The structure of the FORTRAN code. ----------------------------------- +The Fortran Code Files +---------------------- -Here we present a description of the different files in which the source -code is split. We use the ``local_smart`` backend as a basis for this -description, as it is the original backend and contains -the fewest files. For the other backends, we will only explain -the differences with ``local_smart``. +Here, we present a description of the different files in which the source code is split. We use +the ``local_smart`` backend as a basis for this description, as it is the original backend and +contains the fewest files. For the other backends, we will only explain the differences to +``local_smart``. -All kmos3 models contain train main source files: ``base.f90``, -``lattice.f90`` and ``proclist.f90``. Each of these source files defines -a module of the same name. These modules are exposed to Python -interface. +All kmos3 models contain three main source files: ``base.f90``, ``lattice.f90``, and +``proclist.f90``. Each of these source files defines a module of the same name. These modules are +exposed to the Python interface. -It is important to know that some of the fortran code -comes from the directory \kmos3\fortran_src\ -and some of the fortran code comes from the file -\kmos3\io.py , so io.py should be checked -as well, if needed, when looking for fortran source code. +It is important to know that some of the Fortran code comes from the ``fortran_src`` directory and +some comes from the file ``io.py``, so both locations should be checked, when dealing with the +Fortran source code. -Files for the ``local_smart`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``local_smart`` +~~~~~~~~~~~~~~~ ``base.f90`` ^^^^^^^^^^^^ -As it name suggests, ``base.f90`` contains the lowest-level elements of the model. It implements the kMC method in a 1D lattice. The ``base`` module contains all the bookkeeping arrays described in :ref:`Key data-structures <data-structs>` and the routines used to - -- allocate and deallocate memory -- update of the bookkeeping arrays for lattice configuration and - available processes -- using such arrays to determine the next process to be executed -- keep track of kMC time and total number of steps -- keep track of the number of executions of each individual process - (``procstat``) -- saving an reloading the system's state +As its name suggests, ``base.f90`` contains the lowest-level elements of the model. It implements +the KMC method in a 1D representation of the lattice (i.e., the ND lattice of the problem, +flattened). The ``base`` module contains all the bookkeeping arrays described in +:ref:`data-structs` and the routines to -Many routines in base take a variable ``site`` as input. This is an -index (integer value) that identifies a site on the 1D representation of -the lattice (i.e. the ND lattice of the problem, flattened). +- allocate and deallocate memory +- update the bookkeeping arrays for the lattice configuration and available processes +- using these arrays to determine the next process to be executed +- keep track of KMC time and total number of steps +- keep track of the number of executions of each individual process (``procstat``) +- save an reload the system's state -The contents of ``base.f90`` are (mostly) fixed, i.e. it is (almost) the -same file for all kmos3 models (as long as they use the same backend). +Many routines in ``base`` take a variable ``site`` as input. This is an index (integer value) that +identifies a site in the 1D representation. The contents of ``base.f90`` are (mostly) fixed, i.e., +it is (almost) the same file for all kmos3 models (as long as they use the same backend). .. _lattice: ``lattice.f90`` ^^^^^^^^^^^^^^^ -The role of the ``lattice.f90`` is to generate the map from the ND -lattice (N=1, 2, 3) to the 1D lattice that is handled by ``base.f90``. -The ``lattice`` module imports subroutines from the ``base`` module. -Beside the look-up arrays ``lattice2nr`` and ``nr2lattice``, used to map -to and from the 1D lattice, this module also implements wrappers to many -of the basic functions defined in ``base.f90``. Such wrappers take now a -4D array ``lsite`` variable, designating the site on a 3D lattice, -instead of the single integer ``site`` used by ``base``. The first three -elements of this array indicate the ( (x, y, z) ) position of the -corresponding unit cell (in unit cell vector units), while the fourth -indicates the site type. In cases of lower dimensional lattices, some -elements of the ``site`` array simply stay always at a value of 0. - -The ``lattice.f90`` file needs to be generated especially for each -model, but only changes if the lattice used changes (e.g. if the number -of site types or the dimension of the model). +The role of the ``lattice.f90`` is to generate the map from the ND lattice (N=1, 2, 3) to the 1D +lattice that is handled by ``base.f90``. The ``lattice`` module imports subroutines from the +``base`` module. Besides the look-up arrays ``lattice2nr`` and ``nr2lattice``, used to map to and +from the 1D lattice, this module also implements wrappers to many of the basic functions defined +in ``base.f90``. Such wrappers take now a 4D array ``lsite`` variable, designating the site on a +3D lattice, instead of the single integer ``site`` used by ``base``. The first three elements of +this array indicate the ``(x, y, z)`` position of the corresponding unit cell (in unit cell vector +units), while the fourth indicates the site type. In cases of lower dimensional lattices, some +elements of the ``site`` array simply always stay at a value of 0. + +The ``lattice.f90`` file needs to be generated especially for each model, but only changes if the +lattice used changes (e.g., the number of site types or the dimension of the model). ``proclist.f90`` ^^^^^^^^^^^^^^^^ -``proclist.f90`` includes the routines called by the Python interface -while running the model. In addition, it encodes the logic necessary to -update the list of active events (i.e. the main bookkeeping arrays, -``avail_procs`` and ``nr_of_sites``), given that a specific process has -been selected for execution. The module imports methods and variables -from both the ``base`` and ``lattice`` modules. +``proclist.f90`` includes the routines called by the Python interface while running the model. In +addition, it encodes the logic necessary to update the list of active events (i.e., the main +bookkeeping arrays, ``avail_procs`` and ``nr_of_sites``), given that a specific process has been +selected for execution. The module imports methods and variables from both the ``base`` and +``lattice`` modules. -The ``proclist.f90`` files needs to be generated specially for each -model, and is the file that changes most often during model development, -as it is updated every time a process changes. +The ``proclist.f90`` files needs to be generated specially for each model and is the file that +changes most often during model development, as it is updated every time a process changes. -Files for the ``lat_int`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``lat_int`` +~~~~~~~~~~~ ``proclist.f90`` ^^^^^^^^^^^^^^^^ -Some of the functionality that existed here in ``local_smart`` has been -moved to different source files. While the functions called by the -Python interface during execution remain here, the logic to update the -list of active events is moved to ``nli_*.f90`` and ``run_proc_*.f90`` -files. In addition, constants are also defined in an independent module -on the separate file ``proclist_constants.f90``. +Some of the functionality of ``local_smart`` has been moved to different source files. While the +functions called by the Python interface during execution remain here, the logic to update the +list of active events is moved to the ``nli_*.f90`` and ``run_proc_*.f90`` files. In addition, +constants are also defined in an independent module in the separate file +``proclist_constants.f90``. ``proclist_constants.f90`` ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Defines a module declaring several constants used by ``proclist``, -``nli_*`` and ``run_proc_*`` modules. +Defines a module declaring several constants used by the ``proclist``, ``nli_*`` and +``run_proc_*`` modules. ``nli_<lat_int_nr>.f90`` ^^^^^^^^^^^^^^^^^^^^^^^^ -There is one of such file for each lateral interaction group. These -source files are enumerated starting from zero. Each of them implements -a module called ``nli_<lat_int_nr>`` which contains a single function -``nli_<lat_int_group>``. ``<lat_int_group>`` is the name of the lateral -interaction group, which coincides with the name of the first (lowest -index) process in the group. These functions implement logic to decide -which process from the group can occur on a given site, if any. +There is one of such file for each lateral interaction group. These source files are enumerated +starting from zero. Each of them implements a module called ``nli_<lat_int_nr>``, which contains a +single function ``nli_<lat_int_group>``. ``<lat_int_group>`` is the name of the lateral +interaction group, which coincides with the name of the first (lowest index) process in the group. +These functions implement the logic to decide which process from the group can occur on a given +site, if any. ``run_proc_<lat_int_nr>.f90`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -There is one of such file for each lateral interaction group. These -source files are enumerated starting from zero. Each of them implements -a module called ``run_proc_<lat_int_nr>`` that contains a single -subroutine ``run_proc_<lat_int_group>``. ``<lat_int_group>`` is the name -of the lateral interaction group, which coincides with the name of the -first (lowest index) process in the group. This routine is responsible -of calling ``lattice/add_proc`` and ``lattice/del_proc`` for each -lateral interaction group that should potentially be added or deleted. -For this, it passes results of the ``nli_<lat_int_group>`` functions as -argument, to ensure correct update of the list of active events. +There is one of such file for each lateral interaction group. These source files are enumerated +starting from zero. Each of them implements a module called ``run_proc_<lat_int_nr>``, which +contains a single subroutine ``run_proc_<lat_int_group>``. ``<lat_int_group>`` is the name of the +lateral interaction group, which coincides with the name of the first (lowest index) process in +the group. This routine is responsible for calling ``lattice/add_proc`` and ``lattice/del_proc`` +for each lateral interaction group that should potentially be added or deleted. For this, it +passes results of the ``nli_<lat_int_group>`` functions as arguments, to ensure correct updates +of the list of active events. -Files for the ``otf`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``otf`` +~~~~~~~ ``proclist.f90`` ^^^^^^^^^^^^^^^^ -Similar to ``lat_int``, this file contains the functions called by the -Python interface at runtime. Contrary to ``local_smart``, the logic for -the update of the active event list is in the ``run_proc_<proc_nr>.f90`` -files and constants shared among different modules are defined on +Similar to ``lat_int``, this file contains the functions called by the Python interface at +runtime. Contrary to ``local_smart``, the logic for the updates of the active event list is in the +``run_proc_<proc_nr>.f90`` files and constants shared among different modules are defined in ``proclist_constants.f90``. ``proclist_constants.f90`` ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Defines constant values to be shared between the ``proclist``, -``proclist_pars`` and ``run_proc_*``. +Defines a module declaring several constants used by the ``proclist``, ``proclist_pars`` and +``run_proc_*`` modules. ``proclist_pars.f90`` ^^^^^^^^^^^^^^^^^^^^^ -This file implements the modules ``proclist_pars`` ("process list -parameters") and takes care of providing functionality that that only -existed at the Python level in the earlier backends. More importantly, -it implements the functions used to evaluate rate constants during -execution. In more detail it: +This file implements the modules ``proclist_pars`` (process list parameters) and takes care of +providing functionality that only existed at the Python level in the earlier backends. More +importantly, it implements the functions used to evaluate rate constants during execution. In more +detail it -- Implements the Fortran array ``userpar`` to access user-defined - parameters at FORTRAN level, and functionality to update them from - Python. -- When necessary, it implements a ``chempots`` array for accessing the - chemical potentials in FORTRAN. -- It includes the routines ``gr_<proc_name>`` and ``rate_<proc_name>``, - which are used to evaluate the rate constants on the fly. +- implements the Fortran array ``userpar`` to access user-defined parameters at Fortran level and + functionality to update them from Python. +- implements a ``chempots`` array for accessing the chemical potentials in Fortran, when + necessary. +- includes the routines ``gr_<proc_name>`` and ``rate_<proc_name>``, which are used to evaluate + the rate constants on the fly. ``run_proc_<proc_nr>.f90`` ^^^^^^^^^^^^^^^^^^^^^^^^^^ -There is one of such file for each process in the model. They implement -modules ``run_proc_<proc_nr>`` containing a ``run_proc_<proc_name>`` -subroutine each. These routines contain the decision trees that figure -out which events need to be activated or deactivated and call the -corresponding functions from ``base`` (``add_proc`` and ``del_proc``). +There is one of such file for each process in the model. They implement the modules +``run_proc_<proc_nr>``, each containing a ``run_proc_<proc_name>`` subroutine. These routines +contain the decision trees that figure out which events need to be activated or deactivated and +call the corresponding functions from ``base`` (``add_proc`` and ``del_proc``). .. _data-structs: -Key data-structures +Key Data Structures ------------------- -Here we describe the most important arrays required for bookkeeping in -kmos3. Understanding what information these arrays contain is crucial to -understand how kmos3 selects the next kMC process to be executed. This is -explained in :ref:`One kmc step in kmos3 <kmc-step>`. All these data -structures are declared in the ``base`` module and their dimensions are -based on the "flattened" representation of the lattice in 1 dimension. +Here, we describe the most important arrays required for bookkeeping in kmos3. Understanding what +information these arrays contain is crucial to understand how kmos3 selects the next KMC process +to be executed. This procedure is explained in more detail in :ref:`kmc-step`. All these data +structures are declared in the ``base`` module and their dimensions are based on the `flattened` +representation of the lattice in 1 dimension. -Important scalar variables +Important Scalar Variables ~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ``nr_of_proc`` (int): The total number of processes in the model -- ``volume`` (int): The total number of sites in the lattice +- ``nr_of_proc`` (int): The total number of processes in the model. +- ``volume`` (int): The total number of sites in the lattice. -Important arrays +Important Arrays ~~~~~~~~~~~~~~~~ ``rates`` ^^^^^^^^^ -- Dimension: 1 -- Type: float -- Size: ``nr_of_proc`` +- Dimension: 1 +- Type: float +- Size: ``nr_of_proc`` -Contains the rate constants for each process. This array is kept fixed -during the execution of the kMC algorithm, and is only to be changed -through the Python interface. +Contains the rate constants for each process. This array is kept fixed during the execution of the +KMC algorithm, and is only to be changed through the Python interface. -In the ``otf`` backend, rate constants are obtained on-the-fly during -the execution of the kMC algorithm and stored in the ``rates_matrix`` array and the ``rates`` arrays -contains simply a set of "default" rate constant values. These values -can optionally (but not necessarily) be used to help with the -calculation of the rates. +In the ``otf`` backend, rate constants are obtained on-the-fly during the execution of the KMC +algorithm. They are stored in the ``rates_matrix`` array and the ``rates`` array contains simply a +set of `default` rate constant values. These values can optionally (but not necessarily) be used +to help with the calculation of the rates. ``lattice`` ^^^^^^^^^^^ -- Dimension: 1 -- Type: int -- Size : ``volume`` +- Dimension: 1 +- Type: int +- Size : ``volume`` -This array contains the state of the lattice, i.e. which species sits on -each site. +This array contains the state of the lattice, i.e., which species sits on each site. ``nr_of_sites`` ^^^^^^^^^^^^^^^ -- Dimensions: 1 -- Type: int -- Size: ``nr_of_proc`` +- Dimension: 1 +- Type: int +- Size: ``nr_of_proc`` -This array keeps track of the number of currently active events -associated to each process, i.e. it holds the number of different sites -in which a given process can be executed. +This array keeps track of the number of currently active events associated to each process, i.e., +it holds the number of different sites in which a given process can be executed. ``accum_rates`` ^^^^^^^^^^^^^^^ -- Dimensions: 1 -- Type: float -- Size: ``nr_of_proc`` +- Dimension: 1 +- Type: float +- Size: ``nr_of_proc`` -This array is used to store partial sums of rate constants, ordered -according to process index. In ``local_smart`` and ``lat_int``, thanks -to the fact that all copies of a process have an equal rate constant, -the values of this array can be calculated according to - -.. math:: \text{\texttt{accum\_rates(i)}} = \sum_{j=1}^{\text{\texttt{i}}} \text{\texttt{rates(j)}} \, * \, \text{\texttt{nr\_of\_sites(j)}} - :label: accum-rates-summation - -In ``otf`` rate constants for a given process are different for a given -site. Therefore, evaluation is more involved, namely +This array is used to store partial sums of rate constants ordered according to process index. In +``local_smart`` and ``lat_int``, thanks to the fact that all copies of a process have an equal +rate constant, the values of this array can be calculated according to .. math:: + \mathrm{accum\_rates}(i) = \sum_{j=1}^{i} \mathrm{rates}(j) \cdot \mathrm{nr\_of\_sites}(j) + :name: accum-rates-summation +In ``otf`` rate constants for a given process can be different for a given site. Therefore, +evaluation is more involved, namely - \text{\texttt{accum\_rates(i)}} = \sum_{j=1}^{\text{\texttt{i}}} \sum_{k=1}^{ - \texttt{nr\_of\_sites(j)}} \text{\texttt{rates\_matrix(j, k)}} +.. math:: + \mathrm{accum\_rates}(i) = \sum_{j=1}^{i} \sum_{k=1}^{\mathrm{nr\_of\_sites}(j)} + \mathrm{rates\_matrix}(j, k) -In all backends, the contents of ``accum_rates`` are reevaluated every -kMC step. +In all backends, the contents of ``accum_rates`` are re-evaluated in every KMC step. ``avail_sites`` ^^^^^^^^^^^^^^^ -- Dimensions: 3 -- Type: int -- Size: ``nr_of_proc * volume * 2`` - -This is arguably the most important bookkeeping array for kmos3, which -keeps track of which processes can be executed each sites on the -lattice, i.e. keeps track of all active events. To accelerate the update -time of these arrays (see :ref:`here <updating-avail-sites>`), the -information this array contains is duplicated. In practice, -``avail_sites`` can be considered as two 2D arrays of size -``nr_of_proc * volume``. - -Each row in ``avail_sites(:, :, 1)`` correspond to a process, and -contains a list of the indices for the sites in which said process can -occur according to the current state of the lattice, i.e. a list of the -sites with active events associated to this process. Each site index -appears at most once on each row. This array is filled from the right. -This means that the first ``nr_of_sites(i)`` elements of row ``i`` will -be larger than zero and smaller or equal than ``volume``, while the last -``( volume - nr_of_sites(i) )`` elements will all be equal to zero. The -elements of the rows of ``avail_sites( :, :, 1)`` are **not** sorted, -and their order depends on the (stochastic) trajectory the system has -taken. - -The rows on ``avail_sites( :, :, 2)`` function as an index for the rows -of ``avail_sites( :, :, 1)``. Given ``1 <= i <= nr_of_proc`` and -``1 <= j <= volume``, if process ``i`` can occur on site ``j``, then -``avail_sites(i, j, 2) = k``, with ``k >= 1`` and such that -``avail_sites(i, k, 1) = j``. Conversely, if process ``i`` cannot occur -on site ``j``, then ``avail_sites(i, j, 2) = 0`` and no element in -``avail_sites(i, :, 1)`` will be equal to ``j``. - - -.. figure:: ../img/avail_sites_example.png - :width: 50% - :align: center - - A example of an `avail_sites` array for a model with 5 processes and 10 sites. +- Dimension: 3 +- Type: int +- Size: ``nr_of_proc ⋅ volume ⋅ 2`` + +This is arguably the most important bookkeeping array for kmos3, which keeps track of which +processes can be executed at each site on the lattice, i.e., it keeps track of all active events. +To accelerate the update time of this array (see :ref:`updating-avail-sites`), its information is +duplicated. In practice, ``avail_sites`` can be considered as two 2D arrays of size +``nr_of_proc ⋅ volume``. + +Each row in ``avail_sites( :, :, 1)`` correspond to a process, and contains a list of the indices +for the sites in which said process can occur according to the current state of the lattice, i.e., +a list of the sites with active events associated to this process. Each site index appears at most +once in each row. This array is filled from the right. This means that the first +``nr_of_sites(i)`` elements of row ``i`` will be larger than zero and smaller or equal than +``volume``, while the last ``(volume - nr_of_sites(i))`` elements will all be equal to zero. The +elements of the rows of ``avail_sites( :, :, 1)`` are **not** sorted and their order depends on +the (stochastic) trajectory the system has taken. + +The rows on ``avail_sites( :, :, 2)`` function as an index for the rows of +``avail_sites( :, :, 1)``. Given ``1 <= i <= nr_of_proc`` and ``1 <= j <= volume``, if process +``i`` can occur on site ``j``, then ``avail_sites( i, j, 2) = k``, with ``k >= 1`` and such that +``avail_sites( i, k, 1) = j``. Conversely, if process ``i`` cannot occur on site ``j``, then +``avail_sites( i, j, 2) = 0`` and no element in ``avail_sites( i, :, 1)`` will be equal to ``j``. + +.. figure:: img/avail_sites.svg + :width: 100% + :align: center + + An example of ``avail_sites( :, :, 1)`` (left) and ``avail_sites( :, :, 2)`` (right) arrays for + a model with 4 processes and 10 sites. ``procstat`` ^^^^^^^^^^^^ -- Dimensions: 1 -- Type: long int -- Size Total number of processes (``nr_of_proc``) +- Dimension: 1 +- Type: long int +- Size: ``nr_of_proc`` -This array is used to keep track of how many times each process is -executed, i.e. the fundamental result of the kMC simulation. This array -is used by the Python interface to evaluate the turnover frequencies -(TOFs). +This array is used to keep track of how many times each process is executed, i.e., the fundamental +result of the KMC simulation. It is used by the Python interface to evaluate the turnover +frequencies (TOFs). -Additional arrays for the ``otf`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``otf``-Specific Arrays +~~~~~~~~~~~~~~~~~~~~~~~ -The ``otf`` backend uses all the bookkeeping arrays from the other two -backends, but needs in addition the following +The ``otf`` backend uses all the bookkeeping arrays from the other two backends, but additionally +requires the following arrays. ``accum_rates_proc`` ^^^^^^^^^^^^^^^^^^^^ -- Dimension: 1 -- Type: float -- Size: ``volume`` +- Dimension: 1 +- Type: float +- Size: ``volume`` -This array is updated in every kMC step with the accumulated rate for -the process selected for execution. This is necessary because the site -cannot be selected uniformly random from ``avail_sites``, but needs to -be picked with a binary search on this array. +This array is updated in every KMC step with the accumulated rate for the process selected for +execution. This is necessary because the site cannot be selected uniformly random from +``avail_sites``, but needs to be picked with a binary search on this array. ``rates_matrix`` ^^^^^^^^^^^^^^^^ -- Dimension: 2 -- Type: float -- Size: ``nr_of_proc * volume`` +- Dimension: 2 +- Type: float +- Size: ``nr_of_proc ⋅ volume`` -This matrix stores the rate for each current active event. The entries -of this matrix are sorted in the same order as the elements of -``avail_sites(:, :, 1)`` and used to update the ``accum_rates`` array. +This matrix stores the rate for each current active event. The entries of this matrix are sorted +in the same order as the elements of ``avail_sites( :, :, 1)`` and used to update the +``accum_rates`` array. .. _kmc-step: -One kmc step in kmos3 +One KMC Step in kmos3 --------------------- -.. figure:: ../img/step_local_smart.png - :width: 100% - :align: center - - A kMC step using kmos3s ``local_smart`` backend. Subroutines are represented by labeled boxes. The content of a given box summarizes the operations performed by the subroutine or the subroutines called by it. Variables (scalar or arrays) are indicated by gray boxes. An arrow pointing to a variable indicates that a subroutine updates it (or defines it). Arrows pointing to a subroutine indicate that the routine uses the variable. In kmos3, the passing of information occurs both through subroutine arguments and through module-wide shared variables; this distinction is not present in the diagram. - -The main role of the bookkeeping arrays from last section, specially -``avail_sites`` and ``nr_of_sites``, is to make kMC steps execute fast -and without the need to query the full lattice state. The routines -``do_kmc_step`` and ``do_kmc_steps`` from the ``proclist`` module -execute such steps. The diagram above represents the functions called by these -routines. - -During system initialization, the current state of the system is written -into the ``lattice`` array and the ``avail_sites`` and ``nr_of_sites`` -arrays are initialized according to this. With these arrays in sync, it -is possible to evaluate ``accum_rates`` according to eq. :eq:`accum-rates-summation`. With this information, and using two random -numbers :math:`0 < \texttt{ran\_proc}, \texttt{ran\_site} < 1`, the -routine ``base/determine_procsite`` can select the next event to -execute. This subroutine first selects a process according to the -probabilities given by ``accum_rates``. This is achieved by multiplying -the total accumulated rate, i.e. the last element of ``accum_rates``, -times ``ran_proc``. The subroutine ``base/interval_search_real`` -implements a `binary -search <http://en.wikipedia.org/wiki/Binary_search_algorithm>`__ to find -the index ``proc`` such that +``local_smart`` +~~~~~~~~~~~~~~~ + +.. figure:: img/step_local_smart.png + :width: 100% + :align: center + + A KMC step using the ``local_smart`` backend. Subroutines are represented by labeled boxes. + The content of a given box summarizes the operations performed by the subroutine or the + subroutines called by it. Variables (scalar or arrays) are indicated by gray boxes. An arrow + pointing to a variable indicates that a subroutine updates it (or defines it). Arrows pointing + to a subroutine indicate that the routine uses the variable. In kmos3, the passing of + information occurs both through subroutine arguments and through module-wide shared variables; + this distinction is not present in the diagram. + +The main role of the bookkeeping arrays from the last section, specially ``avail_sites`` and +``nr_of_sites``, is to make KMC steps execute fast and without the need to query the full lattice +state. The routines ``do_kmc_step`` and ``do_kmc_steps`` from the ``proclist`` module execute such +steps. The diagram above represents the functions called by these routines. + +During system initialization, the current state of the system is written into the ``lattice`` +array and the ``avail_sites`` and ``nr_of_sites`` arrays are initialized according to this. With +these arrays in sync, it is possible to evaluate ``accum_rates`` according to eq. +:eq:`accum-rates-summation`. With this information, and using two random numbers +:math:`0 < \mathrm{ran\_proc}, \mathrm{ran\_site} < 1`, the routine ``base/determine_procsite`` +can select the next event to execute. This subroutine first selects a process according to the +probabilities given by ``accum_rates``. This is achieved by multiplying the total accumulated +rate, i.e., the last element of ``accum_rates`` times ``ran_proc``. The subroutine +``base/interval_search_real`` implements a `binary search +<https://en.wikipedia.org/wiki/Binary_search#Algorithm>`_ to find the index ``proc`` such that .. math:: - - \texttt{accum\_rates(proc -1)} \le \\ - \texttt{ran\_proc \* accum\_rates(nr\_of\_proc)} \le \\ - \texttt{accum\_rates(proc)}. - -This step scales O(\ :math:`\log` (``nr_of_proc``)). Then, a site is -selected with uniform probability from the (non-zero) items of -``avail_sites(proc,:,1)``. This is valid because all individual events -associated to a given processes share the same rate constant. This way, -we avoid searching through the whole lattice, and we are able to select -a ``site`` at constant time. - -After this, the ``proclist/run_proc_nr`` subroutine is called with -``proc`` and ``site`` as arguments. This function first calls -``base/increment_procstat`` with ``proc`` as argument to keep track of -the times each process is executed. Next, it uses the ``nr2lattice`` -look-up table to transform the *scalar* ``site`` variable into the 4D -representation (see :ref:`lattice.f90 <lattice>`). Finally, this -function calls the methods which actually update the the lattice state -and, consistent with this, the bookkeeping arrays. These are the -``proclist/take_<species>_<layer>_<site>`` and -``proclist/put_<species>_<layer>_<site>`` methods. Given a lattice site, -``take`` methods replace the corresponding species sitting there with -the default species. The put methods do the converse. The set of put and -take routines that need to be executed by each process are directly -obtained from the conditions and actions from the process definition. -These are hard-coded into the ``proclist/run_proc_nr`` routine, -organized in a case-select block for the ``proc`` variable. - -The ``proclist/take_<species>_<layer>_<site>`` and -``proclist/put_<species>_<layer>_<site>`` subroutines are arguably the -most complex of a ``local_smart`` kmos3 model. Their ultimate goal is to -call ``lattice/add_proc`` and/or ``lattice/del_proc`` to update -``avail_sites`` and ``nr_of_sites`` in correspondence with the change in -the lattice they are effecting. To do this they need to query the -current state of the lattice. The structure of these routines is -described :ref:`below <put-take>`. - -The actual update of ``avail_sites`` and ``nr_of_proc`` is done by the -``base/add_proc`` and ``base/del_proc`` functions. Under :ref:`Updating avail_sites <updating-avail-sites>` below, we explain how -these functions make use of the structure of ``avail_sites`` to make -updates take constant time. Once these arrays have been updated, the -bookkeeping arrays are again in sync with the lattice state. Therefore, -it is possible to reevaluate ``accum_rates`` using eq. :eq:`accum-rates-summation` and start the process for the selection of the next step. + \mathrm{accum\_rates}(\mathrm{proc} - 1) \le \\ + \mathrm{ran\_proc} \cdot \mathrm{accum\_rates}(\mathrm{nr\_of\_proc}) \le \\ + \mathrm{accum\_rates}(\mathrm{proc}). + +This step scales \ :math:`\mathcal{O}(\log(`\ ``nr_of_proc``\ :math:`))`. Then, a site is selected +with uniform probability from the (non-zero) items of ``avail_sites( proc, :, 1)``. This is valid +because all individual events associated to a given processes share the same rate constant. This +way, we avoid searching through the whole lattice, and we are able to select a ``site`` at +constant time. + +After this, the ``proclist/run_proc_nr`` subroutine is called with ``proc`` and ``site`` as +arguments. This function first calls ``base/increment_procstat`` with ``proc`` as argument to keep +track of the times each process is executed. Next, it uses the ``nr2lattice`` look-up table to +transform the *scalar* ``site`` variable into the 4D representation (see :ref:`lattice`). Finally, +this function calls the methods which actually update the the lattice state and, consistent with +this, the bookkeeping arrays. These are the ``proclist/take_<species>_<layer>_<site>`` and +``proclist/put_<species>_<layer>_<site>`` methods. Given a lattice site, ``take`` methods replace +the corresponding species sitting there with the default species. The put methods do the converse. +The set of put and take routines that need to be executed by each process are directly obtained +from the conditions and actions from the process definition. These are hard-coded into the +``proclist/run_proc_nr`` routine, organized in a case-select block for the ``proc`` variable. + +The ``proclist/take_<species>_<layer>_<site>`` and ``proclist/put_<species>_<layer>_<site>`` +subroutines are arguably the most complex of a ``local_smart`` kmos3 model. Their ultimate goal is +to call ``lattice/add_proc`` and/or ``lattice/del_proc`` to update ``avail_sites`` and +``nr_of_sites`` in correspondence with the change in the lattice they are effecting. To do this +they need to query the current state of the lattice. The structure of these routines is described +:ref:`below <put-take>`. + +The actual update of ``avail_sites`` and ``nr_of_proc`` is done by the ``base/add_proc`` and +``base/del_proc`` functions. Under :ref:`updating-avail-sites` below, we explain how these +functions make use of the structure of ``avail_sites`` to make updates take constant time. Once +these arrays have been updated, the bookkeeping arrays are again in sync with the lattice state. +Therefore, it is possible to reevaluate ``accum_rates`` using eq. :eq:`accum-rates-summation` and +start the process for the selection of the next step. .. _put-take: -The ``put`` and ``take`` routines +The ``put`` and ``take`` Routines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -These subroutines take care of updating the lattice and keeping the -bookkeeping arrays in sync with it. When the occupation of a given site -changes, some formerly active events need to be deactivated, while some -formerly inactive events need to be activated. Figuring out which those +These subroutines take care of updating the lattice and keeping the bookkeeping arrays in sync +with it. When the occupation of a given site changes, some formerly active events need to be +deactivated, while some formerly inactive events need to be activated. Figuring out which those events are is the main role of the ``put`` and ``take`` routines. -In kmos3, processes are represented by a list of conditions and a list of -actions. An event is active if and only if all the conditions of its -associated process are satisfied. As the put and take routines only look -at the change of an individual site in the lattice, determining which -events need to be turned-off is straightforward: All active events which -have a condition that gets unfulfilled on the site affected by the -put/take routine will be deactivated. This is the first thing put/take -routines do after updating the lattice. - -Deciding which processes need to be activated is more involved. All -inactive events with a condition that gets fulfilled by the effect of -the put/take routine are candidates for activation. However, in this -case, it is necessary to check the lattice state to find out whether or -not such events have all other conditions fulfilled. A straightforward -of accomplishing this is to sequentially look at each event, i.e.: - -:: +In kmos3, processes are represented by a list of conditions and a list of actions. An event is +active if and only if all the conditions of its associated process are satisfied. As the put and +take routines only look at the change of an individual site in the lattice, determining which +events need to be turned off is straightforward: All active events which have a condition that +gets unfulfilled on the site affected by the put/take routine will be deactivated. This is the +first thing put/take routines do after updating the lattice. + +Deciding which processes need to be activated is more involved. All inactive events with a +condition that gets fulfilled by the effect of the put/take routine are candidates for activation. +However, in this case, it is necessary to check the lattice state to find out whether or not such +events have all other conditions fulfilled. A straightforward of accomplishing this is to +sequentially look at each event, i.e.,:: - FOR each candidate event E - TurnOn = True - FOR each condition C of E - IF C is unfulfilled: - TurnOn = False - break - ENDIF - ENDFOR - IF TurnOn is True: - Activate E - ENDIF - ENDFOR - -However, chances are that many of the candidate events will have -conditions on the same site. Therefore, a routine like the above would -query a given lattice site many times for each execution of a put/take -routine. For complex models with many conditions in the processes, this -could become quickly the main computational bottleneck of the -simulation. - -The alternative to this naive approach, is to try to build a decision -tree that queries the lattice state more efficiently. kmos3 generates -such a decision tree using an heuristic algorithm. The main idea behind -it is to group all the sites that would need to be queried and to sort -them by the number of candidate events with conditions on them. A -decision tree is built such that sites are queried on that order, thus -prioritizing the sites that are more likely to reduce the number of -processes that need activation. Such decision trees are implemented as -select-case trees in the put/take routines and typically occupy the bulk -of the code of ``proclist.f90``. A more detailed description on how this -is done is discussed :ref:`below <write-put-take>`. + FOR each candidate event E + TurnOn = True + FOR each condition C of E + IF C is unfulfilled: + TurnOn = False + break + ENDIF + ENDFOR + IF TurnOn is True: + Activate E + ENDIF + ENDFOR + +However, chances are that many of the candidate events will have conditions on the same site. +Therefore, a routine like the above would query a given lattice site many times for each execution +of a put/take routine. For complex models with many conditions in the processes, this could become +quickly the main computational bottleneck of the simulation. + +The alternative to this naive approach, is to try to build a decision tree that queries the +lattice state more efficiently. kmos3 generates such a decision tree using an heuristic algorithm. +The main idea behind it is to group all the sites that would need to be queried and to sort them +by the number of candidate events with conditions on them. A decision tree is built such that +sites are queried on that order, thus prioritizing the sites that are more likely to reduce the +number of processes that need activation. Such decision trees are implemented as select-case trees +in the put/take routines and typically occupy the bulk of the code of ``proclist.f90``. A more +detailed description on how this is done is discussed :ref:`below <write-put-take>`. .. _updating-avail-sites: Updating ``avail_sites`` ~~~~~~~~~~~~~~~~~~~~~~~~ -.. figure:: ../img/add_proc.png - :width: 100% - :align: center - - Adding an process to the =avail_sites= array. Pseudocode for the addition of a process is also indicated. - -The ``avail_sites`` and ``nr_of_sites`` arrays are only updated through -the ``base/add_proc`` and ``base/del_proc`` subroutines, which take a -process index ``proc`` and a site index ``site`` as input arguments. -Adding events is programmatically easier. As the rows of -``avail_sites( :, :, 1)`` are filled from the left, the new event can be -added by changing the first zero item of the corresponding row, i.e. -``avail_sites(proc, nr_of_sites(proc) + 1, 1)``, to ``site`` and -updating ``avail_sites( :, :, 2)`` and ``nr_of_procs`` accordingly. An -example of this procedure is presented in the figure above. - -.. figure:: ../img/del_proc.png - :width: 100% - :align: center - - Deleting an process from =avail_sites= array. Pseudocode for the deletion of a process is also indicated. - - -Deleting an event is slightly more involved, as non-zero elements in -``avail_sites(:, :, 1)`` rows need to remain contiguous and on the left -side of the array. To ensure this, the element that would be deleted -(somewhere in the middle of the array) is updated to the value of the -last non-zero element of the row, which is later deleted. To keep the -arrays in sync, ``avail_sites(. , . , 2)`` is also updated, by updating -the index of the moved site to reflect its new position. Finally, -``avail_sites(site, proc, 2)`` is set to zero. The figure -above shows an example and presents pseudocode for such an update. -Having the information in ``avail_sites(:,:,1)`` duplicated (but -restructures) in ``avail_sites(:,:,2)`` allows these update operations -to be performed in constant time, instead of needing to perform updates -that scale with the system size. - -A kmc step with the ``lat_int`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. figure:: ../img/step_lat_int.png - :width: 100% - :align: center - - A kMC step using kmos3s ``lat_int`` backend. Subroutines are represented by labeled boxes. The content of a given box summarizes the operations performed by the subroutine or the subroutines called by it. Variables (scalar or arrays) are indicated by gray boxes. An arrow pointing to a variable indicates that a subroutine updates it (or defines it). Arrows pointing to a subroutine indicate that the routine uses the variable. In kmos3, the passing of information occurs both through subroutine arguments and through module-wide shared variables; this distinction is not present in the diagram. - -The process of executing a kMC step with the ``lat_int`` backend is very -similar as that of the ``local_smart`` backend. In particular, the way -``avail_sites``, ``nr_of_procs`` and ``accum_rates`` are updated, as -well as the selection of process and site indices ``proc`` and ``site`` -that will be executed is identical. The only difference exists withing -the call of the ``proclist/run_proc_nr`` routine, as the routines for -finding which events need to be (de)activated are implemented -differently. - -In ``lat_int``, ``proclist/proc_run_nr`` does not call ``put`` and -``take`` subroutines (which do not exist in the ``lat_int`` code-base), -but calls subroutines specific to each lateral interaction group -``run_proc_<lat_int_nr>/run_proc_<lat_int_group>``. They do not directly -implement a decision tree, but rely on the -``nli_<lat_int_nr>/nli_<lat_int_group>`` functions. - -The ``nli_<lat_int_nr>/nli_<lat_int_group>`` perform the analysis of the -lattice state. They take a site on the lattice and look at the -conditions of the elements of the corresponding lateral interaction -event group. Using this information, they return the index of the -process (within the lateral interaction group) which can currently be -executed. If none can, it returns 0. - -A ``proclist/run_proc_<lat_int_group>`` routine first calls ``del_proc`` -for each lateral interaction event group which has a condition -(including bystanders) affected by the changes in the lattice. The -argument for ``del_proc`` will be the output of the corresponding -``nli_*`` functions, which will figure out which of the events is -currently active (and can thus be deleted). After deleting processes, -the lattice is updated according to the actions of the lateral -interaction group. Once the new system state is set, ``add_proc`` is -called for the same processes that ``del_proc`` was called, again using -``nli_*`` as argument. This way, the correct processes associated to the -new state of the lattice will be activated. - -This method works because of a slight, but important, difference in -``base/add_proc`` and ``base/del_proc`` between ``lat_int`` and -``local_smart``. In ``local_smart``, calling one of these functions with -an argument ``proc=0`` would lead to a program failure. In ``lat_int``, -this leads to the functions simply not adding or deleting any process to -``avail_sites``. - -A kmc step with the ``otf`` backend -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. figure:: ../img/step_otf.png - :width: 100% - :align: center - - A kMC step in with the ``otf`` backend. Subroutines are represented by labeled boxed, located inside the box corresponding to the calling function. Variables (scalar or arrays) are indicated by gray boxes. An arrow pointing to a variable indicates that a subroutine updates it (or defines it). An arrows pointing to a subroutine indicates that the routine uses the variable or the output of the function. The passing of information occurs both through subroutine arguments and through module-wide shared variables; this distinction is not present in the diagram. +.. figure:: img/add_proc.svg + :width: 100% + :align: center - -As expected, the algorithm for running a kMC step with ``otf`` differs -considerably from ``local_smart`` and ``lat_int``. Firstly, the update -of the ``accum_rates`` is more involved, as different copies of the -processes do not share a single rate constant. For this reason, it is -necessary to use the ``rates_matrix`` array, which contains the current -rate constants for all active events. The ``accum_rates`` array is -updated according to + Adding site 6 to process 1 in the ``avail_sites( :, :, 1)`` (left) and ``avail_sites( :, :, 2)`` + (right) arrays. + +The corresponding pseudocode looks like this: .. math:: + \mathrm{nr\_of\_sites}(\mathrm{proc}) \leftarrow \mathrm{nr\_of\_sites}(\mathrm{proc}) \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{nr\_of\_sites}(\mathrm{proc}), 1) \leftarrow + \mathrm{site} \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{site}, 2) \leftarrow + \mathrm{nr\_of\_sites}(\mathrm{proc}) - \text{\texttt{accum\_rates(i)}} = \sum_{j=1}^{\text{\texttt{i}}} \sum_{k=1}^{ - \texttt{nr\_of\_sites(j)}} \text{\texttt{rates\_matrix(j, k)}} +The ``avail_sites`` and ``nr_of_sites`` arrays are only updated through the ``base/add_proc`` and +``base/del_proc`` subroutines, which take a process index ``proc`` and a site index ``site`` as +input arguments. Adding events is programmatically easier. As the rows of +``avail_sites( :, :, 1)`` are filled from the left, the new event can be added by changing the +first zero item of the corresponding row, i.e., ``avail_sites(proc, nr_of_sites(proc) + 1, 1)``, +to ``site`` and updating ``avail_sites( :, :, 2)`` and ``nr_of_procs`` accordingly. An example of +this procedure is presented in the figure and pseudocode above. -The computational time to perform this summation now scales as -:math:`O \left( \texttt{nr\_of\_procs} \times \texttt{volume} \right)`, -instead of the :math:`O \left( \texttt{nr\_of\_procs}\right)` for -``local_smart``. Though this might seem like a disadvantage, it is -important to notice that the value of ``nr_of_procs`` in ``otf`` can be -smaller (potentially by several orders of magnitude) than in -``local_smart``, and thus ``otf`` can outperform ``local_small`` for -complex models (many lateral interactions) when using sufficiently small -simulation sizes (small ``volume``). - -Once ``accum_rates`` is evaluated, ``base/determine_procsite`` proceeds -to find the process index ``proc`` of the event to be executed. This is -achieved by performing a binary search on ``accum_rates``, exactly like -in ``local_smart`` or ``lat_int``. To select the ``site`` index, it is -first necessary to evaluate +.. figure:: img/del_proc.svg + :width: 100% + :align: center + + Deleting site 5 from process 3 in the ``avail_sites( :, :, 1)`` (left) and + ``avail_sites( :, :, 2)`` (right) arrays. + +The corresponding pseudocode looks like this: .. math:: + \mathrm{del\_index} = \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{site}, 2) \\ + \mathrm{move\_site} = \mathrm{avail\_sites}(\mathrm{proc}, + \mathrm{nr\_of\_sites}(\mathrm{proc}), 1) \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{del\_index}, 1) \leftarrow \mathrm{move\_site} \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{nr\_of\_sites}(\mathrm{proc}), 1) \leftarrow 0 \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{move\_site}, 2) \leftarrow \mathrm{del\_index} \\ + \mathrm{avail\_sites}(\mathrm{proc}, \mathrm{site}, 2) \leftarrow 0 \\ + \mathrm{nr\_of\_sites}(\mathrm{proc}) \leftarrow \mathrm{nr\_of\_sites}(\mathrm{proc}) - 1 + +Deleting an event is slightly more involved, as non-zero elements in ``avail_sites( :, :, 1)`` +rows need to remain contiguous and on the left side of the array. To ensure this, the element that +would be deleted (somewhere in the middle of the array) is updated to the value of the last +non-zero element of the row, which is later deleted. To keep the arrays in sync, +``avail_sites( :, :, 2)`` is also updated, by updating the index of the moved site to reflect its +new position. Finally, ``avail_sites( site, proc, 2)`` is set to zero. The figure and pseudocode +above shows an example for such an update. Having the information in ``avail_sites( :, :, 1)`` +duplicated (but restructured) in ``avail_sites( :, :, 2)`` allows these update operations to be +performed in constant time, instead of needing to perform updates that scale with the system size. - \texttt{accum\_rates\_proc}(i) = \sum_{k=1}^{ - i} \text{\texttt{rates\_matrix(proc, k)}}, +``lat_int`` +~~~~~~~~~~~ -i.e. the partial sums of rates for the different events associated to -process ``proc``. Then a second binary search can be performed on -``accum_rates_proc`` to find ``s`` such that +.. figure:: img/step_lat_int.png + :width: 100% + :align: center + + A KMC step using the ``lat_int`` backend. Subroutines are represented by labeled boxes. The + content of a given box summarizes the operations performed by the subroutine or the subroutines + called by it. Variables (scalar or arrays) are indicated by gray boxes. An arrow pointing to a + variable indicates that a subroutine updates it (or defines it). Arrows pointing to a subroutine + indicate that the routine uses the variable. In kmos3, the passing of information occurs both + through subroutine arguments and through module-wide shared variables; this distinction is not + present in the diagram. + +The process of executing a KMC step with the ``lat_int`` backend is very similar as that of the +``local_smart`` backend. In particular, the way ``avail_sites``, ``nr_of_procs`` and +``accum_rates`` are updated, as well as the selection of process and site indices ``proc`` and +``site`` that will be executed is identical. The only difference is the call of the +``proclist/run_proc_nr`` routine, as the routines for finding which events need to be +(de)activated are implemented differently. + +In ``lat_int``, ``proclist/proc_run_nr`` does not call ``put`` and ``take`` subroutines (which do +not exist in the ``lat_int`` code-base), but calls subroutines specific to each lateral +interaction group ``run_proc_<lat_int_nr>/run_proc_<lat_int_group>``. They do not directly +implement a decision tree, but rely on the ``nli_<lat_int_nr>/nli_<lat_int_group>`` functions. + +The ``nli_<lat_int_nr>/nli_<lat_int_group>`` perform the analysis of the lattice state. They take +a site on the lattice and look at the conditions of the elements of the corresponding lateral +interaction event group. Using this information, they return the index of the process (within the +lateral interaction group), which can currently be executed. If none can, it returns 0. + +A ``proclist/run_proc_<lat_int_group>`` routine first calls ``del_proc`` for each lateral +interaction event group, which has a condition (including bystanders) affected by the changes in +the lattice. The argument for ``del_proc`` will be the output of the corresponding ``nli_*`` +functions, which will figure out which of the events is currently active (and can thus be +deleted). After deleting processes, the lattice is updated according to the actions of the lateral +interaction group. Once the new system state is set, ``add_proc`` is called for the same processes +that ``del_proc`` was called, again using ``nli_*`` as argument. This way, the correct processes +associated to the new state of the lattice will be activated. + +This method works because of a slight, but important, difference in ``base/add_proc`` and +``base/del_proc`` between ``lat_int`` and ``local_smart``. In ``local_smart``, calling one of +these functions with an argument ``proc=0`` would lead to a program failure. In ``lat_int``, this +leads to the functions simply not adding or deleting any process to ``avail_sites``. + +``otf`` +~~~~~~~ + +.. figure:: img/step_otf.png + :width: 100% + :align: center + + A KMC step using the ``otf`` backend. Subroutines are represented by labeled boxed, located + inside the box corresponding to the calling function. Variables (scalar or arrays) are indicated + by gray boxes. An arrow pointing to a variable indicates that a subroutine updates it (or + defines it). An arrows pointing to a subroutine indicates that the routine uses the variable or + the output of the function. The passing of information occurs both through subroutine arguments + and through module-wide shared variables; this distinction is not present in the diagram. + +As expected, the algorithm for running a KMC step with ``otf`` differs considerably from +``local_smart`` and ``lat_int``. Firstly, the update of the ``accum_rates`` is more involved, as +different copies of the processes do not share a single rate constant. For this reason, it is +necessary to use the ``rates_matrix`` array, which contains the current rate constants for all +active events. The ``accum_rates`` array is updated according to .. math:: + \mathrm{accum\_rates}(i) = \sum_{j=1}^{i} \sum_{k=1}^{\mathrm{nr\_of\_sites}(j)} + \mathrm{rates\_matrix}(j, k). - \texttt{accum\_rates\_proc(s -1)} \le \\ - \texttt{ran\_site \* accum\_rates\_proc(nr\_of\_sites(proc))} \le \\ - \texttt{accum\_rates\_proc(s)}. - -Therefore, ``s`` corresponds to the index of the selected site according to -the current order of the ``avail_sites(:, :, 1)`` array. The site index -as ``site = avail_sites(proc, s, 1)``. - -The process of updating the lattice and the bookkeeping arrays is also -rather different. As in the other backends, first -``proclist/run_proc_nr`` is called with ``proc`` and ``site`` as -arguments. Besides calling ``base/increment_procstat``, it is -responsible for calling the adequate -``run_proc_<proc_nr>/run_proc_<proc_name>`` routine. There is one of -such routine for each process and they play the same role as the ``put`` -and ``take`` routines in ``local_smart``. The main difference is that -these routines are built for executing full processes instead of -elemental changes to individual sites. These functions need to look into -the state of lattice and determine: - -a) which events get one or more of their conditions unfulfilled by the executed event -b) which events get one or more of their condition fulfilled by the executed event and also have all other conditions fulfilled -c) which events are affected by a change in one of their bystanders - -For events in (a), ``run_proc_<proc_nr>/run_proc_<proc_name>`` run -``lattice/del_proc``. For events in (b) and (c), rate constants are -needed. This is done using functions from ``proclist_pars`` module, as -described below. With the know rate constants, -``run_proc_<proc_nr>/run_proc_<proc_name>`` calls ``lattice/add_proc`` -for each event in (b) and ``lattice/update_rates_matrix`` for each event -in (c). In ``otf``, ``lattice/add_proc`` and ``base/add_proc`` take a -floating point argument for the rate constant in addition to the usual -``site`` and ``proc`` arguments. More details on the structure of these -routines will be given in the section on the translation algorithm. - -Rate constants are evaluated using the -``proclist_params/gr_<proc_name>``. These functions look at the current -state of the lattice to evaluate a integer array ``nr_vars`` which -encodes the number of the different types of interactions that are -present. This is used as input for the corresponding -``proclist_pars/rate_<proc_name>`` which implements the user defined -rate expression. These can include user-defined parameters, which are -encoded in FORTRAN with the ``userpar`` array in the ``proclist_pars`` -module. - -After ``proclist/run_proc_nr`` executes, the ``lattice``, -``avail_sites``, ``nr_of_sites`` and ``rates_matrix`` are in sync again, -and the next kMC step can start with the evaluation of ``accum_rates``. - -The code generation routines ----------------------------- +The computational time to perform this summation now scales as +:math:`\mathcal{O}(\mathrm{nr\_of\_procs} \cdot \mathrm{volume})`, instead of the +:math:`\mathcal{O}(\mathrm{nr\_of\_procs})` for ``local_smart``. Though this might seem like a +disadvantage, it is important to notice that the value of ``nr_of_procs`` in ``otf`` can be +smaller (potentially by several orders of magnitude) than in ``local_smart`` and thus ``otf`` can +outperform ``local_smart`` for complex models (many lateral interactions) when using sufficiently +small simulation sizes (small ``volume``). + +Once ``accum_rates`` is evaluated, ``base/determine_procsite`` proceeds to find the process index +``proc`` of the event to be executed. This is achieved by performing a binary search on +``accum_rates``, exactly like in ``local_smart`` or ``lat_int``. To select the ``site`` index, it +is first necessary to evaluate -.. _fig-export-proc: +.. math:: + \mathrm{accum\_rates\_proc}(i) = \sum_{k=1}^{i} \mathrm{rates\_matrix}(\mathrm{proc}, k), -.. figure:: ../img/export_procedure.png - :width: 60% - :align: center +i.e., the partial sums of rates for the different events associated to process ``proc``. Then, a +second binary search can be performed on ``accum_rates_proc`` to find ``s`` such that - Routines called during the export of a kmos3 model +.. math:: + \mathrm{accum\_rates\_proc}(s-1) \le \\ + \mathrm{ran\_site} \cdot \mathrm{accum\_rates\_proc}(\mathrm{nr\_of\_sites}(\mathrm{proc})) + \le \\ + \mathrm{accum\_rates\_proc}(s). + +Therefore, ``s`` corresponds to the index of the selected site according to the current order of +the ``avail_sites( :, :, 1)`` array. The site index as ``site = avail_sites( proc, s, 1)``. + +The process of updating the lattice and the bookkeeping arrays is also rather different. As in the +other backends, first ``proclist/run_proc_nr`` is called with ``proc`` and ``site`` as arguments. +Besides calling ``base/increment_procstat``, it is responsible for calling the adequate +``run_proc_<proc_nr>/run_proc_<proc_name>`` routine. There is one of such routine for each process +and they play the same role as the ``put`` and ``take`` routines in ``local_smart``. The main +difference is that these routines are built for executing full processes instead of elemental +changes to individual sites. These functions need to look into the state of lattice and determine + +a) which events get one or more of their conditions unfulfilled by the executed event, +b) which events get one or more of their conditions fulfilled by the executed event and also have + all other conditions fulfilled, +c) which events are affected by a change in one of their bystanders. +For events in a., ``run_proc_<proc_nr>/run_proc_<proc_name>`` run ``lattice/del_proc``. For events +in b. and c., rate constants are needed. This is done using functions from the ``proclist_pars`` +module, as described below. With the known rate constants, +``run_proc_<proc_nr>/run_proc_<proc_name>`` calls ``lattice/add_proc`` for each event in b. and +``lattice/update_rates_matrix`` for each event in c. In ``otf``, ``lattice/add_proc`` and +``base/add_proc`` take a floating point argument for the rate constant in addition to the usual +``site`` and ``proc`` arguments. More details on the structure of these routines will be given in +the section on the translation algorithm. + +Rate constants are evaluated using the ``proclist_params/gr_<proc_name>``. These functions look at +the current state of the lattice to evaluate a integer array ``nr_vars``, which encodes the number +of the different types of interactions that are present. This is used as input for the +corresponding ``proclist_pars/rate_<proc_name>``, which implements the user defined rate +expressions. These can include user-defined parameters, which are encoded in Fortran with the +``userpar`` array in the ``proclist_pars`` module. + +After ``proclist/run_proc_nr`` executes, the ``lattice``, ``avail_sites``, ``nr_of_sites``, and +``rates_matrix`` are in sync again, and the next KMC step can start with the evaluation of +``accum_rates``. + +The Code Generation Routines +---------------------------- -As most of the source code described in the previous sections is -generated automatically, it is crucial to also understand how this -works. Code generation are contained in the ``kmos3.io`` Python -submodule. The normal way to use this module is through the command -line, i.e. invoking the ``kmos3 export`` command. The figure :ref:`above <fig-export-proc>` shows the subroutines/functions which are called -when this is done. The command line call itself is handled by the -``kmos3.cli`` submodule. Furthermore, the export procedure relies on the -classes from the ``kmos3.types`` submodule, which define the abstract -representation of the kMC model. Specifically, a model definition from -an ``xml`` or ``ini`` file into a ``kmos3.types.Project`` object. The -rest is done with the help of an instance of the -``kmos3.io.ProcListWriter`` class, which contains several methods that -write source code. Specifically, Fortran source code is generated in one -of three ways: - -- files are copied directly from kmos3s installation -- code is generated with the help of a template file, which is - processed by the ``kmos3.io.ProcListWriter.write_template`` method -- code is written from scratch by one of the several - ``kmos3.io.ProcListWriter.write_proclist_*`` methods. - -The format of the template files and how -``kmos3.io.ProcListWriter.write_template`` works is explained in next -section. The ``kmos3.io.ProcListWriter.write_proclist`` method calls -several other methods in charge of building different parts of the -source code, these methods are named according to the pattern -``kmos3.io.ProcListWriter.write_proclist_*``. Exactly which of these -methods are called depends on the backend being used. Some of such -functions are specific to a certain backend, while other work for more -than one backend. This is detailed under :ref:`The write_proclist method <sec-write-proclist>`. - -The source file template -~~~~~~~~~~~~~~~~~~~~~~~~ - -Template files are located in the ``kmos3/fortran_src/`` folder of the -kmos3s source code and have the ``mpy`` extension. Each line of these -files contains either - -- Python source code or -- template text prefixed with ``#@`` - -``kmos3.utils.evaluate_template`` processes these files to convert them -into valid python code. The Python lines are left unchanged, while the -template lines are replaced by code adding the content of the line (i.e. -things after the ``#@``) to a string variable ``result``. Template lines -can contain placeholders, included as a variable name enclosed in curly -brackets ( ``{`` and ``}`` ). If those variable names are found within -the local variables of the corresponding -``kmos3.utils.evaluate_templates`` call, the placeholders are replaced by -the variable values. The ``kmos3.utils.evaluate_template`` method accepts -`arbitrary keyword -arguments <https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments>`__. -In addition, the ``kmos3.io.ProcListWriter.write_template`` is passed the -current instance of the ``ProcListWriter`` class as ``self``, the loaded -kMC model information (i.e. the ``kmos3.types.Project``) instance as -``data`` and an ``options`` dictionary with additional settings as +.. code-block:: bash + :caption: Routines called during the export of a kmos3 model. + :name: export-proc + + $ kmos3 export model.xml + ├── kmos3.cli.main + │ ├── kmos3.types.Project.import_file + │ └── kmos3.io.export_source + │ ├── kmos3.io.ProcListWriter.write_template + │ ├── kmos3.io.ProcListWriter.write_proclist + │ └── kmos3.io.ProcListWriter.write_settings + └── kmos3.utils.build + └── numpy.f2py.main + +As most of the source code described in the previous sections is generated automatically, it is +crucial to also understand how this works. Code generation is contained in the ``kmos3.io`` Python +submodule. The normal way to use this module is through the command line, i.e., invoking the +``kmos3 export`` command. The scheme :ref:`above <export-proc>` shows the subroutines/functions, +which are called when this is done. The command line call itself is handled by the ``kmos3.cli`` +submodule. Furthermore, the export procedure relies on the classes from the ``kmos3.types`` +submodule, which define the abstract representation of the KMC model. Specifically, a model +definition from an ``xml`` or ``ini`` file into a ``kmos3.types.Project`` object. The rest is done +with the help of an instance of the ``kmos3.io.ProcListWriter`` class, which contains several +methods that write source code. Specifically, Fortran source code is generated in one of three +ways: + +- iles are copied directly from the kmos3 installation +- code is generated with the help of a template file, which is processed by the + ``kmos3.io.ProcListWriter.write_template`` method +- code is written from scratch by one of the several ``kmos3.io.ProcListWriter.write_proclist_*`` + methods + +The format of the template files and how ``kmos3.io.ProcListWriter.write_template`` works is +explained in the next section. The ``kmos3.io.ProcListWriter.write_proclist`` method calls several +other methods in charge of building different parts of the source code. These methods are named +according to the pattern ``kmos3.io.ProcListWriter.write_proclist_*``. Which of these methods are +called exactly depends on the backend being used. Some of such functions are specific to a certain +backend, while others used for more than one backend. This is detailed in +:ref:`sec-write-proclist`. + +Source File Templates +~~~~~~~~~~~~~~~~~~~~~ + +Template files are located in the ``kmos3/fortran_src/`` folder of the kmos3 source code and have +the ``mpy`` extension. Each line of these files contains either + +- Python source code or +- template text prefixed with ``#@``. + +``kmos3.utils.evaluate_template`` processes these files to convert them into valid Python code. +The Python lines are left unchanged, while the template lines are replaced by code adding the +content of the line (i.e., things after the ``#@``) to a string variable ``result``. Template +lines can contain placeholders, included as a variable name enclosed in curly brackets ( ``{`` and +``}`` ). If those variable names are found within the local variables of the corresponding +``kmos3.utils.evaluate_templates`` call, the placeholders are replaced by the variable values. The +``kmos3.utils.evaluate_template`` method accepts `arbitrary keyword arguments +<https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments>`_. In addition, the +``kmos3.io.ProcListWriter.write_template`` is passed the current instance of the +``ProcListWriter`` class as ``self``, the loaded KMC model instance (i.e., the +``kmos3.types.Project``) as ``data``, and an ``options`` dictionary with additional settings as ``options``. -With such template files it is possible to include some programmatically -dependence on the model characteristics and other settings to an -otherwise mostly static file. For example, in the -``proclist_constants.mpy`` template, the following text - -:: +With such template files it is possible to include some programmatically dependence on the model +characteristics and other settings to an otherwise mostly static file. For example, in the +``proclist_constants.mpy`` template, the following lines :: - for i, process in enumerate(self.data.process_list): - ip1 = i + 1 - #@ integer(kind=iint), parameter, public :: {process.name} = {ip1} + for i, process in enumerate(self.data.process_list): + ip1 = i + 1 + #@ integer(kind=iint), parameter, public :: {process.name} = {ip1} -is used to hard-coded the name constants used throughout the code to -reference a process' index. +hard-code the names and corresponding assigned indices used to reference processes throughout the +code. .. _sec-write-proclist: -The ``write_proclist`` method -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. figure:: ../img/write_proclist.png - :width: 75% - :align: center - - Routines used to write ``proclist`` and associated modules for the different backends. +``write_proclist`` +~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + :caption: Routines used to write ``proclist`` and associated modules for the different backends. + + ProcListWriter.write_proclist + ├── if code_generator = 'local_smart' + │ ├── ProcListWriter.write_proclist_generic_part + │ | ├── ProcListWriter.write_proclist_constants + │ | └── ProcListWriter.write_proclist_generic_subroutines + │ ├── ProcListWriter.write_proclist_run_proc_nr_smart + │ ├── ProcListWriter.write_proclist_put_take + │ ├── ProcListWriter.write_proclist_touchup + │ ├── ProcListWriter.write_proclist_multilattice + │ └── ProcListWriter.write_proclist_end + ├── if code_generator = 'lat_int' + │ ├── ProcListWriter.write_proclist_constants + │ ├── ProcListWriter.write_proclist_lat_int + │ | ├── ProcListWriter._get_lat_int_groups + │ | ├── ProcListWriter.write_proclist_lat_int_run_proc_nr + │ | ├── ProcListWriter.write_proclist_lat_int_touchup + │ | ├── ProcListWriter.write_proclist_generic_subroutines + │ | ├── ProcListWriter.write_proclist_lat_int_run_proc + │ | └── ProcListWriter.write_proclist_lat_int_run_nli_casetree + │ └── ProcListWriter.write_proclist_end + └── if code_generator = 'otf' + ├── ProcListWriter.write_proclist_pars_otf + ├── ProcListWriter.write_proclist_otf + | ├── ProcListWriter.write_proclist_generic_subroutines + | ├── ProcListWriter.write_proclist_touchup_otf + | ├── ProcListWriter.write_proclist_run_proc_nr_otf + | └── ProcListWriter.write_proclist_run_proc_name_otf + └── ProcListWriter.write_proclist_end -The scheme above shows the methods called by -``kmos3.io.ProcListWriter.write_proclist`` to write ``proclist.f90`` and, -for ``lat_int`` and ``otf``, related files (``proclist_constants.f90``, +The scheme above shows the methods called by ``kmos3.io.ProcListWriter.write_proclist`` to write +``proclist.f90`` and, for ``lat_int`` and ``otf``, related files (``proclist_constants.f90``, ``proclist_pars.f90``, ``run_proc_*.f90``, ``nli_*.f90``). All these -``kmos3.io.Proclist.write_proclist_*`` methods take an ``out`` argument -which is a `file -object <https://docs.python.org/2/library/stdtypes.html#file-objects>`__ -to which the code is to be written and most take a ``data`` argument -which is an instance of ``kmos3.types.Project`` containing the abstract -kMC model definition. Many of them also take a ``code_generator`` -keyword argument with the backend's name. In what follows we briefly -describe each of the individual methods. For clarity, they have been -categorized according to the backend by which they are used. In cases in -which the same routine is called to more than one backend, the -description is presented only once. - -Methods called to build ``local_smart`` source code +``kmos3.io.Proclist.write_proclist_*`` methods take an ``out`` argument, which is a `file object +<https://docs.python.org/3/library/stdtypes.html#file-objects>`_ to which the code is to be +written and most take a ``data`` argument, which is an instance of ``kmos3.types.Project`` +containing the abstract KMC model definition. Many of them also take a ``code_generator`` keyword +argument with the backend's name. In what follows, we briefly describe each of the individual +methods. For clarity, they have been categorized according to the backend by which they are used. +In cases for which the same routine is called in more than one backend, the description is +presented only once. + +Methods Called to Build ``local_smart`` Source Code ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``write_proclist_generic_part`` ''''''''''''''''''''''''''''''' -This routine is only used by the ``local_smart`` backend. "Generic part" -refers to the auxiliary constants defined in ``proclist`` (which exist -in a separate file in ``lat_int`` and ``otf``) and the functions whose -code does not depend on the process details (e.g. -``proclist/do_kmc_steps``). +This routine is only used by the ``local_smart`` backend. `Generic part` refers to the auxiliary +constants defined in ``proclist`` (which exist in a separate file in ``lat_int`` and ``otf``) and +the functions whose code does not depend on the process details (e.g., ``proclist/do_kmc_steps``). ``write_proclist_constants`` '''''''''''''''''''''''''''' -Uses the ``proclist_constants.mpy`` template to generate code defining -named constants for the indices of each process and each species on the -model. In ``local_smart`` this is added at the top of the -``proclist.f90`` file; in ``lat_int`` and ``otf`` this is included -separately as the ``proclist_constants.f90`` file. +Uses the ``proclist_constants.mpy`` template to generate code defining named constants for the +indices of each process and each species on the model. In ``local_smart`` this is added at the top +of the ``proclist.f90`` file; in ``lat_int`` and ``otf`` this is included separately as the +``proclist_constants.f90`` file. ``write_proclist_generic_subroutines`` '''''''''''''''''''''''''''''''''''''' -Uses the ``proclist_generic_subroutines.mpy`` template to write several -routines not directly related with the tree search of process update, -namely: ``do_kmc_steps``, ``do_kmc_step``, ``get_next_kmc_step``, -``get_occupation``, ``init``, ``initialize_state`` and (only for -``otf``) ``recalculate_rates_matrix``. +Uses the ``proclist_generic_subroutines.mpy`` template to write several routines not directly +related with the tree search of process updates, namely: ``do_kmc_steps``, ``do_kmc_step``, +``get_next_kmc_step``, ``get_occupation``, ``init``, ``initialize_state``, and (only for ``otf``) +``recalculate_rates_matrix``. .. _sec-write-run-proc-nr-smart: ``write_proclist_run_proc_nr_smart`` '''''''''''''''''''''''''''''''''''' -Writes the ``proclist/run_proc_nr`` function, which calls ``put`` and -``take`` routines according to the process selected by -``base/determine_procsite``. This is basically a nested for-loop, first -over the processes and then over the actions of such process. The only -tricky part is to input correctly the relative coordinate for which the -``take`` and ``put`` routines need to be called. This is done with the -help of the ``kmos3.types.Coord.radd_ff`` method. +Writes the ``proclist/run_proc_nr`` function, which calls ``put`` and ``take`` routines according +to the process selected by ``base/determine_procsite``. This is basically a nested for-loop, first +over the processes and then over the actions of such process. The only tricky part is to correctly +input the relative coordinate for which the ``take`` and ``put`` routines need to be called. This +is done with the help of the ``kmos3.types.Coord.radd_ff`` method. .. _write-put-take: ``write_proclist_put_take`` ''''''''''''''''''''''''''' -This is the most complex part of the ``local_smart`` code generator, in -charge of writing a ``put`` and a ``take`` routine for each combination -of site type and species in the model (except for the default species). -These routines need to decide which events to activate or deactivate +This is the most complex part of the ``local_smart`` code generator, in charge of writing a +``put`` and a ``take`` routine for each combination of site type and species in the model (except +for the default species). These routines need to decide which events to activate or deactivate given an specific change in the lattice state. -The ``write_proclist_put_take`` is organized as several nested ``for`` -loops. The outermost goes through each species in the model, the -following through each layer and site type, and the next through the two -possibilities, ``put`` and ``take``. At this point, a specific -``put_<species>_<layer>_<site>`` or ``take_<species>_<layer>_<site>`` -subroutine is being written. - -For each of these routines, it is necessary to check which events -(located relative to the affected site) can potentially be activated or -deactivated by the operation being executed. This is done with further -nested loops, going through each process and then through each condition -of such process. - -If a fulfilling match is found (i.e. the species and site type of the -condition matches the site and species of a ``put`` routine or there is -a condition associated to the default species on the site affected by a -``take`` routine) a *marker* to the corresponding process is stored in -the ``enabled_procs`` list. This marker is a nested tuple with the -following structure: - -- first a list of ``kmos3.types.ConditionAction`` objects (see below) -- then a tuple containing - - - the name of the process - - the relative executing coordinate of the process with respect to - the matching condition - - a constant True value. - -The list of ``ConditionAction`` objects contain an entry for each of the -conditions of the given process, **except** for the condition that -matched. The species are the same, but the coordinates of the these new -``ConditionAction`` objects are *relative* to the the coordinate of the -matching condition. This way, we gain access to the position of the -conditions of the events that can potentially be activated by the -``put`` or ``take`` routine relative to the position that is being -affected in the surface. Note that potentially more than one marker -could be added to the list for a given process. This would correspond to -the possibility of different events associated to the same process being -activated. - -If an unfulfilling match is found, a tuple is added to the -``disabled_procs`` list. This tuple contains - -- the process object and -- the relative position of the process with respect to the matching - condition - -There is less information in this case because the logic for disabling -processes is much simpler than that for enabling them. - -Once these ``enabled_procs`` and ``disabled_procs`` lists have been -collected, a ``del_proc`` statement for each event in ``disabled_procs`` -is written. Finally, the routine needs to write the decision tree to -figure out which events to activate. This is done by the -``kmos3.io.ProcListWriter._write_optimal_iftree`` method, which calls -itself recursively to build an optimized ``select-case`` tree. - -``_write_optimal_iftree`` expects an object with the same structure as -the ``enabled_procs`` list as input. This is called ``items`` in the -method's body. At the start, each entry of the list corresponds to an -event that potentially needs to be activated. Associated to each of -those, there is a list of all conditions *missing* for this events to be -activated. If in the initial call to ``_write_optimal_iftree`` one of -the events has no missing conditions (i.e. the corresponding list is -empty), this means that their only condition was whatever the ``put`` or -``take`` routine provided. Consequently, the first step this method -takes is to write a call to ``add_proc`` for those events (if any). Such -events are then be removed from the ``items`` list. - -Next the procedure that heuristically optimizes the if-tree starts. From -``items``, it is possible to obtain the *most frequent coordinate*, i.e. -that which appears most often within the lists of missing conditions. -Such coordinate is selected to be queried first in the ``select-case`` -tree. The possible cases correspond to the different possible species -adsorbed at this coordinate. The routine iterates through those. For -each species, it writes first the ``case`` statement. Then, the -processes in ``items`` whose condition in the *most frequent coordinate* -matches the current species are added to a reduced items list called -``nested_items``. Next, the condition in the *most frequent coordinate* -will be removed from the ``nested_items``, creating the ``pruned_items`` -list. This reduced list is used as input for a successive call to -``_write_optimal_iftree``. The events that where included in -``nested_items`` are then removed from the ``items`` list. - -It is possible (likely) that not all events will be have conditions in -the most frequent coordinate. If this is the case, -``_write_optimal_iftree`` need to be called again to start an additional +The ``write_proclist_put_take`` is organized as several nested ``for`` loops. The outermost goes +through each species in the model, the following through each layer and site type, and the next +through the two possibilities, ``put`` and ``take``. At this point, a specific +``put_<species>_<layer>_<site>`` or ``take_<species>_<layer>_<site>`` subroutine is being written. + +For each of these routines, it is necessary to check which events (located relative to the +affected site) can potentially be activated or deactivated by the operation being executed. This +is done with further nested loops, going through each process and then through each condition of +such process. + +If a fulfilling match is found (i.e., the species and site type of the condition matches the site +and species of a ``put`` routine or there is a condition associated to the default species on the +site affected by a ``take`` routine) a *marker* to the corresponding process is stored in the +``enabled_procs`` list. This marker is a nested tuple with the following structure: + +- first a list of ``kmos3.types.ConditionAction`` objects (see below) +- then a tuple containing + + - the name of the process + - the relative executing coordinate of the process with respect to the matching condition + - a constant ``True`` value. + +The list of ``ConditionAction`` objects contain an entry for each of the conditions of the given +process, **except** for the condition that matched. The species are the same, but the coordinates +of the these new ``ConditionAction`` objects are *relative* to the the coordinate of the matching +condition. This way, we gain access to the position of the conditions of the events that can +potentially be activated by the ``put`` or ``take`` routine relative to the position that is being +affected in the surface. Note that potentially more than one marker could be added to the list for +a given process. This would correspond to the possibility of different events associated to the +same process being activated. + +If an unfulfilling match is found, a tuple is added to the ``disabled_procs`` list. This tuple +contains + +- the process object and +- the relative position of the process with respect to the matching condition. + +There is less information in this case because the logic for disabling processes is much simpler +than that for enabling them. + +Once these ``enabled_procs`` and ``disabled_procs`` lists have been collected, a ``del_proc`` +statement for each event in ``disabled_procs`` is written. Finally, the routine needs to write the +decision tree to figure out which events to activate. This is done by the +``kmos3.io.ProcListWriter._write_optimal_iftree`` method, which calls itself recursively to build +an optimized ``select-case`` tree. + +``_write_optimal_iftree`` expects an object with the same structure as the ``enabled_procs`` list +as input. This is called ``items`` in the method's body. At the start, each entry of the list +corresponds to an event that potentially needs to be activated. Associated to each of those, there +is a list of all conditions *missing* for this events to be activated. If in the initial call to +``_write_optimal_iftree`` one of the events has no missing conditions (i.e., the corresponding +list is empty), this means that their only condition was whatever the ``put`` or ``take`` routine +provided. Consequently, the first step this method takes is to write a call to ``add_proc`` for +those events (if any). Such events are then to be removed from the ``items`` list. + +Next, the procedure that heuristically optimizes the if-tree starts. From ``items``, it is +possible to obtain the *most frequent coordinate*, i.e., that which appears most often within the +lists of missing conditions. Such coordinate is selected to be queried first in the +``select-case`` tree. The possible cases correspond to the different possible species adsorbed at +this coordinate. The routine iterates through those. For each species, it writes first the +``case`` statement. Then, the processes in ``items`` whose condition in the *most frequent +coordinate* matches the current species are added to a reduced items list called ``nested_items``. +Next, the condition in the *most frequent coordinate* will be removed from the ``nested_items``, +creating the ``pruned_items`` list. This reduced list is used as input for a successive call to +``_write_optimal_iftree``. The events that were included in ``nested_items`` are then removed from +the ``items`` list. + +It is possible (likely) that not all events will have conditions in the most frequent coordinate. +If this is the case, ``_write_optimal_iftree`` needs to be called again to start an additional top-level case-tree to explore those processes. -In this way, further calls are made to ``_write_optimal_iftree``, each -of which in which the ``items`` list is shorter, of the item themselves -contain fewer conditions. These calls "branch out", but each branch -eventually leads to calls with empty ``items`` list, which closes the -corresponding branch. The decision tree finishes writing when all -elements of ``enabled_procs`` have been exhausted. +In this way, further calls are made to ``_write_optimal_iftree``, each of which in which the +``items`` list is shorter, of the item themselves contain fewer conditions. These calls "branch +out", but each branch eventually leads to calls with empty ``items`` list, which closes the +corresponding branch. The decision tree finishes writing when all elements of ``enabled_procs`` +have been exhausted. ``write_proclist_touchup`` '''''''''''''''''''''''''' -This routine is in charge of writing the -``proclist/touchup_<layer>_<site>``, one for each site type. These -routines update the state of the lattice, one site at a time. +This routine is in charge of writing the ``proclist/touchup_<layer>_<site>``, one for each site +type. These routines update the state of the lattice, one site at a time. -They first delete all possible events with executing coordinate in the -current site. Then, they collect a list of all processes with executing -coordinate matching the current site type. The list is built with the -same structure as the ``enabled_procs`` list described in section (see -:ref:`here <write-put-take>`). This is then fed to the -``_write_optimal_subtree`` method, to build a decision tree that can -decide which of those process are to be turned-on given the current -state of the lattice. +They first delete all possible events with executing coordinate in the current site. Then, they +collect a list of all processes with executing coordinate matching the current site type. The list +is built with the same structure as the ``enabled_procs`` list described in section (see +:ref:`write-put-take`). This is then fed to the ``_write_optimal_subtree`` method, to build a +decision tree that can decide which of those process are to be turned-on given the current state +of the lattice. -TODO ``write_proclist_multilattice`` -'''''''''''''''''''''''''''''''''''' +``write_proclist_multilattice`` +''''''''''''''''''''''''''''''' + +.. todo:: + ``write_proclist_multilattice`` ``write_proclist_end`` '''''''''''''''''''''' This simply closes the proclist module with ``end module proclist``. -Methods called to build ``lat_int`` source code +Methods Called to Build ``lat_int`` Source Code ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``write_proclist_lat_int`` '''''''''''''''''''''''''' -This writes the header of the ``proclist.f90`` file for ``lat_int`` and -then calls several ``write_proclist_lat_int_*`` functions in charge of -writing the different routines of the module. Before it can do this, it -needs to call ``_get_lat_int_groups``, a method that finds all lateral -interaction groups and returns them as a dictionary. This dictionary has -the names of the groups as keys and the corresponding lists of processes -as values. The name of a group is the name of the process within it with -the lowest index (this coincides with the first process in the group -when sorted alphabetically). +This writes the header of the ``proclist.f90`` file for ``lat_int`` and then calls several +``write_proclist_lat_int_*`` functions in charge of writing the different routines of the module. +Before it can do this, it needs to call ``_get_lat_int_groups``, a method that finds all lateral +interaction groups and returns them as a dictionary. This dictionary has the names of the groups +as keys and the corresponding lists of processes as values. The name of a group is the name of the +process within it with the lowest index (this coincides with the first process in the group when +sorted alphabetically). ``write_proclist_lat_int_run_proc_nr`` '''''''''''''''''''''''''''''''''''''' This functions is similar to its ``local_smart`` counterpart (see -:ref:`here <sec-write-run-proc-nr-smart>`). The only difference -is that this routine needs to decide between lateral interaction groups -instead of individual processes, as selecting the individual process -within the group is done by the ``nli_*`` subroutines. For this reason, -the indices of all processes of a group are included inside the -``case( ... )`` statements. +:ref:`sec-write-run-proc-nr-smart`). The only difference is that this routine needs to decide +between lateral interaction groups instead of individual processes, as selecting the individual +process within the group is done by the ``nli_*`` subroutines. For this reason, the indices of all +processes of a group are included inside the ``case( ... )`` statements. ``write_proclist_lat_int_touchup`` '''''''''''''''''''''''''''''''''' -Writing the touchup functions is much simpler here than in -``local_smart``, as here we can rely on the ``nli_*`` functions (see -`here <#sec:nli>`__). As in ``local_smart``, all processes are deleted -(just in case they were activated). Then ``add_proc`` is called for each -lateral interaction group, using the result of the corresponding -``nli_<lat_int_group>`` function as input. Thus, an event will be added -only if that function returns non-zero. +Writing the touchup functions is much simpler here than in ``local_smart``, as here we can rely on +the ``nli_*`` functions (see :ref:`sec-write-proclist-lat-int-nli-casetree`). As in +``local_smart``, all processes are deleted (just in case they were activated). Then ``add_proc`` +is called for each lateral interaction group, using the result of the corresponding +``nli_<lat_int_group>`` function as input. Thus, an event will be added only if that function +returns non-zero. ``write_proclist_lat_int_run_proc`` ''''''''''''''''''''''''''''''''''' -This method writes a ``run_proc_<lat_int_nr>`` module for each lateral -interaction group. Each of these modules is located in its own file. The -first step for writing the modules consists of finding all lateral -interaction event groups which are affected by the actions of the -current lateral interaction group. These are included in the list -``modified_procs``. Once the list is built, a ``del_proc`` call is -written for each of them, using the results of the corresponding -``nli_<lat_int_group>`` as argument. Then, it writes calls to -``replace_species`` to update the lattice. Finally a call to -``add_proc`` is added for each element of ``modified_procs``, using the -corresponding ``nli_<lat_int_group>`` as argument. +This method writes a ``run_proc_<lat_int_nr>`` module for each lateral interaction group. Each of +these modules is located in its own file. The first step for writing the modules consists of +finding all lateral interaction event groups which are affected by the actions of the current +lateral interaction group. These are included in the list ``modified_procs``. Once the list is +built, a ``del_proc`` call is written for each of them, using the results of the corresponding +``nli_<lat_int_group>`` as argument. Then, it writes calls to ``replace_species`` to update the +lattice. Finally, a call to ``add_proc`` is added for each element of ``modified_procs``, using +the corresponding ``nli_<lat_int_group>`` as argument. + +.. _sec-write-proclist-lat-int-nli-casetree: ``write_proclist_lat_int_nli_casetree`` ''''''''''''''''''''''''''''''''''''''' -This method writes the ``nli_*`` routines, which decide which, if any, -of the processes in a lateral interaction group can be executed in a -given site of the lattice. For this, the method builds a nested -dictionary, ``case_tree``, which encodes the decision tree. This is then -translated into a ``select-case`` Fortran block by the -``kmos3.io._casetree_dict`` function. +This method writes the ``nli_*`` routines, which decide which, if any, of the processes in a +lateral interaction group can be executed in a given site of the lattice. For this, the method +builds a nested dictionary, ``case_tree``, which encodes the decision tree. This is then +translated into a ``select-case`` Fortran block by the ``kmos3.io._casetree_dict`` function. -Methods called to build ``otf`` source code +Methods Called to Build ``otf`` Source Code ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``write_proclist_pars_otf`` ''''''''''''''''''''''''''' -This method is only used by the ``otf`` backend. It is in charge of -writing the ``proclist_pars.f90`` file. This module has two main roles: -the first is to provide access to the user-defined parameters and other -physical parameters and constants at the Fortran level. The second, to -provide the routines which evaluate the rate constants during execution. - -The routine first writes the declaration of the ``userpar`` array, used -to store the value of the user-defined parameters. In addition, -auxiliary integer constants (named as the parameters in the model) are -declared to help with the indexing of this array. The -``_otf_get_auxiliary_params`` method is used to collect lists of -constants, including the definitions of physical units, atomic masses -and chemical potentials used in the rate expressions in the model. The -constants and atomic masses are declared as constants with their -corresponding value (evaluated using ``kmos3.evaluate_rate_expression``). -If needed, a ``chempot`` array is included, which is used to store the -value of the chemical potentials used in the model (auxiliary indexing -variables are also included for this array). - -In addition, this method writes a routine to update ``userpar`` from the -Python interface, and another to read the values of such array. If -needed, a routine to update ``chempots`` is also added. - -In addition, this routine writes the functions used to evaluate the rate -constants during execution. For each process, a ``gr_<process_name>`` -and a ``rate_<process_name>`` are written. ``gr_<process_name>`` loops -through all the bystanders to count how many neighbors of a given -species there is for each "flag" associated to the process (see as -determined by its -`bystanders <http://kmos3.readthedocs.io/en/latest/topic_guides/otf_backend.html>`__). -These counts are accumulated in the ``nr_vars`` array. This array is -used as input to the corresponding ``rate_<process_name>`` routine. The -content of this routine is directly obtained from the ``otf_rate`` -attribute of the the ``kmos3.types.Process`` object. This user-defined -string is processed by the ``_parse_otf_rate`` method to replace the -standard parameter and constant names with the names understood by this -Fortran module. +This method is only used by the ``otf`` backend. It is in charge of writing the +``proclist_pars.f90`` file. This module has two main roles: + +- provide access to the user-defined parameters and other physical parameters and constants at the + Fortran level. +- provide the routines, which evaluate the rate constants during execution. + +The routine first writes the declaration of the ``userpar`` array, used to store the value of the +user-defined parameters. In addition, auxiliary integer constants (named as the parameters in the +model) are declared to help with the indexing of this array. The ``_otf_get_auxiliary_params`` +method is used to collect lists of constants, including the definitions of physical units, atomic +masses and chemical potentials used in the rate expressions in the model. The constants and atomic +masses are declared as constants with their corresponding value (evaluated using +``kmos3.evaluate_rate_expression``). If needed, a ``chempot`` array is included, which is used to +store the value of the chemical potentials used in the model (auxiliary indexing variables are +also included for this array). + +In addition, this method writes a routine to update ``userpar`` from the Python interface, and +another to read the values of such array. If needed, a routine to update ``chempots`` is also +added. + +This routine also writes the functions used to evaluate the rate constants during execution. For +each process, a ``gr_<process_name>`` and a ``rate_<process_name>`` are written. +``gr_<process_name>`` loops through all the bystanders to count how many neighbors of a given +species there is for each "flag" associated to the process (see as determined by its +:ref:`bystanders <otf_backend>`). These counts are accumulated in the ``nr_vars`` array. This +array is used as input to the corresponding ``rate_<process_name>`` routine. The content of this +routine is directly obtained from the ``otf_rate`` attribute of the the ``kmos3.types.Process`` +object. This user-defined string is processed by the ``_parse_otf_rate`` method to replace the +standard parameter and constant names with the names understood by this Fortran module. ``write_proclist_touchup_otf`` '''''''''''''''''''''''''''''' -This method writes the subroutines used to initialize the state of the -bookkeeping arrays at the start of a simulation. For this, it calls the -``_write_optimal_iftree_otf`` with all possible events associated to the -current site (i.e. with all processes). The routine -``_write_optimal_iftree_otf`` is very similar to the -``_write_optimal_iftree`` routine described used by ``local_smart``'s ``write_proclist_run_proc_nr_smart`` (see :ref:`here <write-put-take>`). -The most remarkable difference is that in otf the ``add_proc`` routine -needs to be called with the result of a ``gr_<proc_name>`` routine as an -argument (to evaluate the current value of the event's rate constant). +This method writes the subroutines used to initialize the state of the bookkeeping arrays at the +start of a simulation. For this, it calls the ``_write_optimal_iftree_otf`` with all possible +events associated to the current site (i.e., with all processes). The routine +``_write_optimal_iftree_otf`` is very similar to the ``_write_optimal_iftree`` routine, which is +used by ``write_proclist_run_proc_nr_smart`` of the ``local_smart`` backend (see +:ref:`write-put-take`). The most remarkable difference is that in otf the ``add_proc`` routine +needs to be called with the result of a ``gr_<proc_name>`` routine as an argument (to evaluate the +current value of the event's rate constant). ``write_proclist_run_proc_nr_otf`` '''''''''''''''''''''''''''''''''' -The subroutine written by this method is very similar to its counterpart -in the ``lat_int`` backend, only needing to decide which specific -``run_proc_<procname>`` function to call. +The subroutine written by this method is very similar to its counterpart in the ``lat_int`` +backend, only needing to decide which specific ``run_proc_<procname>`` function to call. ``write_proclist_run_proc_name_otf`` '''''''''''''''''''''''''''''''''''' -The ``run_proc_<proc_name>`` routines are the ones in charge of updating -the bookkeeping arrays once a given event has been selected for -execution. They are similar to their counterpart in ``lat_int`` in that -there is one for each lateral interaction group. In ``otf`` there is -only one process per "lateral interaction group", so there is one such -routine per process. They are also similar to the ``put_*`` and -``take_*`` subroutines from ``local_smart`` because they use very -similar logic to build the hardcoded decision trees. The main difference -between these backends is that the ``run_proc_<proc_name>`` routines of -``otf`` implement decision trees that take into account the changes in -all sites affected by a process, while in ``local_smart`` ``put_*`` and +The ``run_proc_<proc_name>`` routines are the ones in charge of updating the bookkeeping arrays +once a given event has been selected for execution. They are similar to their counterpart in +``lat_int`` in that there is one for each lateral interaction group. In ``otf`` there is only one +process per lateral interaction group, so there is one such routine per process. They are also +similar to the ``put_*`` and ``take_*`` subroutines from ``local_smart`` because they use very +similar logic to build the hard-coded decision trees. The main difference between these backends +is that the ``run_proc_<proc_name>`` routines of ``otf`` implement decision trees that take into +account the changes in all sites affected by a process, while in ``local_smart`` ``put_*`` and ``take_*`` routines consider only an elementary change to a single site. -The first thing that ``write_proclist_run_proc_name_otf`` does is to -collect a list with all the events for which one of the actions of the -executing process unfulfills a condition (``inh_procs``), a list with -all the processes for which they fulfill a condition (``enh_procs``) and -a list with all the processes for which they modify the state of one of -the bystanders (``aff_procs``). The processes that are included in -``inh_procs`` list are excluded from the other two lists. - -Once this is done, calls to ``del_proc`` are written for all processes -in ``inh_procs``. Then, calls to the ``replace_species`` subroutine are -added, so as to update the lattice according to the actions of the -executing process. Afterwards, the subroutine ``update_rates_matrix`` is -called for each process in ``aff_procs`` to update the corresponding -rate constant. - -As in the case of ``local_smart`` the most complex operation is that of -activating processes, as the state of the lattice needs to be queried -efficiently. To do this, a new list, ``enabling_items``, is built based -on the ``enh_procs`` list. ``enabling_items`` contains an entry for each -process in ``enh_process``. These entries are tuples containing: +The first thing that ``write_proclist_run_proc_name_otf`` does is to collect a list with all the +events for which one of the actions of the executing process unfulfills a condition +(``inh_procs``), a list with all the processes for which they fulfill a condition (``enh_procs``) +and a list with all the processes for which they modify the state of one of the bystanders +(``aff_procs``). The processes that are included in ``inh_procs`` list are excluded from the other +two lists. + +Once this is done, calls to ``del_proc`` are written for all processes in ``inh_procs``. Then, +calls to the ``replace_species`` subroutine are added, so as to update the lattice according to +the actions of the executing process. Afterwards, the subroutine ``update_rates_matrix`` is called +for each process in ``aff_procs`` to update the corresponding rate constant. + +As in the case of ``local_smart`` the most complex operation is that of activating processes, as +the state of the lattice needs to be queried efficiently. To do this, a new list, +``enabling_items``, is built based on the ``enh_procs`` list. ``enabling_items`` contains an entry +for each process in ``enh_process``. These entries are tuples containing: - a list of conditions which are not satisfied by the executing event - a tuple containing: - the name of the process - - the relative position of the process with respect to the - coordinate of the executing process + - the relative position of the process with respect to the coordinate of the executing process - a constant ``True`` value. -This list is analogous to the ``enabled_procs`` list used by the -``write_proclist_put_take`` routine of the ``local_smart`` backend (see -`here <#sec:write-proclist-put-take>`__). This list is used as input for -the ``_write_optimal_iftree_otf`` method. This is very similar to the -``_write_optimal_iftree``, with the only difference that calls to -``add_proc`` also need to include the result of the ``gr_<proc_name>`` -functions as arguments. +This list is analogous to the ``enabled_procs`` list used by the ``write_proclist_put_take`` +routine of the ``local_smart`` backend (see :ref:`write-put-take`). This list is used as input for +the ``_write_optimal_iftree_otf`` method. This is very similar to the ``_write_optimal_iftree``, +with the only difference that calls to ``add_proc`` also need to include the result of the +``gr_<proc_name>`` functions as arguments. diff --git a/doc/source/development.rst b/doc/source/development.rst index b3e0150524d2af6a04b8806424805b3f006c6ef2..07e2a092566c17823d58f5dc9943b5f4051c6adf 100644 --- a/doc/source/development.rst +++ b/doc/source/development.rst @@ -1,4 +1,6 @@ +=========== Development -^^^^^^^^^^^ +=========== .. include:: ../../CONTRIBUTING.rst +.. include:: developers_guide.rst diff --git a/doc/source/img/add_proc.svg b/doc/source/img/add_proc.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e48b8943c52950f09c74833c01287f47675742d --- /dev/null +++ b/doc/source/img/add_proc.svg @@ -0,0 +1,1031 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="830.63641" + height="206.01691" + viewBox="0 0 219.77254 54.508639" + version="1.1" + id="svg1" + sodipodi:docname="add_proc.svg" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="1" + inkscape:cx="344.99999" + inkscape:cy="84.999998" + inkscape:current-layer="layer1" + showgrid="false" /> + <defs + id="defs1"> + <marker + style="overflow:visible" + id="ConcaveTriangle" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Concave triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.7)" + d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:none" + id="path7" /> + </marker> + <marker + style="overflow:visible" + id="ConcaveTriangle-0" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Concave triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.7)" + d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:none" + id="path7-9" /> + </marker> + </defs> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0.16536982,0.16536516)"> + <g + id="g1"> + <path + d="M 0,0 V 42.333332 M 10.583333,0 V 42.333332 M 21.166666,0 V 42.333332 M 31.749999,0 V 31.749999 42.333332 M 42.333332,0 V 10.583333 42.333332 M 52.916665,0 V 42.333332 M 63.499998,0 V 21.166666 31.749999 42.333332 M 74.083331,0 V 42.333332 M 84.666664,0 V 10.583333 21.166666 42.333332 M 95.249997,0 V 42.333332 M 105.83333,0 V 42.333332 M 0,0 H 105.83333 M 0,10.583333 H 105.83333 M 0,21.166666 H 105.83333 M 0,31.749999 H 105.83333 M 0,42.333332 h 105.83333" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.185208;stroke-dasharray:none" + id="path2" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1" + width="105.6349" + height="42.134895" + x="0.099213526" + y="0.099218339" /> + <path + d="M 42.333332,0 V 10.583333 H 84.666664 V 21.166666 H 63.499998 V 31.749999 H 31.749999 v 10.583333" + style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-dasharray:none" + id="path1" + sodipodi:nodetypes="cccccccc" /> + <g + id="g3" + style="stroke-width:0.185208;stroke-dasharray:none"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="7.7111449" + id="text2"><tspan + sodipodi:role="line" + id="tspan2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="7.7111449">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="7.7111449" + id="text2-8"><tspan + sodipodi:role="line" + id="tspan2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="7.7111449">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="7.7111449" + id="text2-1"><tspan + sodipodi:role="line" + id="tspan2-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="7.7111449">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.388016" + y="7.7111449" + id="text2-9"><tspan + sodipodi:role="line" + id="tspan2-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.388016" + y="7.7111449">9</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="18.205606" + id="text2-5"><tspan + sodipodi:role="line" + id="tspan2-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="18.205606" + id="text2-0"><tspan + sodipodi:role="line" + id="tspan2-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="18.205606">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="18.205606" + id="text2-6"><tspan + sodipodi:role="line" + id="tspan2-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="33.425346" + y="18.205606" + id="text2-7"><tspan + sodipodi:role="line" + id="tspan2-65" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="33.425346" + y="18.205606">10</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="18.205606" + id="text2-74"><tspan + sodipodi:role="line" + id="tspan2-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="18.205606" + id="text2-744"><tspan + sodipodi:role="line" + id="tspan2-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="18.205606">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.253304" + y="18.205606" + id="text2-68"><tspan + sodipodi:role="line" + id="tspan2-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.253304" + y="18.205606">9</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.774971" + y="18.205606" + id="text2-4"><tspan + sodipodi:role="line" + id="tspan2-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.774971" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="28.78894" + id="text2-92"><tspan + sodipodi:role="line" + id="tspan2-66" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="28.78894">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="28.78894" + id="text2-04"><tspan + sodipodi:role="line" + id="tspan2-87" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="28.78894" + id="text2-72"><tspan + sodipodi:role="line" + id="tspan2-26" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.414371" + y="28.78894" + id="text2-15"><tspan + sodipodi:role="line" + id="tspan2-94" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.414371" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="28.78894" + id="text2-17"><tspan + sodipodi:role="line" + id="tspan2-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="28.78894" + id="text2-97"><tspan + sodipodi:role="line" + id="tspan2-76" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="28.78894">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="39.107689" + id="text2-56"><tspan + sodipodi:role="line" + id="tspan2-39" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="39.107689" + id="text2-2"><tspan + sodipodi:role="line" + id="tspan2-93" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="39.107689" + id="text2-85"><tspan + sodipodi:role="line" + id="tspan2-09" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="39.107689">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="7.7095947" + id="text2-561"><tspan + sodipodi:role="line" + id="tspan2-15" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="7.7095947" + id="text2-561-8"><tspan + sodipodi:role="line" + id="tspan2-15-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="7.7095947" + id="text2-561-4"><tspan + sodipodi:role="line" + id="tspan2-15-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="7.7095947" + id="text2-561-6"><tspan + sodipodi:role="line" + id="tspan2-15-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="7.7095947" + id="text2-561-9"><tspan + sodipodi:role="line" + id="tspan2-15-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="7.7095947" + id="text2-561-85"><tspan + sodipodi:role="line" + id="tspan2-15-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="18.204056" + id="text2-561-5"><tspan + sodipodi:role="line" + id="tspan2-15-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="18.204056" + id="text2-561-88"><tspan + sodipodi:role="line" + id="tspan2-15-31" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="28.78739" + id="text2-561-43"><tspan + sodipodi:role="line" + id="tspan2-15-33" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="28.78739" + id="text2-561-48"><tspan + sodipodi:role="line" + id="tspan2-15-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="28.78739" + id="text2-561-7"><tspan + sodipodi:role="line" + id="tspan2-15-64" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="28.78739" + id="text2-561-0"><tspan + sodipodi:role="line" + id="tspan2-15-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.358559" + y="39.10614" + id="text2-561-59"><tspan + sodipodi:role="line" + id="tspan2-15-46" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.358559" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="39.10614" + id="text2-561-47"><tspan + sodipodi:role="line" + id="tspan2-15-75" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="39.10614" + id="text2-561-2"><tspan + sodipodi:role="line" + id="tspan2-15-89" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="39.10614" + id="text2-561-02"><tspan + sodipodi:role="line" + id="tspan2-15-10" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="39.10614" + id="text2-561-08"><tspan + sodipodi:role="line" + id="tspan2-15-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="39.10614" + id="text2-561-62"><tspan + sodipodi:role="line" + id="tspan2-15-58" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="39.10614" + id="text2-561-472"><tspan + sodipodi:role="line" + id="tspan2-15-40" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="39.10614">0</tspan></text> + </g> + </g> + <g + id="g2"> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1-3" + width="105.6349" + height="42.134895" + x="113.70769" + y="0.099218339" + inkscape:label="rect1-3" /> + <g + id="g162"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="7.7111459" + id="text2-562"><tspan + sodipodi:role="line" + id="tspan2-91" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="7.7111459" + id="text2-8-2"><tspan + sodipodi:role="line" + id="tspan2-9-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="7.7111459">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="7.7111459" + id="text2-1-0"><tspan + sodipodi:role="line" + id="tspan2-2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="7.7111459">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="148.99649" + y="7.7111459" + id="text2-9-3"><tspan + sodipodi:role="line" + id="tspan2-4-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.99649" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="18.205606" + id="text2-5-0"><tspan + sodipodi:role="line" + id="tspan2-0-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="18.205606">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="18.205606" + id="text2-0-2"><tspan + sodipodi:role="line" + id="tspan2-6-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="18.205606" + id="text2-6-1"><tspan + sodipodi:role="line" + id="tspan2-1-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="149.00734" + y="18.205606" + id="text2-7-7"><tspan + sodipodi:role="line" + id="tspan2-65-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.00734" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.54048" + y="18.205606" + id="text2-74-2"><tspan + sodipodi:role="line" + id="tspan2-5-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.11974" + y="18.205606" + id="text2-744-2"><tspan + sodipodi:role="line" + id="tspan2-3-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.86177" + y="18.205606" + id="text2-68-7"><tspan + sodipodi:role="line" + id="tspan2-8-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.86177" + y="18.205606">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.38344" + y="18.205606" + id="text2-4-9"><tspan + sodipodi:role="line" + id="tspan2-92-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.38344" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="28.78894" + id="text2-92-2"><tspan + sodipodi:role="line" + id="tspan2-66-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="28.78894">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="28.78894" + id="text2-04-9"><tspan + sodipodi:role="line" + id="tspan2-87-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="28.78894" + id="text2-72-3"><tspan + sodipodi:role="line" + id="tspan2-26-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="149.02284" + y="28.78894" + id="text2-15-1"><tspan + sodipodi:role="line" + id="tspan2-94-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.02284" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.54048" + y="28.78894" + id="text2-17-9"><tspan + sodipodi:role="line" + id="tspan2-7-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.11974" + y="28.78894" + id="text2-97-1"><tspan + sodipodi:role="line" + id="tspan2-76-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="28.78894">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="39.107689" + id="text2-56-4"><tspan + sodipodi:role="line" + id="tspan2-39-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="39.107689" + id="text2-2-8"><tspan + sodipodi:role="line" + id="tspan2-93-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="39.107689" + id="text2-85-5"><tspan + sodipodi:role="line" + id="tspan2-09-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="39.107689">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.48466" + y="7.7095962" + id="text2-561-3"><tspan + sodipodi:role="line" + id="tspan2-15-61" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.06393" + y="7.7095962" + id="text2-561-8-0"><tspan + sodipodi:role="line" + id="tspan2-15-1-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="7.7095962" + id="text2-561-4-3"><tspan + sodipodi:role="line" + id="tspan2-15-4-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="7.7095962">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="7.7095962" + id="text2-561-6-0"><tspan + sodipodi:role="line" + id="tspan2-15-3-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="7.7095962" + id="text2-561-9-1"><tspan + sodipodi:role="line" + id="tspan2-15-6-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="7.7095962">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="7.7095962" + id="text2-561-85-5"><tspan + sodipodi:role="line" + id="tspan2-15-7-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="18.204056" + id="text2-561-5-7"><tspan + sodipodi:role="line" + id="tspan2-15-9-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="18.204056">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="18.204056" + id="text2-561-88-5"><tspan + sodipodi:role="line" + id="tspan2-15-31-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="18.204056">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="28.78739" + id="text2-561-43-9"><tspan + sodipodi:role="line" + id="tspan2-15-33-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="28.78739" + id="text2-561-48-7"><tspan + sodipodi:role="line" + id="tspan2-15-8-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="28.78739" + id="text2-561-7-5"><tspan + sodipodi:role="line" + id="tspan2-15-64-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="28.78739">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="28.78739" + id="text2-561-0-5"><tspan + sodipodi:role="line" + id="tspan2-15-92-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="148.96703" + y="39.10614" + id="text2-561-59-7"><tspan + sodipodi:role="line" + id="tspan2-15-46-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.96703" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.48466" + y="39.10614" + id="text2-561-47-4"><tspan + sodipodi:role="line" + id="tspan2-15-75-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.06393" + y="39.10614" + id="text2-561-2-0"><tspan + sodipodi:role="line" + id="tspan2-15-89-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="39.10614" + id="text2-561-02-8"><tspan + sodipodi:role="line" + id="tspan2-15-10-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="39.10614" + id="text2-561-08-8"><tspan + sodipodi:role="line" + id="tspan2-15-5-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="39.10614">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="39.10614" + id="text2-561-62-4"><tspan + sodipodi:role="line" + id="tspan2-15-58-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="39.10614" + id="text2-561-472-1"><tspan + sodipodi:role="line" + id="tspan2-15-40-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="39.10614">0</tspan></text> + </g> + <path + d="M 113.60847,4.9e-7 V 42.333333 M 124.19181,4.9e-7 V 42.333333 M 134.77514,4.9e-7 V 42.333333 M 145.35848,4.9e-7 V 31.75 42.333333 M 155.94181,4.9e-7 V 10.583334 42.333333 M 166.52514,4.9e-7 V 42.333333 M 177.10847,4.9e-7 V 21.166667 31.75 42.333333 M 187.69181,4.9e-7 V 42.333333 M 198.27514,4.9e-7 V 10.583334 21.166667 42.333333 M 208.85847,4.9e-7 V 42.333333 M 219.44181,4.9e-7 V 42.333333 M 113.60847,4.9e-7 H 219.44181 M 113.60847,10.583334 H 219.44181 M 113.60847,21.166667 H 219.44181 M 113.60847,31.75 H 219.44181 M 113.60847,42.333333 h 105.83334" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.185208;stroke-dasharray:none" + id="path2-5" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="134.63669" + y="54.27816" + id="text2-15-1-9"><tspan + sodipodi:role="line" + id="tspan2-94-2-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="134.63669" + y="54.27816">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="79.725006" + y="54.281261" + id="text2-92-5"><tspan + sodipodi:role="line" + id="tspan2-66-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="79.725006" + y="54.281261">6</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.529166;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ConcaveTriangle)" + d="M 78.478091,51.82066 C 53.65152,50.59804 48.347482,11.927553 48.347482,11.927553" + id="path3" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ConcaveTriangle-0)" + d="m 139.53457,51.820288 c 26.06036,-1.223723 31.628,-39.929213 31.628,-39.929213" + id="path3-0" /> + </g> +</svg> diff --git a/doc/source/img/avail_sites.svg b/doc/source/img/avail_sites.svg new file mode 100644 index 0000000000000000000000000000000000000000..593b7a9906b3e459c04d2e7bf431a2543454c940 --- /dev/null +++ b/doc/source/img/avail_sites.svg @@ -0,0 +1,959 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="830.63641" + height="161.25" + viewBox="0 0 219.77254 42.664062" + version="1.1" + id="svg1" + sodipodi:docname="avail_sites_1.svg" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="1.4142136" + inkscape:cx="395.9798" + inkscape:cy="226.27417" + inkscape:current-layer="g2" /> + <defs + id="defs1" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0.16536982,0.16536516)"> + <g + id="g2" + style="stroke-width:0.185208;stroke-dasharray:none"> + <path + d="M 0,0 V 42.333332 M 10.583333,0 V 42.333332 M 21.166666,0 V 42.333332 M 31.749999,0 V 31.749999 42.333332 M 42.333332,0 V 10.583333 42.333332 M 52.916665,0 V 42.333332 M 63.499998,0 V 21.166666 31.749999 42.333332 M 74.083331,0 V 42.333332 M 84.666664,0 V 10.583333 21.166666 42.333332 M 95.249997,0 V 42.333332 M 105.83333,0 V 42.333332 M 0,0 H 105.83333 M 0,10.583333 H 105.83333 M 0,21.166666 H 105.83333 M 0,31.749999 H 105.83333 M 0,42.333332 h 105.83333" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.185208;stroke-dasharray:none" + id="path2" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.52916667;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1" + width="105.6349" + height="42.134895" + x="0.099213526" + y="0.099218339" /> + <path + d="M 42.333332,0 V 10.583333 H 84.666664 V 21.166666 H 63.499998 V 31.749999 H 31.749999 v 10.583333" + style="fill:none;stroke:#000000;stroke-width:0.52916667;stroke-dasharray:none" + id="path1" + sodipodi:nodetypes="cccccccc" /> + <g + id="g3" + style="stroke-width:0.185208;stroke-dasharray:none"> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="3.6301694" + y="7.7111449" + id="text2"><tspan + sodipodi:role="line" + id="tspan2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="7.7111449">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="14.133544" + y="7.7111449" + id="text2-8"><tspan + sodipodi:role="line" + id="tspan2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="7.7111449">7</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="24.607182" + y="7.7111449" + id="text2-1"><tspan + sodipodi:role="line" + id="tspan2-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="7.7111449">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="35.388016" + y="7.7111449" + id="text2-9"><tspan + sodipodi:role="line" + id="tspan2-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.388016" + y="7.7111449">9</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="3.6301694" + y="18.205606" + id="text2-5"><tspan + sodipodi:role="line" + id="tspan2-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="14.133544" + y="18.205606" + id="text2-0"><tspan + sodipodi:role="line" + id="tspan2-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="18.205606">4</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="24.607182" + y="18.205606" + id="text2-6"><tspan + sodipodi:role="line" + id="tspan2-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="33.425346" + y="18.205606" + id="text2-7"><tspan + sodipodi:role="line" + id="tspan2-65" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="33.425346" + y="18.205606">10</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="45.932007" + y="18.205606" + id="text2-74"><tspan + sodipodi:role="line" + id="tspan2-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="56.511269" + y="18.205606" + id="text2-744"><tspan + sodipodi:role="line" + id="tspan2-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="18.205606">7</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="67.253304" + y="18.205606" + id="text2-68"><tspan + sodipodi:role="line" + id="tspan2-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.253304" + y="18.205606">9</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="77.774971" + y="18.205606" + id="text2-4"><tspan + sodipodi:role="line" + id="tspan2-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.774971" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="3.6301694" + y="28.78894" + id="text2-92"><tspan + sodipodi:role="line" + id="tspan2-66" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="28.78894">6</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="14.133544" + y="28.78894" + id="text2-04"><tspan + sodipodi:role="line" + id="tspan2-87" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="24.607182" + y="28.78894" + id="text2-72"><tspan + sodipodi:role="line" + id="tspan2-26" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="35.414371" + y="28.78894" + id="text2-15"><tspan + sodipodi:role="line" + id="tspan2-94" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.414371" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="45.932007" + y="28.78894" + id="text2-17"><tspan + sodipodi:role="line" + id="tspan2-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="56.511269" + y="28.78894" + id="text2-97"><tspan + sodipodi:role="line" + id="tspan2-76" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="28.78894">8</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="3.6301694" + y="39.107689" + id="text2-56"><tspan + sodipodi:role="line" + id="tspan2-39" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="14.133544" + y="39.107689" + id="text2-2"><tspan + sodipodi:role="line" + id="tspan2-93" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="24.607182" + y="39.107689" + id="text2-85"><tspan + sodipodi:role="line" + id="tspan2-09" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="39.107689">8</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="45.876198" + y="7.7095947" + id="text2-561"><tspan + sodipodi:role="line" + id="tspan2-15" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="56.45546" + y="7.7095947" + id="text2-561-8"><tspan + sodipodi:role="line" + id="tspan2-15-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="67.197495" + y="7.7095947" + id="text2-561-4"><tspan + sodipodi:role="line" + id="tspan2-15-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="77.719162" + y="7.7095947" + id="text2-561-6"><tspan + sodipodi:role="line" + id="tspan2-15-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="88.267693" + y="7.7095947" + id="text2-561-9"><tspan + sodipodi:role="line" + id="tspan2-15-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="98.816223" + y="7.7095947" + id="text2-561-85"><tspan + sodipodi:role="line" + id="tspan2-15-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="98.816223" + y="18.204056" + id="text2-561-5"><tspan + sodipodi:role="line" + id="tspan2-15-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="88.267693" + y="18.204056" + id="text2-561-88"><tspan + sodipodi:role="line" + id="tspan2-15-31" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="98.816223" + y="28.78739" + id="text2-561-43"><tspan + sodipodi:role="line" + id="tspan2-15-33" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="88.267693" + y="28.78739" + id="text2-561-48"><tspan + sodipodi:role="line" + id="tspan2-15-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="77.719162" + y="28.78739" + id="text2-561-7"><tspan + sodipodi:role="line" + id="tspan2-15-64" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="67.197495" + y="28.78739" + id="text2-561-0"><tspan + sodipodi:role="line" + id="tspan2-15-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="35.358559" + y="39.10614" + id="text2-561-59"><tspan + sodipodi:role="line" + id="tspan2-15-46" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.358559" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="45.876198" + y="39.10614" + id="text2-561-47"><tspan + sodipodi:role="line" + id="tspan2-15-75" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="56.45546" + y="39.10614" + id="text2-561-2"><tspan + sodipodi:role="line" + id="tspan2-15-89" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="67.197495" + y="39.10614" + id="text2-561-02"><tspan + sodipodi:role="line" + id="tspan2-15-10" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="77.719162" + y="39.10614" + id="text2-561-08"><tspan + sodipodi:role="line" + id="tspan2-15-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="88.267693" + y="39.10614" + id="text2-561-62"><tspan + sodipodi:role="line" + id="tspan2-15-58" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="98.816223" + y="39.10614" + id="text2-561-472"><tspan + sodipodi:role="line" + id="tspan2-15-40" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="39.10614">0</tspan></text> + </g> + </g> + <path + d="M 113.60847,4.9e-7 V 42.333333 M 124.19181,4.9e-7 V 42.333333 M 134.77514,4.9e-7 V 42.333333 M 145.35848,4.9e-7 V 31.75 42.333333 M 155.94181,4.9e-7 V 10.583334 42.333333 M 166.52514,4.9e-7 V 42.333333 M 177.10847,4.9e-7 V 21.166667 31.75 42.333333 M 187.69181,4.9e-7 V 42.333333 M 198.27514,4.9e-7 V 10.583334 21.166667 42.333333 M 208.85847,4.9e-7 V 42.333333 M 219.44181,4.9e-7 V 42.333333 M 113.60847,4.9e-7 H 219.44181 M 113.60847,10.583334 H 219.44181 M 113.60847,21.166667 H 219.44181 M 113.60847,31.75 H 219.44181 M 113.60847,42.333333 h 105.83334" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.18520833;stroke-dasharray:none" + id="path2-5" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1-3" + width="105.6349" + height="42.134895" + x="113.70769" + y="0.099218339" + inkscape:label="rect1-3" /> + <g + id="g162"> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="117.23864" + y="7.7111459" + id="text2-562"><tspan + sodipodi:role="line" + id="tspan2-91" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="127.74201" + y="7.7111459" + id="text2-8-2"><tspan + sodipodi:role="line" + id="tspan2-9-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="7.7111459">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="138.21565" + y="7.7111459" + id="text2-1-0"><tspan + sodipodi:role="line" + id="tspan2-2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="7.7111459">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="148.99649" + y="7.7111459" + id="text2-9-3"><tspan + sodipodi:role="line" + id="tspan2-4-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.99649" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="117.23864" + y="18.205606" + id="text2-5-0"><tspan + sodipodi:role="line" + id="tspan2-0-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="18.205606">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="127.74201" + y="18.205606" + id="text2-0-2"><tspan + sodipodi:role="line" + id="tspan2-6-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="138.21565" + y="18.205606" + id="text2-6-1"><tspan + sodipodi:role="line" + id="tspan2-1-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="149.00734" + y="18.205606" + id="text2-7-7"><tspan + sodipodi:role="line" + id="tspan2-65-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.00734" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="159.54048" + y="18.205606" + id="text2-74-2"><tspan + sodipodi:role="line" + id="tspan2-5-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="170.11974" + y="18.205606" + id="text2-744-2"><tspan + sodipodi:role="line" + id="tspan2-3-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="180.86177" + y="18.205606" + id="text2-68-7"><tspan + sodipodi:role="line" + id="tspan2-8-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.86177" + y="18.205606">6</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="191.38344" + y="18.205606" + id="text2-4-9"><tspan + sodipodi:role="line" + id="tspan2-92-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.38344" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="117.23864" + y="28.78894" + id="text2-92-2"><tspan + sodipodi:role="line" + id="tspan2-66-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="28.78894">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="127.74201" + y="28.78894" + id="text2-04-9"><tspan + sodipodi:role="line" + id="tspan2-87-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="138.21565" + y="28.78894" + id="text2-72-3"><tspan + sodipodi:role="line" + id="tspan2-26-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="149.02284" + y="28.78894" + id="text2-15-1"><tspan + sodipodi:role="line" + id="tspan2-94-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.02284" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="159.54048" + y="28.78894" + id="text2-17-9"><tspan + sodipodi:role="line" + id="tspan2-7-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="170.11974" + y="28.78894" + id="text2-97-1"><tspan + sodipodi:role="line" + id="tspan2-76-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="28.78894">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="117.23864" + y="39.107689" + id="text2-56-4"><tspan + sodipodi:role="line" + id="tspan2-39-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="127.74201" + y="39.107689" + id="text2-2-8"><tspan + sodipodi:role="line" + id="tspan2-93-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="138.21565" + y="39.107689" + id="text2-85-5"><tspan + sodipodi:role="line" + id="tspan2-09-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="39.107689">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="159.48466" + y="7.7095962" + id="text2-561-3"><tspan + sodipodi:role="line" + id="tspan2-15-61" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="170.06393" + y="7.7095962" + id="text2-561-8-0"><tspan + sodipodi:role="line" + id="tspan2-15-1-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="180.80597" + y="7.7095962" + id="text2-561-4-3"><tspan + sodipodi:role="line" + id="tspan2-15-4-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="7.7095962">2</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="191.32764" + y="7.7095962" + id="text2-561-6-0"><tspan + sodipodi:role="line" + id="tspan2-15-3-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="201.87616" + y="7.7095962" + id="text2-561-9-1"><tspan + sodipodi:role="line" + id="tspan2-15-6-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="7.7095962">4</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="212.4247" + y="7.7095962" + id="text2-561-85-5"><tspan + sodipodi:role="line" + id="tspan2-15-7-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="212.4247" + y="18.204056" + id="text2-561-5-7"><tspan + sodipodi:role="line" + id="tspan2-15-9-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="18.204056">4</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="201.87616" + y="18.204056" + id="text2-561-88-5"><tspan + sodipodi:role="line" + id="tspan2-15-31-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="18.204056">7</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="212.4247" + y="28.78739" + id="text2-561-43-9"><tspan + sodipodi:role="line" + id="tspan2-15-33-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="201.87616" + y="28.78739" + id="text2-561-48-7"><tspan + sodipodi:role="line" + id="tspan2-15-8-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="191.32764" + y="28.78739" + id="text2-561-7-5"><tspan + sodipodi:role="line" + id="tspan2-15-64-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="28.78739">6</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="180.80597" + y="28.78739" + id="text2-561-0-5"><tspan + sodipodi:role="line" + id="tspan2-15-92-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="148.96703" + y="39.10614" + id="text2-561-59-7"><tspan + sodipodi:role="line" + id="tspan2-15-46-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.96703" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="159.48466" + y="39.10614" + id="text2-561-47-4"><tspan + sodipodi:role="line" + id="tspan2-15-75-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="170.06393" + y="39.10614" + id="text2-561-2-0"><tspan + sodipodi:role="line" + id="tspan2-15-89-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="180.80597" + y="39.10614" + id="text2-561-02-8"><tspan + sodipodi:role="line" + id="tspan2-15-10-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="191.32764" + y="39.10614" + id="text2-561-08-8"><tspan + sodipodi:role="line" + id="tspan2-15-5-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="39.10614">3</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="201.87616" + y="39.10614" + id="text2-561-62-4"><tspan + sodipodi:role="line" + id="tspan2-15-58-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal" + x="212.4247" + y="39.10614" + id="text2-561-472-1"><tspan + sodipodi:role="line" + id="tspan2-15-40-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="39.10614">0</tspan></text> + </g> + </g> +</svg> diff --git a/doc/source/img/del_proc.svg b/doc/source/img/del_proc.svg new file mode 100644 index 0000000000000000000000000000000000000000..c5a863bd942412652e46cf261fbf2370bab71c90 --- /dev/null +++ b/doc/source/img/del_proc.svg @@ -0,0 +1,1011 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="830.63641" + height="161.25" + viewBox="0 0 219.77254 42.664062" + version="1.1" + id="svg1" + sodipodi:docname="del_proc.svg" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="1" + inkscape:cx="353.99999" + inkscape:cy="-231.99999" + inkscape:current-layer="layer1" + showgrid="false" /> + <defs + id="defs1"> + <marker + style="overflow:visible" + id="ConcaveTriangle" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Concave triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.7)" + d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:none" + id="path7" /> + </marker> + <marker + style="overflow:visible" + id="ConcaveTriangle-8" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Concave triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.7)" + d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:none" + id="path7-7" /> + </marker> + </defs> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0.16536997,0.16536516)"> + <g + id="g1"> + <path + d="M 0,0 V 42.333332 M 10.583333,0 V 42.333332 M 21.166666,0 V 42.333332 M 31.749999,0 V 31.749999 42.333332 M 42.333332,0 V 10.583333 42.333332 M 52.916665,0 V 42.333332 M 63.499998,0 V 21.166666 31.749999 42.333332 M 74.083331,0 V 42.333332 M 84.666664,0 V 10.583333 21.166666 42.333332 M 95.249997,0 V 42.333332 M 105.83333,0 V 42.333332 M 0,0 H 105.83333 M 0,10.583333 H 105.83333 M 0,21.166666 H 105.83333 M 0,31.749999 H 105.83333 M 0,42.333332 h 105.83333" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.185208;stroke-dasharray:none" + id="path2" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1" + width="105.6349" + height="42.134895" + x="0.099213526" + y="0.099218339" /> + <path + d="M 42.333332,0 V 10.583333 H 84.666664 V 21.166666 H 63.499998 V 31.749999 H 31.749999 v 10.583333" + style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-dasharray:none" + id="path1" + sodipodi:nodetypes="cccccccc" /> + <g + id="g3" + style="stroke-width:0.185208;stroke-dasharray:none"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="7.7111449" + id="text2"><tspan + sodipodi:role="line" + id="tspan2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="7.7111449">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="7.7111449" + id="text2-8"><tspan + sodipodi:role="line" + id="tspan2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="7.7111449">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="7.7111449" + id="text2-1"><tspan + sodipodi:role="line" + id="tspan2-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="7.7111449">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.388016" + y="7.7111449" + id="text2-9"><tspan + sodipodi:role="line" + id="tspan2-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.388016" + y="7.7111449">9</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="18.205606" + id="text2-5"><tspan + sodipodi:role="line" + id="tspan2-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="18.205606" + id="text2-0"><tspan + sodipodi:role="line" + id="tspan2-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="18.205606">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="18.205606" + id="text2-6"><tspan + sodipodi:role="line" + id="tspan2-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="33.425346" + y="18.205606" + id="text2-7"><tspan + sodipodi:role="line" + id="tspan2-65" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="33.425346" + y="18.205606">10</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="18.205606" + id="text2-74"><tspan + sodipodi:role="line" + id="tspan2-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="18.205606" + id="text2-744"><tspan + sodipodi:role="line" + id="tspan2-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="18.205606">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.253304" + y="18.205606" + id="text2-68"><tspan + sodipodi:role="line" + id="tspan2-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.253304" + y="18.205606">9</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.774971" + y="18.205606" + id="text2-4"><tspan + sodipodi:role="line" + id="tspan2-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.774971" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="28.78894" + id="text2-92"><tspan + sodipodi:role="line" + id="tspan2-66" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="28.78894">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="28.78894" + id="text2-04"><tspan + sodipodi:role="line" + id="tspan2-87" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="28.78894" + id="text2-72"><tspan + sodipodi:role="line" + id="tspan2-26" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.414371" + y="28.78894" + id="text2-15"><tspan + sodipodi:role="line" + id="tspan2-94" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.414371" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="28.78894" + id="text2-17"><tspan + sodipodi:role="line" + id="tspan2-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.932007" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="28.78894" + id="text2-97"><tspan + sodipodi:role="line" + id="tspan2-76" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.511269" + y="28.78894">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="39.107689" + id="text2-56"><tspan + sodipodi:role="line" + id="tspan2-39" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="3.6301694" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="39.107689" + id="text2-2"><tspan + sodipodi:role="line" + id="tspan2-93" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="14.133544" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="39.107689" + id="text2-85"><tspan + sodipodi:role="line" + id="tspan2-09" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="24.607182" + y="39.107689">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="7.7095947" + id="text2-561"><tspan + sodipodi:role="line" + id="tspan2-15" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="7.7095947" + id="text2-561-8"><tspan + sodipodi:role="line" + id="tspan2-15-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="7.7095947" + id="text2-561-4"><tspan + sodipodi:role="line" + id="tspan2-15-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="7.7095947" + id="text2-561-6"><tspan + sodipodi:role="line" + id="tspan2-15-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="7.7095947" + id="text2-561-9"><tspan + sodipodi:role="line" + id="tspan2-15-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="7.7095947" + id="text2-561-85"><tspan + sodipodi:role="line" + id="tspan2-15-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="7.7095947">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="18.204056" + id="text2-561-5"><tspan + sodipodi:role="line" + id="tspan2-15-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="18.204056" + id="text2-561-88"><tspan + sodipodi:role="line" + id="tspan2-15-31" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="18.204056">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="28.78739" + id="text2-561-43"><tspan + sodipodi:role="line" + id="tspan2-15-33" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="28.78739" + id="text2-561-48"><tspan + sodipodi:role="line" + id="tspan2-15-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="28.78739" + id="text2-561-7"><tspan + sodipodi:role="line" + id="tspan2-15-64" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="28.78739" + id="text2-561-0"><tspan + sodipodi:role="line" + id="tspan2-15-92" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="35.358559" + y="39.10614" + id="text2-561-59"><tspan + sodipodi:role="line" + id="tspan2-15-46" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="35.358559" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="39.10614" + id="text2-561-47"><tspan + sodipodi:role="line" + id="tspan2-15-75" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="45.876198" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="39.10614" + id="text2-561-2"><tspan + sodipodi:role="line" + id="tspan2-15-89" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="56.45546" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="39.10614" + id="text2-561-02"><tspan + sodipodi:role="line" + id="tspan2-15-10" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="67.197495" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="39.10614" + id="text2-561-08"><tspan + sodipodi:role="line" + id="tspan2-15-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="77.719162" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="39.10614" + id="text2-561-62"><tspan + sodipodi:role="line" + id="tspan2-15-58" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="88.267693" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="39.10614" + id="text2-561-472"><tspan + sodipodi:role="line" + id="tspan2-15-40" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.185208;stroke-dasharray:none" + x="98.816223" + y="39.10614">0</tspan></text> + </g> + </g> + <g + id="g2"> + <rect + style="display:inline;fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.997822" + id="rect1-3" + width="105.6349" + height="42.134895" + x="113.70769" + y="0.099218339" + inkscape:label="rect1-3" /> + <g + id="g162"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="7.7111459" + id="text2-562"><tspan + sodipodi:role="line" + id="tspan2-91" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="7.7111459" + id="text2-8-2"><tspan + sodipodi:role="line" + id="tspan2-9-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="7.7111459">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="7.7111459" + id="text2-1-0"><tspan + sodipodi:role="line" + id="tspan2-2-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="7.7111459">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="148.99649" + y="7.7111459" + id="text2-9-3"><tspan + sodipodi:role="line" + id="tspan2-4-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.99649" + y="7.7111459">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="18.205606" + id="text2-5-0"><tspan + sodipodi:role="line" + id="tspan2-0-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="18.205606">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="18.205606" + id="text2-0-2"><tspan + sodipodi:role="line" + id="tspan2-6-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="18.205606">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="18.205606" + id="text2-6-1"><tspan + sodipodi:role="line" + id="tspan2-1-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="149.00734" + y="18.205606" + id="text2-7-7"><tspan + sodipodi:role="line" + id="tspan2-65-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.00734" + y="18.205606">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.54048" + y="18.205606" + id="text2-74-2"><tspan + sodipodi:role="line" + id="tspan2-5-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="18.205606">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.11974" + y="18.205606" + id="text2-744-2"><tspan + sodipodi:role="line" + id="tspan2-3-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="18.205606">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.86177" + y="18.205606" + id="text2-68-7"><tspan + sodipodi:role="line" + id="tspan2-8-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.86177" + y="18.205606">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.38344" + y="18.205606" + id="text2-4-9"><tspan + sodipodi:role="line" + id="tspan2-92-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.38344" + y="18.205606">8</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="28.78894" + id="text2-92-2"><tspan + sodipodi:role="line" + id="tspan2-66-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="28.78894">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="28.78894" + id="text2-04-9"><tspan + sodipodi:role="line" + id="tspan2-87-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="28.78894">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="28.78894" + id="text2-72-3"><tspan + sodipodi:role="line" + id="tspan2-26-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="28.78894">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="149.02284" + y="28.78894" + id="text2-15-1"><tspan + sodipodi:role="line" + id="tspan2-94-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="149.02284" + y="28.78894">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.54048" + y="28.78894" + id="text2-17-9"><tspan + sodipodi:role="line" + id="tspan2-7-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.54048" + y="28.78894">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.11974" + y="28.78894" + id="text2-97-1"><tspan + sodipodi:role="line" + id="tspan2-76-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.11974" + y="28.78894">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="117.23864" + y="39.107689" + id="text2-56-4"><tspan + sodipodi:role="line" + id="tspan2-39-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="117.23864" + y="39.107689">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="127.74201" + y="39.107689" + id="text2-2-8"><tspan + sodipodi:role="line" + id="tspan2-93-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="127.74201" + y="39.107689">1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="138.21565" + y="39.107689" + id="text2-85-5"><tspan + sodipodi:role="line" + id="tspan2-09-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="138.21565" + y="39.107689">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.48466" + y="7.7095962" + id="text2-561-3"><tspan + sodipodi:role="line" + id="tspan2-15-61" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.06393" + y="7.7095962" + id="text2-561-8-0"><tspan + sodipodi:role="line" + id="tspan2-15-1-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="7.7095962" + id="text2-561-4-3"><tspan + sodipodi:role="line" + id="tspan2-15-4-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="7.7095962">2</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="7.7095962" + id="text2-561-6-0"><tspan + sodipodi:role="line" + id="tspan2-15-3-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="7.7095962" + id="text2-561-9-1"><tspan + sodipodi:role="line" + id="tspan2-15-6-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="7.7095962">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="7.7095962" + id="text2-561-85-5"><tspan + sodipodi:role="line" + id="tspan2-15-7-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="7.7095962">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="18.204056" + id="text2-561-5-7"><tspan + sodipodi:role="line" + id="tspan2-15-9-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="18.204056">4</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="18.204056" + id="text2-561-88-5"><tspan + sodipodi:role="line" + id="tspan2-15-31-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="18.204056">7</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="28.78739" + id="text2-561-43-9"><tspan + sodipodi:role="line" + id="tspan2-15-33-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="28.78739" + id="text2-561-48-7"><tspan + sodipodi:role="line" + id="tspan2-15-8-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="28.78739" + id="text2-561-7-5"><tspan + sodipodi:role="line" + id="tspan2-15-64-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="28.78739">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="28.78739" + id="text2-561-0-5"><tspan + sodipodi:role="line" + id="tspan2-15-92-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="28.78739">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="148.96703" + y="39.10614" + id="text2-561-59-7"><tspan + sodipodi:role="line" + id="tspan2-15-46-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="148.96703" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="159.48466" + y="39.10614" + id="text2-561-47-4"><tspan + sodipodi:role="line" + id="tspan2-15-75-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="159.48466" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="170.06393" + y="39.10614" + id="text2-561-2-0"><tspan + sodipodi:role="line" + id="tspan2-15-89-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="170.06393" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="180.80597" + y="39.10614" + id="text2-561-02-8"><tspan + sodipodi:role="line" + id="tspan2-15-10-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="180.80597" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="191.32764" + y="39.10614" + id="text2-561-08-8"><tspan + sodipodi:role="line" + id="tspan2-15-5-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="191.32764" + y="39.10614">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="201.87616" + y="39.10614" + id="text2-561-62-4"><tspan + sodipodi:role="line" + id="tspan2-15-58-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="201.87616" + y="39.10614">0</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;stroke-width:0.264583" + x="212.4247" + y="39.10614" + id="text2-561-472-1"><tspan + sodipodi:role="line" + id="tspan2-15-40-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Roboto;-inkscape-font-specification:Roboto;stroke-width:0.264583" + x="212.4247" + y="39.10614">0</tspan></text> + </g> + <path + d="M 113.60847,4.9e-7 V 42.333333 M 124.19181,4.9e-7 V 42.333333 M 134.77514,4.9e-7 V 42.333333 M 145.35848,4.9e-7 V 31.75 42.333333 M 155.94181,4.9e-7 V 10.583334 42.333333 M 166.52514,4.9e-7 V 42.333333 M 177.10847,4.9e-7 V 21.166667 31.75 42.333333 M 187.69181,4.9e-7 V 42.333333 M 198.27514,4.9e-7 V 10.583334 21.166667 42.333333 M 208.85847,4.9e-7 V 42.333333 M 219.44181,4.9e-7 V 42.333333 M 113.60847,4.9e-7 H 219.44181 M 113.60847,10.583334 H 219.44181 M 113.60847,21.166667 H 219.44181 M 113.60847,31.75 H 219.44181 M 113.60847,42.333333 h 105.83334" + style="display:inline;fill:none;stroke:#000000;stroke-width:0.185208;stroke-dasharray:none" + id="path2-5" + sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccc" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ConcaveTriangle)" + d="M 55.816597,24.105236 C 41.389995,20.177652 31.793045,23.852493 31.793045,23.852493" + id="path3" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ConcaveTriangle-8)" + d="m 153.67709,24.084229 c 20.34552,-3.927584 33.87988,-0.252743 33.87988,-0.252743" + id="path3-0" + sodipodi:nodetypes="cc" /> + </g> +</svg> diff --git a/doc/source/img/gitlab_guide.svg b/doc/source/img/gitlab_guide.svg new file mode 100644 index 0000000000000000000000000000000000000000..40eef34ac97a2181ccb1570fde69b2e8b9d4810b --- /dev/null +++ b/doc/source/img/gitlab_guide.svg @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="170.89041mm" + height="98.375633mm" + viewBox="0 0 170.89041 98.375637" + version="1.1" + id="svg1" + xml:space="preserve" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" + sodipodi:docname="gitlab_guide.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="1.3707237" + inkscape:cx="250.96232" + inkscape:cy="302.03023" + inkscape:current-layer="layer1" /><defs + id="defs1"><marker + style="overflow:visible" + id="Triangle-2-6" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Triangle arrow" + markerWidth="0.5" + markerHeight="0.5" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"><path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 5.77,0 -2.88,5 V -5 Z" + id="path135-5-0" /></marker><marker + style="overflow:visible" + id="Triangle-2-6-7" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Triangle arrow" + markerWidth="0.5" + markerHeight="0.5" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"><path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 5.77,0 -2.88,5 V -5 Z" + id="path135-5-0-9" /></marker><marker + style="overflow:visible" + id="Triangle-2-6-5" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Triangle arrow" + markerWidth="0.5" + markerHeight="0.5" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"><path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 5.77,0 -2.88,5 V -5 Z" + id="path135-5-0-92" /></marker></defs><g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-201.38576,71.143787)"><text + xml:space="preserve" + style="font-size:5.64444px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="319.32074" + y="-18.439745" + id="text2-8-2"><tspan + sodipodi:role="line" + id="tspan2-8-9" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="319.32074" + y="-18.439745">Pull changes</tspan></text><text + xml:space="preserve" + style="font-size:5.64444px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="268.61737" + y="-62.437073" + id="text2-8-2-6"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="268.61737" + y="-62.437073" + id="tspan4">Create merge</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="268.61737" + y="-55.275597" + id="tspan5">request</tspan></text><text + xml:space="preserve" + style="font-size:5.64444px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="218.24463" + y="-18.439745" + id="text2-8-2-8"><tspan + sodipodi:role="line" + id="tspan2-8-9-4" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="218.24463" + y="-18.439745">Push changes</tspan></text><g + id="g4" + transform="translate(-0.10392884)"><rect + style="fill:#29485d;fill-opacity:1;stroke:none;stroke-width:0.290054" + id="rect2-2-3" + width="61.07412" + height="37.467552" + x="256.39783" + y="-10.235707" + ry="4.4139304" + rx="4.4139304" /><text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0;stroke-width:0.264583" + x="266.30292" + y="-2.6874678" + id="text2-4-9-8"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" + x="266.30292" + y="-2.6874678" + id="tspan6">Local repository</tspan></text></g><g + id="g1" + transform="translate(0,-0.71027677)"><rect + style="fill:#29485d;fill-opacity:1;stroke:none;stroke-width:0.290054" + id="rect2-2-3-3" + width="61.07412" + height="37.467552" + x="201.38576" + y="-70.43351" + ry="4.4139304" + rx="4.4139304" /><text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0;stroke-width:0.264583" + x="209.40707" + y="-50.183891" + id="text2-4-9-8-5"><tspan + sodipodi:role="line" + id="tspan2-4-6-5-6" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" + x="209.40707" + y="-50.183891">Forked repository</tspan></text></g><g + id="g2" + transform="translate(33.174917,1.4628113)"><rect + style="fill:#29485d;fill-opacity:1;stroke:none;stroke-width:0.290054" + id="rect2-2-3-2" + width="61.07412" + height="37.467552" + x="278.02713" + y="-72.606598" + ry="4.4139304" + rx="4.4139304" /><text + xml:space="preserve" + style="font-size:6.35px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0;stroke-width:0.264583" + x="286.19727" + y="-52.356979" + id="text2-4-9-8-7"><tspan + sodipodi:role="line" + id="tspan2-4-6-5-0" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ffffff;fill-opacity:1;stroke-width:0.264583" + x="286.19727" + y="-52.356979">kmos3 repository</tspan></text></g><path + style="fill:none;fill-opacity:1;stroke:#29485d;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle-2-6)" + d="m 263.94089,-12.877687 -6.35613,-11.00914 -2.31553,-4.010624" + id="path3-0-6" + sodipodi:nodetypes="ccc" /><path + style="fill:none;fill-opacity:1;stroke:#29485d;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle-2-6-5)" + d="m 266.69088,-49.292579 h 26.78252 l 9.75686,-8e-6" + id="path3-0-6-9" + sodipodi:nodetypes="ccc" /><path + style="fill:none;fill-opacity:1;stroke:#29485d;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Triangle-2-6-7)" + d="m 318.84903,-29.18511 -6.35613,11.009139 -2.31554,4.01062" + id="path3-0-6-2" + sodipodi:nodetypes="ccc" /><rect + style="fill:#d9d9d9;fill-opacity:1;stroke:none;stroke-width:0.158037" + id="rect1-6-5" + width="55.819664" + height="23.162973" + x="258.92111" + y="0.61407042" + ry="3.6116412" + rx="3.6116412" /><text + xml:space="preserve" + style="font-size:5.64444px;line-height:1.25;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:none;letter-spacing:0px;word-spacing:0px;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="261.07266" + y="6.5774841" + id="text2-8-2-4"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="261.07266" + y="6.5774841" + id="tspan9">edit source on side</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="261.07266" + y="13.738958" + id="tspan10">branch based on the</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:none;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#29485d;fill-opacity:1;stroke-width:0.264583" + x="261.07266" + y="20.900433" + id="tspan11">"develop" branch </tspan></text></g></svg> diff --git a/doc/source/topic_guides/index.rst b/doc/source/topic_guides/index.rst index 188ae46086b7f851aa62c0d30ca7217eb3fe84ee..967277cccf07d71b24158efbc1f31800d61661f3 100644 --- a/doc/source/topic_guides/index.rst +++ b/doc/source/topic_guides/index.rst @@ -15,13 +15,12 @@ useful for using kmos3. kmc_concept workflows - data_models kmos3_speed + data_models + coord_syntax + proc_syntax lateral_interaction temporal_acceleration - proc_syntax - coord_syntax - developers_guide .. Convergence Tests .. The Editor Frontend diff --git a/doc/source/topic_guides/otf_backend.rst b/doc/source/topic_guides/otf_backend.rst index a42eccae5c923bf1ed0e8562a2e5bef71ac25745..615c00e5dfc3bff144de74368c4e094a7529079f 100644 --- a/doc/source/topic_guides/otf_backend.rst +++ b/doc/source/topic_guides/otf_backend.rst @@ -1,3 +1,5 @@ +.. _otf_backend: + The otf Backend --------------- diff --git a/doc/source/tutorials/index.rst b/doc/source/tutorials/index.rst index 3bd14524845e3733d9ea79da06916682dd821c7a..89dbde5f59db76c9aeaf107aa3896b615ce72d32 100644 --- a/doc/source/tutorials/index.rst +++ b/doc/source/tutorials/index.rst @@ -1,3 +1,5 @@ +.. _tutorials: + ========= Tutorials =========