Commit 214d84ef authored by Antoine Berchet's avatar Antoine Berchet
Browse files

Automatic documentation of plugins from __init__.py

parent 6855b447
......@@ -26,6 +26,7 @@ import copy
import glob
import sys
import shutil
from io import StringIO
import pkgutil
import os
......@@ -254,36 +255,50 @@ def doc_from_arginputs(input_arguments, write_headers=True):
])
key_arg = input_arguments[arg]
towrite.append(":{}:".format(arg))
towrite.append("**{}**:".format(arg))
default = key_arg.get("default", None)
option = "(optional)" if default is not None \
or key_arg.get("optional", False) \
else "(**mandatory**)"
default = ": {}".format(default) if default is not None else ""
towrite.append(" " + option + default)
towrite[-1] = towrite[-1] + " " + option + default
towrite.append("")
towrite.append(" " + key_arg.get("doc", ""))
# Deal with complex multilines docstrings
if "\n" in key_arg.get("doc", ""):
indentations = [len(s) - len(s.lstrip())
for s in key_arg.get("doc", "").split("\n")]
ref_indent = min([i for i in indentations if i > 0])
noindent_doc = [
ln if ln == ""
else " " + ln[ref_indent:]
for ln in key_arg.get("doc", "").split("\n")
]
towrite.extend(noindent_doc)
else:
towrite.append(" " + key_arg.get("doc", ""))
towrite.append("")
if "accepted" in key_arg:
accepted = key_arg["accepted"]
if type(accepted) is list:
towrite.append(" :accepted values:")
towrite.append(" {}".format(accepted))
towrite.append(" **accepted values**: {}".format(accepted))
elif type(accepted) is dict:
towrite.append(" :accepted values:")
towrite.append(" **accepted values**:")
for key in accepted:
towrite.append(" :{}:".format(key))
towrite.append(" {}".format(accepted[key]))
towrite.append(" {}: {}".format(key, accepted[key]))
else:
towrite.append(" :accepted type:")
towrite.append(" {}".format(accepted))
towrite.append(" **accepted type**: {}".format(accepted))
towrite.append("")
if "structure" in key_arg:
towrite.append(" :accepted structure:")
towrite.append(" **accepted structure**:")
structure_string = \
doc_from_arginputs(key_arg["structure"],
write_headers=False)
......@@ -291,28 +306,21 @@ def doc_from_arginputs(input_arguments, write_headers=True):
structure_string = [" " + s for s in structure_string]
towrite.extend(structure_string)
towrite.append("")
return towrite
def process_pycif_keywords(app, what, name, obj, options, lines):
def process_pycif_keywords(app, what, obj_name, obj, options, lines):
"""Process standard pycif keywords.
It includes:
- requirements
- default_values
- mandatory_values
"""
# Add description header
if not(lines == [] or np.all(np.array(lines == ""))):
towrite = [
"Description",
"-----------",
"",
""
]
for l in towrite[::-1]:
lines.insert(0, l)
ref_lines = copy.deepcopy(lines)
# Adding bash highlight by default
lines.insert(0, ".. role:: bash(code)")
lines.insert(1, " :language: bash")
......@@ -325,10 +333,22 @@ def process_pycif_keywords(app, what, name, obj, options, lines):
if what == "function":
return
# Add description header
if not(ref_lines == [] or np.all(np.array(ref_lines == ""))):
description = [
"Description",
"-----------",
"",
""
]
for l in description[::-1]:
lines.insert(0, l)
# Deal with class general arguments
try:
module = importlib.import_module(".".join(name.split(".")[:-1]))
module = importlib.import_module(".".join(obj_name.split(".")[:-1]))
input_arguments = copy.deepcopy(module.input_arguments)
except:
input_arguments = {}
......@@ -389,7 +409,7 @@ def process_pycif_keywords(app, what, name, obj, options, lines):
newplg = key_req.get("newplg", False)
towrite.extend((
" * - {}\n"
" - :doc:`{}</documentation/plugins/{}/index>` \n"
" - :doc:`{}</documentation/plg_autodoc/{}/index>` \n"
" - {}\n"
" - {}\n"
" - {}\n"
......@@ -457,7 +477,7 @@ def process_pycif_keywords(app, what, name, obj, options, lines):
towrite = [i for ln in towrite for i in ln.split("\n")]
lines.extend(towrite)
def build_rst_from_yml(app):
"""Generate rst files from yaml examples"""
......@@ -476,9 +496,9 @@ def build_rst_from_yml(app):
# Generate indexes
index_file = "{}/index.rst".format(subdir)
with open(index_file, "w") as f:
f.write("###############################\n"
f.write("#####################################\n"
"Examples for {}\n"
"###############################\n".format(model_name))
"#####################################\n".format(model_name))
f.write("The following yaml configuration files are available: "
"\n\n")
......@@ -521,7 +541,7 @@ def build_rst_from_plugins(app):
".. toctree::",
" :maxdepth: 3",
"",
" ../plugins/dependencies"
" ../dependencies"
] + [
" {}/index".format(Plugin.plugin_types[plg_type][0][1:])
for plg_type in Plugin.plugin_types
......@@ -542,7 +562,6 @@ def build_rst_from_plugins(app):
plg_type_dir = "{}/{}".format(
plg_dir, Plugin.plugin_types[plg_type][0][1:])
init_dir(plg_type_dir)
print(plg_type_dir)
# Loop over modules of this class
package_path = "pycif.plugins{}".format(Plugin.plugin_types[plg_type][0])
......@@ -563,8 +582,12 @@ def build_rst_from_plugins(app):
file_name = "{}/{}.rst".format(
plg_type_dir, loc_mod.__name__.split(".")[-1])
title = "{} / {}".format(loc_mod._name,
getattr(loc_mod, "_version", "std"))
title = ":bash:`{}` / :bash:`{}`".format(
loc_mod._name, getattr(loc_mod, "_version", "std"))
if hasattr(loc_mod, "_fullname"):
title = "{} ({})".format(loc_mod._fullname, title)
towrite = [
".. role:: bash(code)",
" :language: bash",
......@@ -578,7 +601,6 @@ def build_rst_from_plugins(app):
]
with open(file_name, "w") as f:
print(file_name)
f.write("\n".join(towrite))
# Append name for plugin type index
......@@ -590,7 +612,7 @@ def build_rst_from_plugins(app):
# Write the plugin type index
title = list(Plugin.plugin_types[plg_type][0][1:])
title[0] = title[0].upper()
title = "".join(title)
title = "".join(title) + " (:bash:`{}`)".format(plg_type)
towrite = [
".. role:: bash(code)",
" :language: bash",
......@@ -601,7 +623,8 @@ def build_rst_from_plugins(app):
len(title) * "#",
""] + ([
".. contents:: Contents",
" :local:"
" :local:",
""
] if import_package.__doc__ is not None else []) + [
"Available {}".format(title),
(len(title) + 11) * "=",
......@@ -609,7 +632,7 @@ def build_rst_from_plugins(app):
"The following :bash:`{}` are implemented in pyCIF so far:".format(
Plugin.plugin_types[plg_type][0][1:]),
"",
".. toctree::"
".. toctree::",
"",
] + [
" {}".format(plg) for plg in package_index
......@@ -619,10 +642,15 @@ def build_rst_from_plugins(app):
else []
)
with open("{}/index.rst".format(plg_type_dir), "w") as f:
print("{}/index.rst".format(plg_type_dir))
f.write("\n".join(towrite))
# Generate available list
s = StringIO()
Plugin.print_registered(print_rst=True, print_requirement=True, stream=s)
with open("{}/available.rst".format(plg_dir), "w") as f:
f.write(s.getvalue())
def clean_rst_from_yaml(app, exception):
"""Remove rst files generated from yaml examples"""
......
......@@ -8,6 +8,7 @@ Run pycif with this yaml: the new plugin will simply perform what is in the temp
a) :bash:`fetch.py` to match the required files to the time intervals to cover.
.. autofunction:: fetch
:noindex:
b) :bash:`get_domain.py` to get the information on the original domain. WARNING: you do not need a get_domain.py script only if the available files are provided on a domain that can be **and acutally is** specified in the yaml file XXX CHECK with ANTOINE + LINK to tuto yaml XXX
......
.. role:: bash(code)
:language: bash
Have a yaml file ready with a simulation that works with known plugins. For the :doc:`obsoperator</documentation/plugins/obsoperators/index>`, choose the optional argument :bash:`onlyinit` so that only the inputs are computedXXXX CHECK THIS OPTION ACTUALLY DOES THISXXXX, not the whole simulation.
Have a yaml file ready with a simulation that works with known plugins.
For the :doc:`obsoperator</documentation/plg_autodoc/obsoperators/index>`,
choose the optional argument :bash:`onlyinit` so that only the inputs are computed
XXXX CHECK THIS OPTION ACTUALLY DOES THISXXXX, not the whole simulation.
.. code-block:: yaml
......
......@@ -36,7 +36,7 @@ XXXXXXX what about the input arguments? Ils demandent une partie dediee!?XXXXXXX
a) .. include:: readme.rst
b) create the rst file that contains the automatic documentation in docs/source/documentation/plugins/fields/. Please provide it with a self-explaining name. Example for the template: file bc_template.rst reads
b) create the rst file that contains the automatic documentation in docs/source/documentation/plg_autodoc/fields/. Please provide it with a self-explaining name. Example for the template: file bc_template.rst reads
.. code-block:: rest
......@@ -49,7 +49,7 @@ XXXXXXX what about the input arguments? Ils demandent une partie dediee!?XXXXXXX
.. automodule:: pycif.plugins.fields.bc_plugin_template
c) add the reference to the rst file in docs/source/documentation/plugins/fields/index.rst:
c) add the reference to the rst file in docs/source/documentation/plg_autodoc/fields/index.rst:
.. code-block:: rest
......@@ -71,6 +71,6 @@ XXXXXXX what about the input arguments? Ils demandent une partie dediee!?XXXXXXX
bc_template
chimere_icbc
d) built the documentation (:bash:`make html` in docs/) and check that the link to the new plugin appears in the documentation at file:///your_path/cif/docs/build/html/documentation/plugins/index.html and that the section "doc" of the input arguments is correctly displayed at file:///your_path/cif/docs/build/html/documentation/plugins/fields/the_new_plugin.html
d) built the documentation (:bash:`make html` in docs/) and check that the link to the new plugin appears in the documentation at file:///your_path/cif/docs/build/html/documentation/plg_autodoc/index.html and that the section "doc" of the input arguments is correctly displayed at file:///your_path/cif/docs/build/html/documentation/plg_autodoc/fields/the_new_plugin.html
......@@ -38,7 +38,7 @@ XXXXXXX what about the input arguements? Ils demandent une partie dediee!?XXXXXX
a) .. include:: ../newBCdata/readme.rst
b) create the rst file that contains the automatic documentation in docs/source/documentation/plugins/fluxes/. Please provide it with a self-explaining name. Example for the template: file fluxes_template.rst reads
b) create the rst file that contains the automatic documentation in docs/source/documentation/plg_autodoc/fluxes/. Please provide it with a self-explaining name. Example for the template: file fluxes_template.rst reads
.. code-block:: rest
......@@ -51,7 +51,7 @@ XXXXXXX what about the input arguements? Ils demandent une partie dediee!?XXXXXX
.. automodule:: pycif.plugins.fluxes.flux_plugin_template
c) add the reference to the rst file in docs/source/documentation/plugins/fluxes/index.rst:
c) add the reference to the rst file in docs/source/documentation/plg_autodoc/fluxes/index.rst:
.. code-block:: rest
......@@ -76,5 +76,5 @@ XXXXXXX what about the input arguements? Ils demandent une partie dediee!?XXXXXX
lmdz_bin
lmdz_sflx
d) built the documentation (:bash:`make html` in docs/) and check that the link to the new plugin appears in the documentation at file:///your_path/cif/docs/build/html/documentation/plugins/index.html and that the section "doc" of the input arguments is correctly displayed at file:///your_path/cif/docs/build/html/documentation/plugins/fluxes/the_new_plugin.html
d) built the documentation (:bash:`make html` in docs/) and check that the link to the new plugin appears in the documentation at file:///your_path/cif/docs/build/html/documentation/plg_autodoc/index.html and that the section "doc" of the input arguments is correctly displayed at file:///your_path/cif/docs/build/html/documentation/plg_autodoc/fluxes/the_new_plugin.html
......@@ -19,7 +19,7 @@ It consists in filling the following columns of the observation datastore:
* tstep_glo
* dtstep
Details on these columns are given :doc:`here<../../documentation/monitor>`.
Details on these columns are given :doc:`here<../../documentation/input-outputs/monitor>`.
This step is done automatically by the pycif class :bash:`obsvect`.
It is possible to do the processing using the Yaml configuration :doc:`here<Yaml_obsvect>`.
......@@ -35,7 +35,7 @@ You should be returned the following error:
Please check your Yaml
This error is returned when a given :bash:`plugin` has :bash:`requirements` that are not fulfilled.
Further details :doc:`here<../../documentation/plugins/dependencies>`.
Further details :doc:`here<../../documentation/plg_autodoc/dependencies>`.
In the present case, the :bash:`obsvect` plugin requires a :bash:`model` (yours!) to work.
Therefore, you need to add a :bash:`model` paragraph to your Yaml configuration file:
......@@ -52,7 +52,7 @@ Therefore, you need to add a :bash:`model` paragraph to your Yaml configuration
# Some other attributes
Examples of Yaml configuration attributes for :bash:`model` plugins are given
:doc:`here</configuration/models/index>`.
:doc:`here</documentation/configuration/models/index>`.
Temporal fit to the model time steps
......@@ -127,7 +127,7 @@ initialization of the :bash:`obsvect` plugin.
To allow the :bash:`obsvect` plugin to compute observation grid cells, the :bash:`model` plugin needs to be initialized
with a :bash:`domain` plugin attached to it.
To do this, please follow steps explained :doc:`here</devtutos/newplugin/newplugin>` and :doc:`here<../../documentation/plugins/dependencies>`.
To do this, please follow steps explained :doc:`here</devtutos/newplugin/newplugin>` and :doc:`here<../../documentation/plg_autodoc/dependencies>`.
.. hint::
......
......@@ -6,7 +6,7 @@ Comparing outputs to observations
:language: bash
Once observations are implemented in the model, the next step is to compare them with model outputs.
The objective of the present step is to "run" pyCIF in :doc:`forward mode</configuration/modes/forward>`
The objective of the present step is to "run" pyCIF in :doc:`forward mode</documentation/configuration/modes/forward>`
and produce a file comparing prescribed observations with simulations.
It is assumed that all inputs and outputs from a pre-existing simulations are available for your model.
......
......@@ -3,7 +3,7 @@ Create and register the plugin module
#####################################
Here, one should add the model to the list of model plugins recognized by the CIF.
The list of available plugins can be accessed :doc:`here<../../documentation/plugins/available>`
The list of available plugins can be accessed :doc:`here<../../documentation/plg_autodoc/available>`
1. Go to the directory "pycif/plugins/models/"
2. Make an empty directory named according to your model.
......@@ -16,12 +16,12 @@ The list of available plugins can be accessed :doc:`here<../../documentation/plu
cd your/model
touch __init__.py
4. Edit the register.py file and add the following lines:
4. Edit the __init__.py file and add the following lines:
.. code-block:: python
import your-new-model
Model.register_plugin('Your-Model-Name', 'Some-version', your-new-model)
_name = "YOUR MODEL NAME"
_version = "YOUR MODEL VERSION (optional)"
When registering, pay attention to not replicate an already existing model!
......
......@@ -6,7 +6,7 @@ How to add, register and initialize a new plugin
:language: bash
pyCIF is organized around so-called :bash:`plugins` interacting with each other.
Further details about :bash:`plugins` are given :doc:`here<../../documentation/plugins/index>`.
Further details about :bash:`plugins` are given :doc:`here<../../documentation/plg_autodoc/index>`.
Here, you will learn how to add a new :bash:`plugins` of any type.
Adding a :bash:`plugin` to pyCIF
......@@ -55,7 +55,7 @@ Adding requirements to your :bash:`plugin`
All :bash:`plugins` are not stand-alone modules, but instead need attributes, data or functions from other plugins.
pyCIF allows you to easily interface :bash:`plugins` with each other through so-called :bash:`requirements`.
Further details on requirements can be found :doc:`here<../../documentation/plugins/dependencies>`.
Further details on requirements can be found :doc:`here<../../documentation/plg_autodoc/dependencies>`.
Information about :bash:`requirements` are specified in the :bash:`__init__.py` file of your :bash:`plugin`.
Below is an example of requirements for the :bash:`model` CHIMERE:
......@@ -102,7 +102,7 @@ The content of the :bash:`requirements` python dictionary is interpreted when a
Requirements are fulfilled with regards to the Yaml configuration file.
Depending the values of the arguments, :bash:`name`, :bash:`version`, :bash:`empty` :bash:`any`, pyCIF will need the
:bash:`requirement` to be explicitly specified or not, default :bash:`plugins` could be used, etc.
All details on how this works are given :doc:`here<../../documentation/plugins/dependencies>`.
All details on how this works are given :doc:`here<../../documentation/plg_autodoc/dependencies>`.
Input arguments for your :bash:`plugin`
----------------------------------------
......
......@@ -6,9 +6,9 @@ Using the CIF in Docker
:language: bash
A docker image has been generated to easily run the CIF within a Docker container.
This Docker image allows new users to try academic examples with a :doc:`Gaussian plume model<documentation/plugins/models/dummy>`.
This Docker image allows new users to try academic examples with a :doc:`Gaussian plume model</documentation/plg_autodoc/models/dummy>`.
In principle, more complex cases with full-physics numerical transport models could work on the Docker container,
but this was only tested with the model :doc:`CHIMERE<documentation/plugins/models/chimere>` so far,
but this was only tested with the model :doc:`CHIMERE</documentation/plg_autodoc/models/chimere>` so far,
and it requires some extra knowledge on
how to use Docker to be able to use datasets from your cluster.
......
......@@ -51,5 +51,5 @@ Requirements
CONGRAD requires the following plugins to be executed properly:
1. a :doc:`simulator </configuration/simulators/index>` to compute function
1. a :doc:`simulator </documentation/configuration/simulators/index>` to compute function
to minimize; optional: default is (:bash:`gausscost`, :bash:`std`)
......@@ -25,7 +25,7 @@ The algorithm requires the following arguments:
- :bash:`maxiter`: maximum number of iterations; if one of the two previous
is missing,:bash:`niter` is set to:bash:`maxiter` and:bash:`nsim` to 2 times
:bash:`maxiter`
:bash:`maxiter`
- :bash:`dxmin`: absolute precision on x; optional; default is 1e-20
......@@ -40,6 +40,7 @@ The algorithm requires the following arguments:
- :bash:`m`: number of updates; optional; default is 5; for expert users
only
A Yaml template presents as follows:
.. code-block:: Yaml
......@@ -60,5 +61,5 @@ Requirements
------------
M1QN3 requires the following plugins to be executed properly: 1. a
:doc:`simulator </configuration/simulators/index>` to compute function
:doc:`simulator </documentation/configuration/simulators/index>` to compute function
to minimize; optional: default is (:bash:`gausscost`,:bash:`std`)
......@@ -8,7 +8,7 @@ LMDZ-Dispersion-SACS
LMDZ-Dispersion is the offline version of the Global Circulation Model
LMDZ. It was originally customized to be interfaced with `PYVAR <https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2005JD006390>`__.
The PYVAR interface was adapted to be implemented to the CIF.
More details can be found :doc:`here</documentation/plugins/models/lmdz>`.
More details can be found :doc:`here</documentation/plg_autodoc/models/lmdz>`.
pyCIF requires the following arguments to set a LMDZ simulation up:
......
......@@ -87,21 +87,21 @@ Requirements
The adjoint test requires the following plugins to be executed properly:
1. an :doc:`observation operator </configuration/obsoper/index>` to
1. an :doc:`observation operator </documentation/configuration/obsoper/index>` to
compute :math:`\mathbf{x} \rightarrow \mathcal{H}(\mathbf{x})` and its
adjoint; optional: default is (`standard`, :bash:`std`)
2. a :doc:`control vector </configuration/controlvect/index>` to define the control
2. a :doc:`control vector </documentation/configuration/controlvect/index>` to define the control
vector shape and corresponding operations; mandatory
3. an :doc:`observation vector </configuration/obsvect/index>` to define observations to
3. an :doc:`observation vector </documentation/configuration/obsvect/index>` to define observations to
be compared with; mandatory
The following plugins are indirectly needed to compute the test of the adjoint,
through the observation operator (see details
:doc:`here </configuration/obsoper/index>`):
:doc:`here </documentation/configuration/obsoper/index>`):
1. a :doc:`numerical model </configuration/models/index>`; mandatory
1. a :doc:`numerical model </documentation/configuration/models/index>`; mandatory
Example
......
......@@ -18,7 +18,7 @@ a minimizer to be computed, which itself requires a so-called
''simulator'', i.e. the function to minimize (at the moment, the default
function is the Bayesian Gaussian cost function).
Details on the minimizers are given :doc:`here </configuration/minimizers/index>`.
Details on the minimizers are given :doc:`here </documentation/configuration/minimizers/index>`.
The Yaml paragraph corresponding to a variational run is as follows:
......@@ -47,22 +47,22 @@ Requirements
A variational inversion requires the following plugins to be executed
properly:
1. a :doc:`control vector </configuration/controlvect/index>`
1. a :doc:`control vector </documentation/configuration/controlvect/index>`
to define the control vector shape and corresponding operations;
mandatory
2. an :doc:`observation vector </configuration/obsvect/index>` to define observations to
2. an :doc:`observation vector </documentation/configuration/obsvect/index>` to define observations to
be compared with; mandatory
3. an :doc:`minimizer </configuration/minimizers/index>` to optimize the
3. an :doc:`minimizer </documentation/configuration/minimizers/index>` to optimize the
function; optional; default is (:bash:`m1qn3`, :bash:`std`)
The following plugins are indirectly needed to compute a variational
inversion:
1. a :doc:`numerical model </configuration/models/index>`; mandatory
1. a :doc:`numerical model </documentation/configuration/models/index>`; mandatory
2. an :doc:`observation operator </configuration/obsoper/index>` to compute
2. an :doc:`observation operator </documentation/configuration/obsoper/index>` to compute
:math:`\mathbf{x} \rightarrow \mathcal{H}(\mathbf{x})` and its adjoint;
optional: default is (:bash:`standard`, :bash:`std`)
......
......@@ -20,9 +20,9 @@ The observation vector loads functions, but also observation data. This
is done with the following arguments:
- :bash:`file_obsvect`: the file with the observation data (see
:doc:`here </configuration/file_formats>` for
:doc:`here </documentation/configuration/file_formats>` for
further details on the format); optional; if not specified, tries
computing measurements as set-up :doc:`here </configuration/measurements/index>`; if computation
computing measurements as set-up :doc:`here </documentation/configuration/measurements/index>`; if computation
fails (due to, e.g., empty measurements), passes an empty data store
for later operations
......@@ -45,9 +45,9 @@ Requirements
The observation vector requires the following plugins to be executed
properly:
1. :doc:`measurements </configuration/measurements/index>`
1. :doc:`measurements </documentation/configuration/measurements/index>`
storing un-processed observations; optional: default is an empty
datastore
2. a :doc:`model </configuration/models/index>` to define the
2. a :doc:`model </documentation/configuration/models/index>` to define the
control vector shape and corresponding operations; mandatory
......@@ -22,7 +22,7 @@ The defining equation is:
+ \frac{1}{2} (\mathcal{H}(\mathbf{x}) - \mathbf{y}^\textrm{o})^\textrm{T}\mathbf{R}^{-1}(\mathcal{H}(\mathbf{x}) - \mathbf{y}^\textrm{o})
As a quadratic form on a finite dimension space, it necessary has a
global minimum that can be fund with available :doc:`minimizers </configuration/minimizers/index>` (which do not
global minimum that can be fund with available :doc:`minimizers </documentation/configuration/minimizers/index>` (which do not
necessarily guarantee that the computed minimum is the global minimum).
The basic Gaussian cost function does not require specifi configuration
......@@ -42,17 +42,17 @@ Requirements
The Bayesian Gaussian cost function requires the following plugins to be
executed properly:
1. a :doc:`control vector </configuration/controlvect/index>` to define the control
1. a :doc:`control vector </documentation/configuration/controlvect/index>` to define the control
vector shape and corresponding operations; mandatory
2. an :doc:`observation vector </configuration/obsvect/index>` to define observations to
2. an :doc:`observation vector </documentation/configuration/obsvect/index>` to define observations to
be compared with; mandatory
3. an :doc:`observation operator </configuration/obsoper/index>` to compute
3. an :doc:`observation operator </documentation/configuration/obsoper/index>` to compute
:math:`\mathbf{x} \rightarrow \mathcal{H}(\mathbf{x})` and its adjoint;
optional: default is (:bash:`standard`, :bash:`std`)
The following plugins are indirectly needed to compute a variational
inversion:
1. a :doc:`numerical model </configuration/models/index>`; mandatory
1. a :doc:`numerical model </documentation/configuration/models/index>`; mandatory
......@@ -42,7 +42,7 @@ There are two main tpes of dependencies in pyCIF:
2. :bash:`plugin A` needs data from :bash:`plugin B`
Similarly, data format needs to follow a specified standardized format
Below is an example graph of dependencies corresponding to the pyCIF configuration file :doc:`here</configuration/yaml_example>`:
Below is an example graph of dependencies corresponding to the pyCIF configuration file :doc:`here</documentation/configuration/yaml_example>`:
.. graphviz:: dependencies.dot
:align: center
......@@ -50,7 +50,7 @@ Below is an example graph of dependencies corresponding to the pyCIF configurati
In this example, blue boxes are :bash:`plugins` that are explicitly defined in the configuration file.
Red boxes are implicitly deduced from default values as specified in individual :bash:`plugins`
(see :doc:`here<available>`).
(see :doc:`here<plg_autodoc/available>`).
Black arrows stand for method dependencies, while red ones are data dependencies.
Thus, for instance, the :bash:`obsoper` plugin is required by the :bash:`mode` plugin while it is not specified in the Yaml file.
......@@ -79,6 +79,6 @@ The following list can be obtained by running the following python commands.
Plugin.print_registered(print_rst=True, print_requirement=True)
.. include:: available.rst
.. include:: plg_autodoc/available.rst