diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 0000000000..2f2996714e Binary files /dev/null and b/.doctrees/api.doctree differ diff --git a/.doctrees/api/pydra.engine.audit.doctree b/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..685d6f4793 Binary files /dev/null and b/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/.doctrees/api/pydra.engine.boutiques.doctree b/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..ab197a9b6a Binary files /dev/null and b/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/.doctrees/api/pydra.engine.core.doctree b/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..47c3456391 Binary files /dev/null and b/.doctrees/api/pydra.engine.core.doctree differ diff --git a/.doctrees/api/pydra.engine.doctree b/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..75f66868c5 Binary files /dev/null and b/.doctrees/api/pydra.engine.doctree differ diff --git a/.doctrees/api/pydra.engine.environments.doctree b/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..28731edf29 Binary files /dev/null and b/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/.doctrees/api/pydra.engine.graph.doctree b/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..fd47e0880a Binary files /dev/null and b/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/.doctrees/api/pydra.engine.helpers.doctree b/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..bcb50fb167 Binary files /dev/null and b/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/.doctrees/api/pydra.engine.helpers_file.doctree b/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..177b91e7c2 Binary files /dev/null and b/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/.doctrees/api/pydra.engine.helpers_state.doctree b/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..702d7a93e1 Binary files /dev/null and b/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/.doctrees/api/pydra.engine.run_pickled.doctree b/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..89aafb0625 Binary files /dev/null and b/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/.doctrees/api/pydra.engine.specs.doctree b/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..684e9f3782 Binary files /dev/null and b/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/.doctrees/api/pydra.engine.state.doctree b/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..a1bc41c346 Binary files /dev/null and b/.doctrees/api/pydra.engine.state.doctree differ diff --git a/.doctrees/api/pydra.engine.submitter.doctree b/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..d70c0c666a Binary files /dev/null and b/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/.doctrees/api/pydra.engine.task.doctree b/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..15b6440ef9 Binary files /dev/null and b/.doctrees/api/pydra.engine.task.doctree differ diff --git a/.doctrees/api/pydra.engine.workers.doctree b/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..e5d6b2441c Binary files /dev/null and b/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/.doctrees/api/pydra.mark.doctree b/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..f6e98c24bc Binary files /dev/null and b/.doctrees/api/pydra.mark.doctree differ diff --git a/.doctrees/api/pydra.mark.functions.doctree b/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..2eca72d53e Binary files /dev/null and b/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/.doctrees/api/pydra.tasks.doctree b/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..a58ba63490 Binary files /dev/null and b/.doctrees/api/pydra.tasks.doctree differ diff --git a/.doctrees/api/pydra.utils.doctree b/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..b4e5b631fe Binary files /dev/null and b/.doctrees/api/pydra.utils.doctree differ diff --git a/.doctrees/api/pydra.utils.hash.doctree b/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..51f65f8310 Binary files /dev/null and b/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/.doctrees/api/pydra.utils.messenger.doctree b/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..e833288fd3 Binary files /dev/null and b/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/.doctrees/api/pydra.utils.misc.doctree b/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..f8bdd86ff1 Binary files /dev/null and b/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/.doctrees/api/pydra.utils.profiler.doctree b/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..ccd19d9da9 Binary files /dev/null and b/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/.doctrees/api/pydra.utils.typing.doctree b/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..84874fc742 Binary files /dev/null and b/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/.doctrees/changes.doctree b/.doctrees/changes.doctree new file mode 100644 index 0000000000..c53478cc25 Binary files /dev/null and b/.doctrees/changes.doctree differ diff --git a/.doctrees/combiner.doctree b/.doctrees/combiner.doctree new file mode 100644 index 0000000000..4180c151df Binary files /dev/null and b/.doctrees/combiner.doctree differ diff --git a/.doctrees/components.doctree b/.doctrees/components.doctree new file mode 100644 index 0000000000..9dfd4745ce Binary files /dev/null and b/.doctrees/components.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000..5e746d1042 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000..8b261377c2 Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/input_spec.doctree b/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..aecdcc4f1e Binary files /dev/null and b/.doctrees/input_spec.doctree differ diff --git a/.doctrees/output_spec.doctree b/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..eac8c8a612 Binary files /dev/null and b/.doctrees/output_spec.doctree differ diff --git a/.doctrees/state.doctree b/.doctrees/state.doctree new file mode 100644 index 0000000000..f9ecfb63dc Binary files /dev/null and b/.doctrees/state.doctree differ diff --git a/.doctrees/user_guide.doctree b/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..76778af78d Binary files /dev/null and b/.doctrees/user_guide.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/0.21/.buildinfo b/0.21/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/0.21/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/0.21/.doctrees/api.doctree b/0.21/.doctrees/api.doctree new file mode 100644 index 0000000000..3c59b813c1 Binary files /dev/null and b/0.21/.doctrees/api.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.audit.doctree b/0.21/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..9eac183e3c Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.boutiques.doctree b/0.21/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..cc08d8549e Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.core.doctree b/0.21/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..cb0d744cdb Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.core.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.doctree b/0.21/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..e90c9347df Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.graph.doctree b/0.21/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..36395ed735 Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.helpers.doctree b/0.21/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..ccb354f0ad Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.helpers_file.doctree b/0.21/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..207a3d29ef Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.helpers_state.doctree b/0.21/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..4d1498badd Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.specs.doctree b/0.21/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..ad27306602 Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.state.doctree b/0.21/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..8c8d3306e4 Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.state.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.submitter.doctree b/0.21/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..38e9590b1b Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.task.doctree b/0.21/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..e8b4d1951c Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.task.doctree differ diff --git a/0.21/.doctrees/api/pydra.engine.workers.doctree b/0.21/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..e3858b618b Binary files /dev/null and b/0.21/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/0.21/.doctrees/api/pydra.mark.doctree b/0.21/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..a410103ac7 Binary files /dev/null and b/0.21/.doctrees/api/pydra.mark.doctree differ diff --git a/0.21/.doctrees/api/pydra.mark.functions.doctree b/0.21/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..5f7744f652 Binary files /dev/null and b/0.21/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/0.21/.doctrees/api/pydra.tasks.doctree b/0.21/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..2c377c4b46 Binary files /dev/null and b/0.21/.doctrees/api/pydra.tasks.doctree differ diff --git a/0.21/.doctrees/api/pydra.utils.doctree b/0.21/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..d00cd19f7c Binary files /dev/null and b/0.21/.doctrees/api/pydra.utils.doctree differ diff --git a/0.21/.doctrees/api/pydra.utils.messenger.doctree b/0.21/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..aaef21e337 Binary files /dev/null and b/0.21/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/0.21/.doctrees/api/pydra.utils.profiler.doctree b/0.21/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..9328b3b85a Binary files /dev/null and b/0.21/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/0.21/.doctrees/changes.doctree b/0.21/.doctrees/changes.doctree new file mode 100644 index 0000000000..3b97f26ead Binary files /dev/null and b/0.21/.doctrees/changes.doctree differ diff --git a/0.21/.doctrees/combiner.doctree b/0.21/.doctrees/combiner.doctree new file mode 100644 index 0000000000..dd5a42a9c2 Binary files /dev/null and b/0.21/.doctrees/combiner.doctree differ diff --git a/0.21/.doctrees/components.doctree b/0.21/.doctrees/components.doctree new file mode 100644 index 0000000000..1a4cec5abd Binary files /dev/null and b/0.21/.doctrees/components.doctree differ diff --git a/0.21/.doctrees/environment.pickle b/0.21/.doctrees/environment.pickle new file mode 100644 index 0000000000..af557be65c Binary files /dev/null and b/0.21/.doctrees/environment.pickle differ diff --git a/0.21/.doctrees/index.doctree b/0.21/.doctrees/index.doctree new file mode 100644 index 0000000000..17fe14d52f Binary files /dev/null and b/0.21/.doctrees/index.doctree differ diff --git a/0.21/.doctrees/input_spec.doctree b/0.21/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..2bc50ef496 Binary files /dev/null and b/0.21/.doctrees/input_spec.doctree differ diff --git a/0.21/.doctrees/output_spec.doctree b/0.21/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..a9459255d1 Binary files /dev/null and b/0.21/.doctrees/output_spec.doctree differ diff --git a/0.21/.doctrees/state.doctree b/0.21/.doctrees/state.doctree new file mode 100644 index 0000000000..b1852d6e7c Binary files /dev/null and b/0.21/.doctrees/state.doctree differ diff --git a/0.21/.doctrees/user_guide.doctree b/0.21/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..f7b818277f Binary files /dev/null and b/0.21/.doctrees/user_guide.doctree differ diff --git a/0.21/.nojekyll b/0.21/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/0.21/_images/nd_spl_1.png b/0.21/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/0.21/_images/nd_spl_1.png differ diff --git a/0.21/_images/nd_spl_3.png b/0.21/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/0.21/_images/nd_spl_3.png differ diff --git a/0.21/_images/nd_spl_3_comb1.png b/0.21/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/0.21/_images/nd_spl_3_comb1.png differ diff --git a/0.21/_images/nd_spl_3_comb3.png b/0.21/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/0.21/_images/nd_spl_3_comb3.png differ diff --git a/0.21/_images/nd_spl_4.png b/0.21/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/0.21/_images/nd_spl_4.png differ diff --git a/0.21/_sources/api.rst.txt b/0.21/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/0.21/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/0.21/_sources/api/pydra.engine.audit.rst.txt b/0.21/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.boutiques.rst.txt b/0.21/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/0.21/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.core.rst.txt b/0.21/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.graph.rst.txt b/0.21/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.helpers.rst.txt b/0.21/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.helpers_file.rst.txt b/0.21/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.helpers_state.rst.txt b/0.21/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.rst.txt b/0.21/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..7cafa8d6ad --- /dev/null +++ b/0.21/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,26 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/0.21/_sources/api/pydra.engine.specs.rst.txt b/0.21/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.state.rst.txt b/0.21/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/0.21/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.submitter.rst.txt b/0.21/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/0.21/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.task.rst.txt b/0.21/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/0.21/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.engine.workers.rst.txt b/0.21/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/0.21/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.mark.functions.rst.txt b/0.21/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/0.21/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.mark.rst.txt b/0.21/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/0.21/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/0.21/_sources/api/pydra.tasks.rst.txt b/0.21/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/0.21/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.utils.messenger.rst.txt b/0.21/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/0.21/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.utils.profiler.rst.txt b/0.21/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/0.21/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/0.21/_sources/api/pydra.utils.rst.txt b/0.21/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..946fe9055d --- /dev/null +++ b/0.21/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,16 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.messenger + pydra.utils.profiler diff --git a/0.21/_sources/changes.rst.txt b/0.21/_sources/changes.rst.txt new file mode 100644 index 0000000000..0fb4187e33 --- /dev/null +++ b/0.21/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messanger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/0.21/_sources/combiner.rst.txt b/0.21/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/0.21/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/0.21/_sources/components.rst.txt b/0.21/_sources/components.rst.txt new file mode 100644 index 0000000000..7872fec87c --- /dev/null +++ b/0.21/_sources/components.rst.txt @@ -0,0 +1,187 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2(x=[1, 5]).split("x").combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. +The results are grouped back when returning the result from the *Task*. +While this example +illustrates mapping and grouping of results over a single parameter, *Pydra* +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/0.21/_sources/index.rst.txt b/0.21/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/0.21/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/0.21/_sources/input_spec.rst.txt b/0.21/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/0.21/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/0.21/_sources/output_spec.rst.txt b/0.21/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/0.21/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/0.21/_sources/state.rst.txt b/0.21/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/0.21/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/0.21/_sources/user_guide.rst.txt b/0.21/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/0.21/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/0.21/_static/_sphinx_javascript_frameworks_compat.js b/0.21/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/0.21/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/0.21/_static/banner.css b/0.21/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/0.21/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/0.21/_static/basic.css b/0.21/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/0.21/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/0.21/_static/css/badge_only.css b/0.21/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/0.21/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/0.21/_static/css/fonts/Roboto-Slab-Bold.woff b/0.21/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/0.21/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/0.21/_static/css/fonts/Roboto-Slab-Bold.woff2 b/0.21/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/0.21/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/0.21/_static/css/fonts/Roboto-Slab-Regular.woff b/0.21/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/0.21/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/0.21/_static/css/fonts/Roboto-Slab-Regular.woff2 b/0.21/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/0.21/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/0.21/_static/css/fonts/fontawesome-webfont.eot b/0.21/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/0.21/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/0.21/_static/css/fonts/fontawesome-webfont.svg b/0.21/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/0.21/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0.21/_static/css/fonts/fontawesome-webfont.ttf b/0.21/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/0.21/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/0.21/_static/css/fonts/fontawesome-webfont.woff b/0.21/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/0.21/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/0.21/_static/css/fonts/fontawesome-webfont.woff2 b/0.21/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/0.21/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/0.21/_static/css/fonts/lato-bold-italic.woff b/0.21/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/0.21/_static/css/fonts/lato-bold-italic.woff differ diff --git a/0.21/_static/css/fonts/lato-bold-italic.woff2 b/0.21/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/0.21/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/0.21/_static/css/fonts/lato-bold.woff b/0.21/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/0.21/_static/css/fonts/lato-bold.woff differ diff --git a/0.21/_static/css/fonts/lato-bold.woff2 b/0.21/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/0.21/_static/css/fonts/lato-bold.woff2 differ diff --git a/0.21/_static/css/fonts/lato-normal-italic.woff b/0.21/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/0.21/_static/css/fonts/lato-normal-italic.woff differ diff --git a/0.21/_static/css/fonts/lato-normal-italic.woff2 b/0.21/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/0.21/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/0.21/_static/css/fonts/lato-normal.woff b/0.21/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/0.21/_static/css/fonts/lato-normal.woff differ diff --git a/0.21/_static/css/fonts/lato-normal.woff2 b/0.21/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/0.21/_static/css/fonts/lato-normal.woff2 differ diff --git a/0.21/_static/css/theme.css b/0.21/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/0.21/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/0.21/_static/doctools.js b/0.21/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/0.21/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/0.21/_static/documentation_options.js b/0.21/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/0.21/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/0.21/_static/file.png b/0.21/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/0.21/_static/file.png differ diff --git a/0.21/_static/jquery.js b/0.21/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/0.21/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.21/_static/js/html5shiv.min.js b/0.21/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/0.21/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.21/_static/js/theme.js b/0.21/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/0.21/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/0.21/_static/minus.png b/0.21/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/0.21/_static/minus.png differ diff --git a/0.21/_static/plus.png b/0.21/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/0.21/_static/plus.png differ diff --git a/0.21/_static/pygments.css b/0.21/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/0.21/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/0.21/_static/searchtools.js b/0.21/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/0.21/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/0.21/_static/sphinx_highlight.js b/0.21/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/0.21/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/0.21/api.html b/0.21/api.html new file mode 100644 index 0000000000..b4bc3a908b --- /dev/null +++ b/0.21/api.html @@ -0,0 +1,677 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+pydra.check_latest_version()
+
+ +
+
+pydra.set_input_validator(flag=False)
+
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.audit.html b/0.21/api/pydra.engine.audit.html new file mode 100644 index 0000000000..9ad099b0f2 --- /dev/null +++ b/0.21/api/pydra.engine.audit.html @@ -0,0 +1,243 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.boutiques.html b/0.21/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..a5a540208f --- /dev/null +++ b/0.21/api/pydra.engine.boutiques.html @@ -0,0 +1,181 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.core.html b/0.21/api/pydra.engine.core.html new file mode 100644 index 0000000000..d763291e03 --- /dev/null +++ b/0.21/api/pydra.engine.core.html @@ -0,0 +1,458 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elemntary tasks and +Workflow instances inherit.

+
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner, overwrite=False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner – TODO

  • +
  • overwrite (bool) – TODO

  • +
+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Return type:
+

result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter, overwrite=False, cont_dim=None, **kwargs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • overwrite (bool) – TODO

  • +
  • cont_dim (dict) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.graph.html b/0.21/api/pydra.engine.graph.html new file mode 100644 index 0000000000..63341a5d83 --- /dev/null +++ b/0.21/api/pydra.engine.graph.html @@ -0,0 +1,350 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other format, equires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.helpers.html b/0.21/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..3e3351a4d1 --- /dev/null +++ b/0.21/api/pydra.engine.helpers.html @@ -0,0 +1,459 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.custom_validator(instance, attribute, value)
+

simple custom validation +take into account ty.Union, ty.List, ty.Dict (but only one level depth) +adding an additional validator, if allowe_values provided

+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.hash_function(obj)
+

Generate hash of object.

+
+ +
+
+pydra.engine.helpers.hash_value(value, tp=None, metadata=None, precalculated=None)
+

calculating hash or returning values recursively

+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+
+pydra.engine.helpers.task_hash(task)
+

Calculate the checksum of a task.

+

input hash, output hash, environment hash

+
+
Parameters:
+

task (TaskBase) – The input task.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.helpers_file.html b/0.21/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..d533841271 --- /dev/null +++ b/0.21/api/pydra.engine.helpers_file.html @@ -0,0 +1,444 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+pydra.engine.helpers_file.copyfile(originalfile, newfile, copy=False, create_new=False, use_hardlink=True, copy_related_files=True)
+

Copy or link files.

+

If use_hardlink is True, and the file can be hard-linked, then a +link is created, instead of copying the file.

+

If a hard link is not created and copy is False, then a symbolic +link is created.

+
+

Copy options for existing files

+
    +
  • symlink

    +
    +
      +
    • to regular file originalfile (keep if symlinking)

    • +
    • to same dest as symlink originalfile (keep if symlinking)

    • +
    • to other file (unlink)

    • +
    +
    +
  • +
  • regular file

    +
    +
      +
    • hard link to originalfile (keep)

    • +
    • copy of file (same hash) (keep)

    • +
    • different file (diff hash) (unlink)

    • +
    +
    +
  • +
+
+
+

Copy options for new files

+
    +
  • use_hardlink & can_hardlink => hardlink

  • +
  • ~hardlink & ~copy & can_symlink => symlink

  • +
  • ~hardlink & ~symlink => copy

  • +
+
+
+
Parameters:
+
    +
  • originalfile (str) – full path to original file

  • +
  • newfile (str) – full path to new file

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for POSIX systems

  • +
  • use_hardlink (Bool) – specifies whether to hard-link files, when able +(Default=False), taking precedence over copy

  • +
  • copy_related_files (Bool) – specifies whether to also operate on related files, as defined in +related_filetype_sets

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.copyfile_input(inputs, output_dir)
+

Implement the base class method.

+
+ +
+
+pydra.engine.helpers_file.copyfiles(filelist, dest, copy=False, create_new=False)
+

Copy or symlink files in filelist to dest directory.

+
+
Parameters:
+
    +
  • filelist (list) – List of files to copy.

  • +
  • dest (path/files) – full path to destination. If it is a list of length greater +than 1, then it assumes that these are the names of the new +files.

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for posix systems

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.fname_presuffix(fname, prefix='', suffix='', newpath=None, use_ext=True)
+

Manipulate path and name of input filename.

+
+
Parameters:
+
    +
  • fname (str) – A filename (may or may not include path)

  • +
  • prefix (str) – Characters to prepend to the filename

  • +
  • suffix (str) – Characters to append to the filename

  • +
  • newpath (str) – Path to replace the path of the input fname

  • +
  • use_ext (bool) – If True (default), appends the extension of the original file +to the output name.

  • +
+
+
Returns:
+

path – Absolute path of the modified filename

+
+
Return type:
+

str

+
+
+

Examples

+
>>> import pytest, sys
+>>> if sys.platform.startswith('win'): pytest.skip()
+>>> from pydra.engine.helpers_file import fname_presuffix
+>>> fname = 'foo.nii.gz'
+>>> fname_presuffix(fname,'pre','post','/tmp')
+'/tmp/prefoopost.nii.gz'
+
+
+
+ +
+ +

Return a list of related files.

+

As defined in related_filetype_sets, for a filename +(e.g., Nifti-Pair, Analyze (SPM), and AFNI files).

+
+
Parameters:
+
    +
  • filename (str) – File name to find related filetypes of.

  • +
  • include_this_file (bool) – If true, output includes the input filename.

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.hash_dir(dirpath, crypto=<built-in function openssl_sha256>, ignore_hidden_files=False, ignore_hidden_dirs=False, raise_notfound=True, precalculated=None)
+

Compute hash of directory contents.

+

This function computes the hash of every file in directory dirpath and then +computes the hash of that list of hashes to return a single hash value. The +directory is traversed recursively.

+
+
Parameters:
+
    +
  • dirpath (str) – Path to directory.

  • +
  • crypto (:obj: function) – cryptographic hash functions

  • +
  • ignore_hidden_files (bool) – If True, ignore filenames that begin with ..

  • +
  • ignore_hidden_dirs (bool) – If True, ignore files in directories that begin with ..

  • +
  • raise_notfound (bool) – If True and dirpath does not exist, raise FileNotFound exception. If +False and dirpath does not exist, return None.

  • +
+
+
Returns:
+

hash – Hash of the directory contents.

+
+
Return type:
+

str

+
+
+
+ +
+
+pydra.engine.helpers_file.hash_file(afile, chunk_len=8192, crypto=<built-in function openssl_sha256>, raise_notfound=True, precalculated=None)
+

Compute hash of a file using ‘crypto’ module.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_existing_file(value)
+

checking if an object is an existing file

+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.on_cifs(fname)
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+
+ +
+
+pydra.engine.helpers_file.related_filetype_sets = [('.hdr', '.img', '.mat'), ('.nii', '.mat'), ('.BRIK', '.HEAD')]
+

List of neuroimaging file types that are to be interpreted together.

+
+ +
+
+pydra.engine.helpers_file.split_filename(fname)
+

Split a filename into parts: path, base filename and extension.

+
+
Parameters:
+

fname (str) – file or path name

+
+
Returns:
+

    +
  • pth (str) – base path from fname

  • +
  • fname (str) – filename from fname, without extension

  • +
  • ext (str) – file extension from fname

  • +
+

+
+
+

Examples

+
>>> pth, fname, ext = split_filename('/home/data/subject.nii.gz')
+>>> pth
+'/home/data'
+
+
+
>>> fname
+'subject'
+
+
+
>>> ext
+'.nii.gz'
+
+
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.helpers_state.html b/0.21/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..0f2c74a8ec --- /dev/null +++ b/0.21/api/pydra.engine.helpers_state.html @@ -0,0 +1,300 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter, name)
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.html b/0.21/api/pydra.engine.html new file mode 100644 index 0000000000..54a25904ec --- /dev/null +++ b/0.21/api/pydra.engine.html @@ -0,0 +1,414 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.specs.html b/0.21/api/pydra.engine.specs.html new file mode 100644 index 0000000000..06063adf87 --- /dev/null +++ b/0.21/api/pydra.engine.specs.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+

Compute a basic hash for any given set of fields.

+
+ +
+
+retrieve_values(wf, state_index=None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.ContainerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container: File | str | None, container_xargs: List[str] | None = None)
+

Bases: ShellSpec

+

Refine the generic command-line specification to container execution.

+
+
+container: File | str | None
+

The container.

+
+ +
+
+container_xargs: List[str] | None
+
+ +
+
+image: File | str
+

The image to be containerized.

+
+ +
+ +
+
+class pydra.engine.specs.Directory
+

Bases: object

+

An os.pathlike object, designating a folder.

+
+ +
+
+class pydra.engine.specs.DockerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'docker')
+

Bases: ContainerSpec

+

Particularize container specifications to the Docker engine.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.File
+

Bases: object

+

An os.pathlike object, designating a file.

+
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(node, attr_type)
+

Bases: object

+

Lazy fields implement promises.

+
+
+get_value(wf, state_index=None)
+

Return the value of a lazy field.

+
+ +
+ +
+
+class pydra.engine.specs.MultiInputFile
+

Bases: MultiInputObj

+

A ty.List[File] object, converter changes a single file path to a list

+
+ +
+
+class pydra.engine.specs.MultiInputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes a single values to a list

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.MultiOutputFile
+

Bases: MultiOutputObj

+

A ty.List[File] object, converter changes an 1-el list to the single value

+
+ +
+
+class pydra.engine.specs.MultiOutputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes an 1-el list to the single value

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: File | str, stderr: File | str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Collect additional outputs from shelltask output_spec.

+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: File | str
+

The process’ standard input.

+
+ +
+
+stdout: File | str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SingularitySpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'singularity')
+

Bases: ContainerSpec

+

Particularize container specifications to Singularity.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Tuple[Type] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Tuple[Type]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.attr_fields_dict(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.state.html b/0.21/api/pydra.engine.state.html new file mode 100644 index 0000000000..3ee37b01f2 --- /dev/null +++ b/0.21/api/pydra.engine.state.html @@ -0,0 +1,597 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.submitter.html b/0.21/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..b647bcaa92 --- /dev/null +++ b/0.21/api/pydra.engine.submitter.html @@ -0,0 +1,263 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.task.html b/0.21/api/pydra.engine.task.html new file mode 100644 index 0000000000..addaf4ad61 --- /dev/null +++ b/0.21/api/pydra.engine.task.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.ContainerTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Extend shell command task for containerized execution.

+
+
+bind_paths()
+

Get bound mount points

+
+
Returns:
+

mount points – mapping from local path to tuple of container path + mode

+
+
Return type:
+

dict

+
+
+
+ +
+
+binds(opt)
+

Specify mounts to bind from local filesystems to container and working directory.

+

Uses py:meth:bind_paths

+
+ +
+
+container_check(container_type)
+

Get container-specific CLI arguments.

+
+ +
+ +
+
+class pydra.engine.task.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.task.SingularityTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with Singularity.

+
+
+property container_args
+

Get container-specific CLI arguments.

+
+ +
+
+init = False
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.engine.workers.html b/0.21/api/pydra.engine.workers.html new file mode 100644 index 0000000000..03f6f11e26 --- /dev/null +++ b/0.21/api/pydra.engine.workers.html @@ -0,0 +1,381 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.mark.functions.html b/0.21/api/pydra.mark.functions.html new file mode 100644 index 0000000000..7c327a531c --- /dev/null +++ b/0.21/api/pydra.mark.functions.html @@ -0,0 +1,196 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.mark.html b/0.21/api/pydra.mark.html new file mode 100644 index 0000000000..25642701a3 --- /dev/null +++ b/0.21/api/pydra.mark.html @@ -0,0 +1,176 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.tasks.html b/0.21/api/pydra.tasks.html new file mode 100644 index 0000000000..6a7b9a5c29 --- /dev/null +++ b/0.21/api/pydra.tasks.html @@ -0,0 +1,169 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.utils.html b/0.21/api/pydra.utils.html new file mode 100644 index 0000000000..9f59b15823 --- /dev/null +++ b/0.21/api/pydra.utils.html @@ -0,0 +1,177 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.utils.messenger.html b/0.21/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..a8b5887b93 --- /dev/null +++ b/0.21/api/pydra.utils.messenger.html @@ -0,0 +1,373 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/api/pydra.utils.profiler.html b/0.21/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..da7c4f836f --- /dev/null +++ b/0.21/api/pydra.utils.profiler.html @@ -0,0 +1,243 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequence to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/changes.html b/0.21/changes.html new file mode 100644 index 0000000000..0422c80f05 --- /dev/null +++ b/0.21/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messanger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/combiner.html b/0.21/combiner.html new file mode 100644 index 0000000000..0f325d95ee --- /dev/null +++ b/0.21/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/components.html b/0.21/components.html new file mode 100644 index 0000000000..83a730764f --- /dev/null +++ b/0.21/components.html @@ -0,0 +1,337 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2(x=[1, 5]).split("x").combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. +The results are grouped back when returning the result from the Task. +While this example +illustrates mapping and grouping of results over a single parameter, Pydra +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/genindex.html b/0.21/genindex.html new file mode 100644 index 0000000000..d244105639 --- /dev/null +++ b/0.21/genindex.html @@ -0,0 +1,1283 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/index.html b/0.21/index.html new file mode 100644 index 0000000000..5be4f222f1 --- /dev/null +++ b/0.21/index.html @@ -0,0 +1,244 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/input_spec.html b/0.21/input_spec.html new file mode 100644 index 0000000000..0211b1cfce --- /dev/null +++ b/0.21/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/objects.inv b/0.21/objects.inv new file mode 100644 index 0000000000..92761904eb Binary files /dev/null and b/0.21/objects.inv differ diff --git a/0.21/output_spec.html b/0.21/output_spec.html new file mode 100644 index 0000000000..fab2d0a5a4 --- /dev/null +++ b/0.21/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/py-modindex.html b/0.21/py-modindex.html new file mode 100644 index 0000000000..ea5df69782 --- /dev/null +++ b/0.21/py-modindex.html @@ -0,0 +1,250 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.messenger +
    + pydra.utils.profiler +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/search.html b/0.21/search.html new file mode 100644 index 0000000000..57371b35bd --- /dev/null +++ b/0.21/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/0.21/searchindex.js b/0.21/searchindex.js new file mode 100644 index 0000000000..db10eeda5b --- /dev/null +++ b/0.21/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.messenger", "api/pydra.utils.profiler", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.profiler.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.messenger module", "pydra.utils.profiler module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 6, 7, 8, 9, 11, 16, 18, 22, 23, 24, 25, 26], "pydra": [0, 20, 21, 22, 24, 26], "workflow": [0, 1, 4, 5, 6, 9, 11, 15, 20, 21, 23, 26, 27], "engin": [0, 19, 20, 26], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rewrit": 0, "nipyp": [0, 7, 19, 20, 23], "map": [0, 5, 10, 12, 22, 23, 26], "join": 0, "first": [0, 21], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 24, 25], "oper": [0, 7, 10, 26], "It": [0, 4, 10, 21, 22, 23], "form": [0, 6, 8, 10, 22, 25], "core": [0, 1, 11, 19, 20], "2": [0, 1, 6, 11, 15, 18, 22, 23, 24, 26], "0": [0, 1, 4, 6, 8, 11, 15, 18, 23], "ecosystem": [0, 23], "check_latest_vers": [0, 23], "set_input_valid": [0, 23, 24], "flag": [0, 1, 2, 4, 18, 20, 22, 24, 25], "fals": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 19, 24, 25], "packag": [0, 20, 22, 23], "auditflag": [0, 1, 4, 12, 18], "all": [0, 1, 4, 5, 7, 8, 9, 10, 11, 18, 20, 21, 22, 24, 26], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20], "prov": [0, 1, 18], "resourc": [0, 1, 2, 18, 19, 23], "dockertask": [0, 1, 12, 20, 22], "container_arg": [0, 1, 12, 20], "init": [0, 1, 12], "shellcommandtask": [0, 1, 3, 12, 20, 22, 24, 25], "cmdline": [0, 1, 12, 20], "command_arg": [0, 1, 12, 20], "input_spec": [0, 1, 4, 6, 7, 9, 12, 20, 22, 24, 25], "output_spec": [0, 1, 4, 6, 7, 9, 12, 24, 25], "submitt": [0, 1, 6, 20], "close": [0, 1, 6, 11, 13], "expand_runn": [0, 1, 11], "expand_workflow": [0, 1, 11], "submit_from_cal": [0, 1, 11], "add": [0, 1, 4, 5, 20, 22], "checksum": [0, 1, 4, 6, 20], "create_connect": [0, 1, 4], "create_dotfil": [0, 1, 4, 20], "graph_sort": [0, 1, 4], "node": [0, 1, 4, 5, 8, 9, 10, 12, 19, 20, 22, 23, 26], "set_output": [0, 1, 4, 22], "submodul": 0, "audit": [0, 1, 4, 12, 18, 20, 23], "modul": [0, 1, 14, 17, 23], "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "monitor": [0, 1, 2, 12, 18, 19], "start_audit": [0, 2], "boutiqu": [0, 1, 20], "boshtask": [0, 3, 20], "taskbas": [0, 1, 4, 6, 11, 12, 22], "audit_flag": [0, 1, 2, 4, 12], "cache_dir": [0, 1, 4, 12], "cache_loc": [0, 1, 4, 6, 12, 20], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 6, 8, 10, 20, 21, 22, 23, 24, 26], "cont_dim": [0, 1, 4, 8, 10, 12, 20], "done": [0, 4, 26], "error": [0, 1, 4, 6, 7, 8, 9, 11, 19, 20, 23, 24, 25], "generated_output_nam": [0, 4, 9], "get_input_el": [0, 4], "help": [0, 4, 22, 23], "output_dir": [0, 1, 4, 7, 9, 25], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 6, 7, 9, 10, 20, 21, 22, 23], "set_stat": [0, 4], "split": [0, 4, 7, 8, 10, 12, 21, 22, 26], "uid": [0, 4], "version": [0, 4, 24], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "graph": [0, 1, 4, 11, 18, 20, 22, 23, 26], "digraph": [0, 5], "add_edg": [0, 5], "add_edges_descript": [0, 1, 4, 5], "add_nod": [0, 5], "calculate_max_path": [0, 5], "copi": [0, 5, 6, 9, 12, 20, 24, 26], "create_dotfile_detail": [0, 5], "create_dotfile_nest": [0, 5], "create_dotfile_simpl": [0, 5], "edg": [0, 5], "edges_nam": [0, 5], "export_graph": [0, 5], "nodes_detail": [0, 5], "nodes_names_map": [0, 5], "remove_nod": [0, 5], "remove_nodes_connect": [0, 5], "remove_previous_connect": [0, 5], "remove_successors_nod": [0, 5], "sorted_nod": [0, 5], "sorted_nodes_nam": [0, 5], "sort": [0, 1, 4, 5, 6], "helper": [0, 1], "pydrafilelock": [0, 6], "argstr_format": [0, 6], "copyfile_workflow": [0, 6], "create_checksum": [0, 6], "custom_valid": [0, 6], "ensure_list": [0, 6, 7], "execut": [0, 1, 6, 9, 11, 12, 13, 19, 22, 23, 24, 25, 26], "gather_runtime_info": [0, 6], "get_available_cpu": [0, 6, 20], "get_open_loop": [0, 6], "hash_funct": [0, 6], "hash_valu": [0, 6], "load_and_run": [0, 6, 20], "load_and_run_async": [0, 6], "load_result": [0, 6], "load_task": [0, 6], "make_klass": [0, 6], "output_from_inputfield": [0, 6], "position_sort": [0, 6], "print_help": [0, 6], "read_and_displai": [0, 6], "read_and_display_async": [0, 6], "read_stream_and_displai": [0, 6], "record_error": [0, 6], "save": [0, 6], "task_hash": [0, 6], "helpers_fil": [0, 1], "copyfil": [0, 7, 24], "copyfile_input": [0, 7, 9], "fname_presuffix": [0, 7], "get_related_fil": [0, 7], "hash_dir": [0, 7, 20], "hash_fil": [0, 7], "is_contain": [0, 7], "is_existing_fil": [0, 7], "is_local_fil": [0, 7], "on_cif": [0, 7], "related_filetype_set": [0, 7], "split_filenam": [0, 7], "template_upd": [0, 7, 9], "template_update_singl": [0, 7], "helpers_st": [0, 1], "pydrastateerror": [0, 8, 20], "add_name_combin": [0, 8], "add_name_splitt": [0, 8], "combine_final_group": [0, 8], "converter_groups_to_input": [0, 8], "flatten": [0, 8], "input_shap": [0, 8], "inputs_types_to_dict": [0, 8], "iter_split": [0, 8], "map_split": [0, 8], "remove_inp_from_splitter_rpn": [0, 8], "rpn2splitter": [0, 8], "splits_group": [0, 8], "splitter2rpn": [0, 8], "spec": [0, 1, 4, 6, 7, 12, 20, 25, 27], "basespec": [0, 1, 4, 9, 12], "check_fields_input_spec": [0, 9], "check_metadata": [0, 9], "collect_additional_output": [0, 9], "hash": [0, 6, 7, 9, 12, 20, 22, 23], "retrieve_valu": [0, 9], "containerspec": [0, 9], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 23, 24, 25, 27], "container_xarg": [0, 9], "imag": [0, 9, 22], "directori": [0, 1, 2, 4, 6, 7, 9, 12, 20, 22, 24], "dockerspec": [0, 9], "file": [0, 4, 6, 9, 12, 18, 19, 20, 22, 23, 24, 25], "functionspec": [0, 9], "lazyfield": [0, 9], "get_valu": [0, 9], "multiinputfil": [0, 9], "multiinputobj": [0, 9, 24], "convert": [0, 8, 9, 20, 22, 24], "multioutputfil": [0, 9], "multioutputobj": [0, 9, 24], "get_output_field": [0, 9], "output": [0, 1, 2, 4, 5, 6, 7, 9, 10, 18, 20, 22, 23, 24, 26, 27], "runtim": [0, 6, 9], "cpu_peak_perc": [0, 9], "rss_peak_gb": [0, 9], "vms_peak_gb": [0, 9], "runtimespec": [0, 9], "network": [0, 9], "outdir": [0, 5, 9], "shelloutspec": [0, 9, 25], "return_cod": [0, 9], "stderr": [0, 9, 25], "stdout": [0, 9, 25], "shellspec": [0, 9, 22, 24], "arg": [0, 1, 3, 6, 9, 12, 22], "singularityspec": [0, 9], "specinfo": [0, 1, 4, 9, 12, 22, 24, 25], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 24, 25, 26], "field": [0, 1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 25, 26, 27], "name": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 22, 24, 25], "taskhook": [0, 9], "post_run": [0, 9], "post_run_task": [0, 9], "pre_run": [0, 9], "pre_run_task": [0, 9], "reset": [0, 9], "attr_field": [0, 9], "attr_fields_dict": [0, 9], "donoth": [0, 9], "path_to_str": [0, 9], "state": [0, 1, 4, 8, 11, 12, 18, 20, 23, 27], "splitter": [0, 4, 8, 10, 20, 21, 22, 27], "splitter_rpn_compact": [0, 10], "splitter_rpn": [0, 8, 10], "splitter_fin": [0, 10], "other_st": [0, 8, 10], "inner_input": [0, 8, 10], "states_ind": [0, 10], "states_v": [0, 10], "inputs_ind": [0, 10], "group_for_input": [0, 8, 10], "group_for_inputs_fin": [0, 10], "groups_stack_fin": [0, 10], "final_combined_ind_map": [0, 10], "combiner_valid": [0, 10], "current_combin": [0, 10], "current_combiner_al": [0, 10], "current_splitt": [0, 10], "current_splitter_rpn": [0, 10], "prepare_input": [0, 10], "prepare_st": [0, 10], "prepare_states_combined_ind": [0, 10], "prepare_states_ind": [0, 10], "prepare_states_v": [0, 10], "prev_state_combin": [0, 10], "prev_state_combiner_al": [0, 10], "prev_state_splitt": [0, 10], "prev_state_splitter_rpn": [0, 10], "prev_state_splitter_rpn_compact": [0, 10], "set_input_group": [0, 10], "splitter_rpn_fin": [0, 10], "splitter_valid": [0, 10], "update_connect": [0, 10], "get_runnable_task": [0, 11], "is_runn": [0, 11], "prepare_runnable_with_st": [0, 11], "task": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 13, 15, 20, 23, 24, 25, 26, 27], "containertask": [0, 1, 12, 22, 24], "bind_path": [0, 12], "bind": [0, 12, 20], "container_check": [0, 12], "functiontask": [0, 12, 15, 20, 22], "singularitytask": [0, 12, 20, 22], "split_cmd": [0, 12], "worker": [0, 1, 11, 20], "concurrentfutureswork": [0, 13], "exec_as_coro": [0, 13], "run_el": [0, 13], "daskwork": [0, 13], "exec_dask": [0, 13], "distributedwork": [0, 13], "fetch_finish": [0, 13], "max_job": [0, 13], "sgework": [0, 13], "check_for_results_fil": [0, 13], "get_output_by_task_pkl": [0, 13], "get_tasks_to_run": [0, 13], "submit_array_job": [0, 13], "serialwork": [0, 13], "exec_seri": [0, 13], "slurmwork": [0, 13], "mark": [0, 5, 22], "function": [0, 7, 8, 9, 14, 19, 20, 23, 24, 25, 27], "annot": [0, 15, 22], "util": [0, 1, 2], "messeng": [0, 1, 2, 4, 12, 17], "filemesseng": [0, 18], "send": [0, 1, 2, 11, 18], "printmesseng": [0, 18], "remoterestmesseng": [0, 18], "runtimehook": [0, 18], "resource_monitor_post_stop": [0, 18], "resource_monitor_pre_start": [0, 18], "task_execute_post_exit": [0, 18], "task_execute_pre_entri": [0, 18], "task_run_entri": [0, 18], "task_run_exit": [0, 18], "collect_messag": [0, 18], "gen_uuid": [0, 18], "make_messag": [0, 18], "now": [0, 18, 20, 22], "send_messag": [0, 18], "profil": [0, 17], "resourcemonitor": [0, 19], "fname": [0, 6, 7, 19], "run": [0, 1, 4, 5, 6, 7, 9, 10, 11, 13, 19, 20, 22, 23], "stop": [0, 19], "get_max_resources_us": [0, 19], "get_system_total_memory_gb": [0, 19], "log_nodes_cb": [0, 19], "valu": [1, 4, 6, 7, 8, 9, 10, 18, 19, 20, 21, 22, 23, 24, 25, 26], "qualnam": [1, 18], "type": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 25, 27], "start": [1, 2, 5, 18, 19, 24], "1": [1, 4, 6, 7, 8, 9, 11, 13, 18, 22, 23, 24, 26], "boundari": [1, 18], "3": [1, 6, 11, 18, 23, 26], "track": [1, 2, 9, 10, 12, 18, 19, 22, 23], "proven": [1, 2, 12, 18, 23], "do": [1, 11, 18, 25], "onli": [1, 4, 6, 7, 10, 11, 12, 18, 21, 24, 25, 26], "container_info": [1, 3, 12, 22], "kwarg": [1, 3, 4, 6, 9, 11, 12, 13, 18], "extend": [1, 12, 22, 23, 26], "shell": [1, 3, 9, 12, 23, 24, 25, 27], "command": [1, 3, 5, 6, 7, 9, 12, 23, 24, 25, 27], "container": [1, 9, 12], "docker": [1, 7, 9, 12, 22, 23], "properti": [1, 4, 5, 9, 10, 12, 19], "get": [1, 4, 5, 6, 8, 9, 10, 12, 18, 19, 20, 22, 26], "specif": [1, 4, 6, 9, 10, 12, 18, 19, 20, 21, 22, 23, 26, 27], "cli": [1, 12], "argument": [1, 12, 22, 24], "return": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 24, 25], "list": [1, 4, 5, 6, 7, 8, 9, 10, 12, 20, 21, 22, 24, 25, 26], "ha": [1, 4, 5, 7, 10, 11, 12, 21, 22, 23, 24, 25, 26], "wrap": [1, 12], "element": [1, 4, 10, 12, 20, 21, 22, 24, 25, 26], "actual": [1, 12], "line": [1, 6, 9, 12, 22, 23], "submit": [1, 12], "plugin": [1, 6, 11], "cf": [1, 11], "object": [1, 2, 4, 5, 6, 7, 9, 10, 11, 13, 18, 22, 24, 25], "backend": [1, 11], "previous": [1, 5, 11, 23], "loop": [1, 6, 11, 13, 23, 27], "async": [1, 6, 11, 13], "runnabl": [1, 5, 11, 13, 22, 26], "wait": [1, 11], "rerun": [1, 4, 6, 11, 12, 13, 20], "thi": [1, 4, 5, 6, 7, 8, 9, 11, 13, 19, 21, 22, 23, 24, 25, 26], "coroutin": [1, 6, 11, 13], "handl": [1, 2, 11, 20, 23], "expans": [1, 11], "remov": [1, 5, 7, 8, 10, 11, 20, 24, 25], "ani": [1, 4, 5, 9, 11, 19, 22, 23, 24, 25], "from": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 20, 21, 22, 23, 24, 25, 26], "If": [1, 2, 4, 6, 7, 11, 24, 25], "set": [1, 4, 6, 7, 9, 10, 11, 13, 19, 20, 21, 22, 23, 26], "default": [1, 7, 9, 11, 24, 25], "aggreg": [1, 11, 24], "them": [1, 5, 6, 11, 20], "true": [1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 18, 22, 24, 25], "complet": [1, 11, 22], "paramet": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 26], "instanc": [1, 4, 6, 11, 22], "bool": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 18, 22, 24, 25], "await": [1, 11, 13], "futur": [1, 11, 13, 20], "befor": [1, 4, 10, 11, 24], "wf": [1, 6, 9, 11, 20, 22], "expand": [1, 11, 20], "stateless": [1, 11, 26], "method": [1, 4, 5, 7, 11, 20, 21, 22, 26], "reach": [1, 11], "_run_task": [1, 11], "comput": [1, 4, 7, 9, 11, 23], "should": [1, 7, 8, 9, 10, 11, 22, 24, 25], "call": [1, 11, 19, 21, 22, 23, 24, 26], "onc": [1, 11], "per": [1, 11], "serv": [1, 11, 22], "bridg": [1, 11], "between": [1, 5, 10, 11, 22, 23, 24], "sync": [1, 11], "land": [1, 11], "There": [1, 11, 22, 24], "ar": [1, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 21, 22, 23, 24, 25, 26], "4": [1, 11, 18, 23], "potenti": [1, 11], "path": [1, 4, 5, 6, 7, 9, 11, 12, 18, 20, 24], "differ": [1, 7, 11, 22, 23, 25, 26], "than": [1, 7, 11, 22, 25], "without": [1, 4, 5, 7, 10, 11, 22], "python": [1, 6, 11, 12, 13, 20, 22, 23, 24, 26], "10": [1, 11], "minimum": [1, 11], "probabl": [1, 11], "refactor": [1, 11, 20], "us": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 20, 21, 22, 23, 24, 25, 26], "structur": [1, 4, 5, 9, 11], "pattern": [1, 11], "match": [1, 11], "str": [1, 4, 6, 7, 9, 10, 12, 18, 22, 24, 25], "messenger_arg": [1, 2, 4, 12], "propagate_rerun": [1, 4, 20], "A": [1, 2, 4, 5, 6, 7, 9, 10, 13, 18, 19, 22, 24, 25, 26], "composit": [1, 4], "ad": [1, 4, 5, 6, 8, 20, 22, 25, 27], "calcul": [1, 4, 5, 6, 10, 20], "uniqu": [1, 4, 6, 18], "creat": [1, 2, 4, 5, 6, 7, 8, 10, 16, 20, 22, 23, 24, 25, 26], "need": [1, 4, 5, 9, 10, 21, 26], "have": [1, 4, 6, 7, 8, 10, 22, 25, 26], "input": [1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 25, 27], "etc": [1, 4, 24], "detail": [1, 4, 5, 22], "connect": [1, 4, 5, 8, 10, 22], "particular": [1, 2, 4, 9], "exist": [1, 4, 22, 23, 24, 25], "self": [1, 2, 4, 5, 10], "descript": [1, 4, 5, 20, 24, 25], "simpl": [1, 4, 5, 6, 20, 22, 24], "export": [1, 4, 5], "dotfil": [1, 4, 5, 20], "option": [1, 2, 4, 10, 18, 22, 24, 26], "other": [1, 4, 5, 7, 8, 20, 22, 23, 24, 25, 26], "format": [1, 4, 5, 6, 18, 20], "represent": [1, 4, 10], "write": [1, 4, 6, 12, 18], "todo": [1, 4, 6, 9, 18], "keep": [2, 7, 9, 10, 19], "inform": [2, 6, 10, 18, 24, 25], "develop": [2, 23], "determin": [2, 10], "whether": [2, 4, 7, 13], "enabl": [2, 20, 23, 24], "obj": [2, 4, 5, 6, 7, 11, 18], "check": [2, 4, 5, 7, 9, 11, 20, 24], "boolean": 2, "AND": 2, "oudit_flag": 2, "messag": [2, 18, 23], "dict": [2, 4, 6, 7, 10, 12, 18, 24], "json": [2, 12, 18, 19, 23], "ld": [2, 18, 23], "sent": [2, 24, 25], "end": [2, 8, 19, 26], "odir": 2, "record": [2, 18, 19], "until": [2, 6, 13], "case": [2, 6], "insid": [2, 24], "o": [2, 6, 7, 9, 18, 20, 24], "pathlik": [2, 6, 9, 18], "descriptor": [3, 20], "basic": [4, 9, 21, 22], "process": [4, 6, 9, 10, 12, 18, 19, 20], "gener": [4, 6, 8, 9, 18, 22, 23], "step": 4, "which": [4, 5, 6, 7, 8, 10], "both": [4, 22], "elemntari": 4, "inherit": [4, 9, 22], "what": 4, "avail": [4, 6, 9, 10, 20], "locat": 4, "cach": [4, 6, 23], "sourc": [4, 23], "accept": [4, 19, 20], "checkpoint": 4, "restart": 4, "state_index": [4, 9], "replac": [4, 7], "recreat": 4, "overwrit": 4, "parameter": 4, "one": [4, 6, 8, 9, 13, 21, 22, 24, 26], "more": [4, 20, 22, 24, 26], "previou": [4, 8, 10, 21, 24], "been": [4, 23], "final": [4, 8, 10, 13, 21], "store": [4, 23], "rais": [4, 7, 20, 25], "an": [4, 6, 7, 9, 13, 20, 21, 22, 23, 24, 25, 26], "doesn": [4, 10, 24], "t": [4, 10, 20, 24], "depend": [4, 8, 10], "provid": [4, 6, 8, 9, 21, 22, 23, 24, 25, 26], "ind": [4, 6], "collect": [4, 6, 9, 16, 18, 23], "requir": [4, 8, 9, 20, 22, 23, 24, 25, 26], "returnhelp": 4, "print": [4, 6, 18], "filesystem": [4, 7, 12], "where": [4, 6, 21, 23, 26], "written": [4, 7, 21, 23], "": [4, 6, 8, 10, 13, 18, 20, 24, 25, 26, 27], "everyth": 4, "see": [4, 5, 25], "pickl": [4, 6, 20], "full": [4, 7, 10, 20, 21, 24], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 6, 9, 15, 18, 19, 24], "index": [4, 6, 23], "multipl": [4, 20, 21, 24, 26], "val": [4, 8], "togeth": [4, 7, 10, 21, 23, 24, 25], "indic": [4, 10, 20], "parametr": 4, "over": [4, 7, 10, 22, 23, 27], "dimens": [4, 8, 10], "assum": [4, 7, 8, 26], "so": [4, 19, 20, 22, 26], "most": [4, 22, 26], "outer": [4, 10, 21, 27], "dim": 4, "id": [4, 19], "number": [4, 6, 8, 10, 13, 20], "slurm": [4, 13, 20], "script": [4, 22], "lazi": [4, 9, 22], "look": [4, 6], "like": [4, 22], "data": [5, 6, 7, 9, 26], "support": [5, 6, 7, 20, 21, 22, 23, 24, 26], "direct": [5, 22, 23], "new_edg": 5, "new": [5, 6, 10, 19, 23, 25, 27], "new_edge_detail": 5, "fill": 5, "_nodes_detail": 5, "new_nod": 5, "insert": [5, 24], "maximum": [5, 13], "histori": 5, "predecessor": 5, "duplic": 5, "dictionari": [5, 8, 10, 18, 19, 24, 25], "same": [5, 7, 10, 21, 25, 26], "graph_det": 5, "nest": [5, 20, 22, 23, 27], "includ": [5, 7, 10, 22, 24, 25], "link": [5, 7, 18, 24], "pair": [5, 7, 8], "thei": [5, 6, 21, 26], "ext": [5, 7], "png": 5, "equir": 5, "dot": [5, 20], "current": [5, 6, 10, 20], "each": [5, 8, 10, 21, 22, 23, 24, 25, 26], "check_readi": 5, "re": [5, 10], "doe": [5, 7, 19, 24, 26], "remove_node_connect": 5, "_node_wip": 5, "when": [5, 7, 8, 9, 10, 18, 20, 21, 22, 26], "refer": 5, "readi": 5, "also": [5, 7, 9, 10, 20, 21, 24, 26], "prune": 5, "follow": [5, 6, 21, 22, 26], "presort": 5, "either": [5, 7], "administr": 6, "framework": [6, 23], "lockfil": 6, "wrapper": [6, 13], "filelock": 6, "softfilelock": 6, "make": [6, 21, 23], "work": [6, 12, 20, 22, 23, 26], "asyncio": [6, 13], "argstr": [6, 22, 24], "value_upd": 6, "field_nam": [6, 9], "updat": [6, 7, 9, 10, 15, 20], "wf_path": 6, "given": [6, 7, 9, 19], "string": [6, 7, 9, 12, 19, 24], "attribut": [6, 20, 22, 26], "custom": [6, 8, 20, 22, 24, 25], "valid": [6, 10, 20, 27], "take": [6, 7, 9, 21, 24, 25], "account": [6, 9], "ty": [6, 9], "union": [6, 24], "level": [6, 21], "depth": [6, 23], "addit": [6, 8, 9, 21, 22, 23, 24, 25, 26], "allowe_valu": 6, "tuple2list": 6, "whatev": 6, "exampl": [6, 7, 15, 21, 22, 24, 25, 26], "abc": 6, "b": [6, 10], "c": [6, 21, 23], "tupl": [6, 7, 9, 10, 12, 20, 24, 25, 26], "5": [6, 18, 19, 22, 23], "cmd": [6, 12], "strip": 6, "event": 6, "unless": [6, 24, 25], "alreadi": [6, 7, 20], "extract": [6, 22], "cpu": [6, 9, 20], "total": [6, 19], "system": [6, 7, 12, 13, 19, 20], "n_proc": [6, 13], "eventloop": 6, "tp": 6, "metadata": [6, 9, 22, 27], "precalcul": [6, 7], "recurs": [6, 7], "task_pkl": [6, 13], "load": [6, 20], "proper": [6, 20], "restor": 6, "identifi": [6, 18], "order": [6, 10, 21, 22, 24, 25, 26], "prioriti": 6, "names_onli": 6, "posit": [6, 22, 24], "convent": 6, "lowest": 6, "highest": 6, "unspecifi": 6, "neg": [6, 24], "d": 6, "e": [6, 7, 9, 10, 18, 21, 22, 24, 25, 26], "f": [6, 7], "visit": 6, "its": [6, 26], "interfac": [6, 10, 13, 20, 23], "hide_displai": 6, "captur": [6, 23], "standard": [6, 8, 9, 18], "displai": 6, "arriv": 6, "stream": 6, "read": [6, 7, 12, 20], "eof": 6, "discuss": 6, "stackoverflow": 6, "error_path": 6, "task_path": 6, "name_prefix": 6, "environ": [6, 12, 22], "port": 7, "after": [7, 10, 21, 22, 26], "part": [7, 10, 12, 23, 24, 25], "were": [7, 20, 23], "relat": [7, 10, 26], "py2": 7, "originalfil": 7, "newfil": 7, "create_new": 7, "use_hardlink": 7, "copy_related_fil": 7, "can": [7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26], "hard": [7, 24], "instead": [7, 20, 25], "symbol": 7, "symlink": 7, "regular": 7, "dest": 7, "unlink": 7, "diff": 7, "can_hardlink": 7, "hardlink": 7, "can_symlink": 7, "origin": [7, 8, 12, 23, 26], "specifi": [7, 8, 10, 12, 20, 21, 22, 24, 25], "posix": 7, "abl": 7, "preced": 7, "defin": [7, 22], "implement": [7, 9, 12, 13, 20, 23], "filelist": 7, "destin": 7, "length": [7, 8, 26], "greater": [7, 23], "filenam": [7, 19], "prefix": 7, "suffix": 7, "newpath": 7, "use_ext": 7, "manipul": [7, 23], "mai": [7, 21, 23], "charact": 7, "prepend": 7, "append": [7, 18], "extens": [7, 20, 24, 25], "absolut": 7, "modifi": 7, "import": [7, 10, 15, 21, 22], "pytest": 7, "sy": 7, "platform": 7, "startswith": 7, "win": 7, "skip": 7, "foo": 7, "nii": 7, "gz": 7, "pre": 7, "post": [7, 18], "tmp": 7, "prefoopost": 7, "include_this_fil": 7, "As": [7, 22, 24, 25], "g": [7, 9, 10, 22, 24, 25], "nifti": 7, "analyz": 7, "spm": [7, 23], "afni": [7, 23], "find": 7, "filetyp": 7, "dirpath": 7, "crypto": 7, "built": 7, "openssl_sha256": 7, "ignore_hidden_fil": 7, "ignore_hidden_dir": 7, "raise_notfound": 7, "content": 7, "everi": [7, 8, 10, 24], "singl": [7, 9, 10, 18, 20, 21, 22], "travers": 7, "cryptograph": 7, "ignor": 7, "begin": 7, "filenotfound": 7, "except": [7, 8, 20], "afil": 7, "chunk_len": 7, "8192": 7, "item": 7, "otherwis": [7, 19, 25], "cif": 7, "mount": [7, 12], "host": 7, "On": 7, "window": [7, 20], "through": [7, 26], "share": [7, 22, 23], "minshal": 7, "french": 7, "text": 7, "driver": 7, "expos": 7, "we": [7, 22, 24], "found": 7, "under": 7, "concurr": [7, 13, 20], "access": 7, "featur": [7, 22, 23, 26], "failur": [7, 20], "recent": 7, "lead": 7, "inconsist": 7, "behavior": 7, "filenotfounderror": 7, "disabl": [7, 24], "hdr": 7, "img": 7, "mat": 7, "brik": 7, "head": 7, "neuroimag": [7, 23], "interpret": 7, "pth": 7, "home": 7, "subject": 7, "state_ind": 7, "map_copyfil": 7, "templat": [7, 9, 16, 20, 22, 24, 25], "present": 7, "inputs_dict_st": 7, "spec_typ": 7, "inputs_dict": 7, "output_file_templ": [7, 22, 24, 25], "mostli": 8, "group": [8, 10, 22, 23, 27], "groups_stack": 8, "kei": [8, 10, 22, 23, 24, 26], "axi": [8, 10], "ax": [8, 10], "cur_depth": 8, "max_depth": 8, "inp": [8, 10], "shape": 8, "iter": 8, "split_it": 8, "prescrib": 8, "inputs_to_remov": 8, "due": [8, 10], "mutat": 8, "revers": [8, 24], "polish": 8, "notat": [8, 10], "recurr": 8, "algorithm": [8, 23], "perform": [8, 19, 26], "convers": [8, 24], "time": [8, 9, 23], "stack": [8, 10], "state_field": [8, 10], "translat": 8, "user": [8, 20, 21, 22, 23, 24, 25, 26], "impos": 8, "unwrap": [8, 10], "dataclass": [9, 20], "medatada": 9, "xor": [9, 24], "fulfil": 9, "mandatori": [9, 22, 24, 25], "point": [9, 12, 18, 22], "refin": 9, "design": [9, 23], "folder": 9, "invok": 9, "attr_typ": 9, "promis": 9, "chang": [9, 20, 24, 25], "classmethod": 9, "el": 9, "regard": 9, "float": [9, 15, 19, 22, 24], "repres": [9, 10, 21, 22, 23, 24, 26], "peak": 9, "consumpt": 9, "physic": 9, "ram": [9, 19], "virtual": 9, "memori": [9, 19, 20], "cwl": 9, "inlinejavascriptrequir": 9, "schemadefrequir": 9, "dockerrequir": 9, "softwarerequir": 9, "initialworkdirrequir": 9, "envvarrequir": 9, "shellcommandrequir": 9, "resourcerequir": 9, "inlinescriptrequir": 9, "shelltask": [9, 20], "exit": 9, "code": [9, 18, 20, 23], "pars": [9, 11], "singular": [9, 12, 20, 22, 23], "_noth": 9, "noth": [9, 20, 24, 25], "least": 9, "callabl": [9, 12, 25], "hook": [9, 18], "exclude_nam": 9, "reduc": [10, 22, 23, 26], "about": [10, 24, 25], "scalar": [10, 27], "rpn": 10, "compact": [10, 18], "_na": 10, "relev": 10, "could": [10, 24], "partial": [10, 23], "associ": [10, 23], "correct": 10, "propag": 10, "explicitli": 10, "had": 10, "prepar": 10, "merg": [10, 26], "inner": [10, 20, 21], "elements_to_remove_comb": 10, "hlpst": 10, "evalu": [10, 26], "prev": 10, "come": 10, "art": 10, "_nb": 10, "especi": 10, "address": [10, 23], "variabl": [10, 12, 20], "new_other_st": 10, "new_combin": 10, "within": [11, 21, 22], "neurodock": 12, "conda": 12, "env": 12, "niceman": 12, "config": 12, "intern": [12, 13, 19], "extern": [12, 23], "callback": [12, 19], "resum": 12, "dmtcp": 12, "local": [12, 24], "fragment": 12, "remot": [12, 18], "server": 12, "isol": 12, "bound": 12, "mode": [12, 20], "opt": 12, "py": [12, 13], "meth": 12, "container_typ": 12, "func": [12, 15], "separ": [12, 16, 20, 22, 24, 25], "respect": [12, 22], "quot": 12, "thereof": 12, "parallel": 13, "pool": 13, "dask": [13, 20], "distribut": [13, 20, 23], "experiment": [13, 20], "limit": [13, 20, 22], "test": [13, 20], "finish": 13, "submiss": 13, "attr": [13, 20, 24, 25], "pend": 13, "job": 13, "poll_delai": 13, "qsub_arg": 13, "write_output_fil": 13, "max_job_array_length": 13, "50": 13, "indirect_submit_host": 13, "max_thread": 13, "poll_for_result_fil": 13, "default_threads_per_task": 13, "polls_before_checking_evict": 13, "60": 13, "collect_jobs_delai": 13, "30": 13, "default_qsub_arg": 13, "max_mem_fre": 13, "jobid": 13, "threads_request": 13, "task_qsub_arg": 13, "mem_fre": 13, "api": [13, 20, 23], "sarg": 13, "tasks_to_run": 13, "error_fil": 13, "linearli": 13, "sbatch_arg": 13, "decor": [15, 22, 23], "appli": [15, 21], "def": [15, 22], "squar": [15, 26], "promot": 15, "namespac": [16, 20], "reserv": 16, "manag": [16, 20, 26], "To": 16, "pleas": 16, "fork": 16, "redirect": 18, "truncat": 18, "open": [18, 23], "abstract": 18, "rest": 18, "endpoint": 18, "statu": [18, 19], "request": 18, "intenum": 18, "allow": [18, 20, 21, 22, 23, 24], "6": [18, 23], "collected_path": 18, "message_path": 18, "ld_op": 18, "compil": 18, "place": 18, "pld": 18, "jsonld": 18, "context": 18, "build": [18, 23, 24, 25], "non": 18, "timestamp": 18, "nidm": 18, "log": [18, 19], "pid": 19, "interv": 19, "logdir": 19, "thread": 19, "certain": 19, "frequenc": 19, "mem_mb": 19, "num_thread": 19, "pyfunc": 19, "integ": [19, 24], "high": 19, "watermark": 19, "far": 19, "dure": 19, "mb": 19, "gb": 19, "statist": [19, 22], "pipelin": [19, 23], "being": [19, 23], "consid": [19, 24], "info": 19, "logger": 19, "fix": 20, "issu": 20, "guid": [20, 23], "docstr": 20, "messang": 20, "syntax": [20, 22, 24, 25, 26], "newer": 20, "padra": 20, "improv": [20, 22], "adapt": 20, "better": 20, "switch": 20, "pkg_resourc": 20, "declare_namespac": 20, "stdlib": 20, "pkgutil": 20, "extend_path": 20, "move": 20, "readm": 20, "rst": 20, "declar": [20, 22], "ensur": [20, 23], "edit": 20, "instal": 20, "conflict": 20, "mention": [20, 24, 25], "txt": 20, "tutori": 20, "repo": 20, "codecov": 20, "_connect": 20, "numpi": [20, 22], "arrai": 20, "to_job": 20, "kept": 20, "standalon": [20, 22, 23], "create_pyscript": 20, "simplifi": 20, "report": 20, "fli": 20, "make_class": 20, "properli": 20, "azur": 20, "ci": 20, "etelementri": 20, "verbos": 20, "reorgan": 20, "small": 20, "some": [20, 23], "osx": 20, "sto": 20, "travi": 20, "right": 20, "pass": [20, 21, 22, 23, 24, 25], "test_rerun": 20, "dimension": [20, 21], "how": [20, 22], "much": 20, "sphinx": 20, "document": 20, "contribut": 20, "md": 20, "empti": [20, 24], "fail": 20, "big": 20, "next": [20, 22, 26], "lzout": [20, 22], "all_": 20, "dataflow": [20, 21, 26, 27], "creation": 20, "notebook": 20, "concept": [20, 21, 22, 23, 26], "initi": 20, "In": [21, 22, 23, 24, 25, 26], "achiev": 21, "note": [21, 23], "sens": 21, "x": [21, 22, 26], "x_1": [21, 26], "x_2": [21, 26], "x_n": [21, 26], "mapsto": [21, 26], "out": [21, 22], "out_": 21, "comb": 21, "x_i": 21, "situat": 21, "variou": 21, "wai": [21, 26], "section": [21, 22, 24, 25, 26], "might": [21, 22, 23], "want": [21, 24, 25], "y": [21, 22, 26], "would": [21, 26], "two": [21, 22, 26], "y1": 21, "y2": 21, "y_m": [21, 26], "longmapsto": [21, 26], "y_1": [21, 26], "howev": [21, 24], "One": [21, 22, 26], "These": [21, 22, 23, 26], "mix": 21, "describ": [22, 24, 26], "thu": 22, "construct": [22, 23], "dual": 22, "sever": [22, 23, 24], "applic": [22, 23, 26], "librari": [22, 23], "interact": [22, 23], "termin": 22, "np": 22, "fft": 22, "ndarrai": 22, "fft_task": 22, "random": 22, "rand": 22, "512": 22, "anoth": [22, 23], "arbitrari": [22, 23, 26], "mean": [22, 25], "std": 22, "mean_dev": 22, "my_data": 22, "st": 22, "stdev": 22, "facilit": [22, 23], "downstream": 22, "pwd": 22, "l": 22, "my_dir": 22, "accommod": 22, "complex": [22, 24, 26], "fsl": [22, 23], "bet": [22, 24], "brain": 22, "tool": [22, 23], "input_fil": 22, "output_fil": 22, "m": [22, 24], "treat": [22, 24], "shown": 22, "even": 22, "out_fil": [22, 24], "bet_input_spec": [22, 24], "in_fil": [22, 24], "help_str": [22, 24, 25], "_br": [22, 24], "mask": [22, 24], "binari": [22, 24], "child": 22, "parent": [22, 24, 25], "softwar": [22, 23], "extrem": 22, "project": [22, 23], "encapsul": 22, "technologi": 22, "scientif": [22, 23], "reproduc": [22, 23], "behind": [22, 23], "directli": 22, "automat": 22, "equival": 22, "busybox": 22, "subclass": 22, "act": 22, "hashabl": 22, "unit": 22, "unlik": 22, "emb": 22, "acycl": [22, 23], "simpli": 22, "special": [22, 24, 26], "assign": 22, "rather": 22, "mult": 22, "mlt": 22, "lzin": 22, "add2": 22, "control": [22, 26], "heart": 22, "power": [22, 23], "formal": 22, "Its": 22, "recombin": [22, 23], "task_with_st": 22, "respons": 22, "back": 22, "while": [22, 23], "illustr": 22, "scalabl": 22, "lightweight": 23, "commun": 23, "purpos": 23, "domain": 23, "often": 23, "sophist": 23, "analys": 23, "encompass": 23, "larg": 23, "necessarili": 23, "author": 23, "program": 23, "common": 23, "practic": 23, "semi": 23, "manual": 23, "scientist": 23, "approach": 23, "conceptu": 23, "easi": 23, "consum": 23, "prone": 23, "difficult": 23, "consist": 23, "demand": 23, "organ": 23, "fulli": 23, "autom": 23, "wa": [23, 24, 25, 26], "motiv": 23, "second": [23, 26], "uniform": 23, "compon": [23, 27], "born": 23, "decad": 23, "ant": 23, "freesurf": 23, "flexibl": [23, 26], "made": 23, "ideal": 23, "basi": 23, "popular": 23, "preprocess": 23, "fmriprep": 23, "pac": 23, "meant": 23, "eas": 23, "mind": 23, "itself": 23, "goal": [23, 26], "well": 23, "reusabl": 23, "customiz": 23, "compos": 23, "encourag": 23, "similar": [23, 26], "model": 23, "global": 23, "reus": 23, "alongsid": 23, "integr": 23, "nativ": 23, "via": 23, "mechan": 23, "activ": 23, "releas": 23, "8": 23, "7": 23, "programm": 23, "subpackag": 23, "search": 23, "page": 23, "let": 24, "alwai": [24, 25], "you": [24, 25], "think": [24, 25], "usual": [24, 25], "top": [24, 25], "your": [24, 25], "cover": [24, 25], "customis": [24, 25], "three": [24, 25], "But": 24, "below": 24, "field1": 24, "field1_nam": 24, "ib": [24, 25], "field1_typ": 24, "shorter": 24, "abov": 24, "short": [24, 25], "sep": 24, "v": 24, "inp_field": 24, "nonneg": 24, "allowed_valu": 24, "mutual": 24, "exclus": 24, "possibl": [24, 25], "container_path": 24, "file1": [24, 25], "output_field_nam": [24, 25], "keep_extens": [24, 25], "readonli": 24, "flda": 24, "fldb": 24, "formatt": 24, "entir": [24, 25], "allowev_valu": 24, "out1": 25, "inp1": [25, 26], "inp2": [25, 26], "similarli": 25, "recogn": 25, "main": 26, "distinguish": 26, "typic": 26, "involv": 26, "signific": 26, "overhead": 26, "up": 26, "simplest": 26, "therefor": 26, "diagram": 26, "colour": 26, "whenev": 26, "complic": 26, "wise": 26, "parenthesi": 26, "y_2": 26, "y_n": 26, "bracket": 26, "schemat": 26, "inp3": 26, "pairwis": 26, "explain": 26}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "check_latest_version"], [1, 0, 0, "-", "engine"], [14, 0, 0, "-", "mark"], [0, 1, 1, "", "set_input_validator"], [16, 0, 0, "-", "tasks"], [17, 0, 0, "-", "utils"]], "pydra.engine": [[1, 2, 1, "", "AuditFlag"], [1, 2, 1, "", "DockerTask"], [1, 2, 1, "", "ShellCommandTask"], [1, 2, 1, "", "Submitter"], [1, 2, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "graph"], [6, 0, 0, "-", "helpers"], [7, 0, 0, "-", "helpers_file"], [8, 0, 0, "-", "helpers_state"], [9, 0, 0, "-", "specs"], [10, 0, 0, "-", "state"], [11, 0, 0, "-", "submitter"], [12, 0, 0, "-", "task"], [13, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 3, 1, "", "ALL"], [1, 3, 1, "", "NONE"], [1, 3, 1, "", "PROV"], [1, 3, 1, "", "RESOURCE"]], "pydra.engine.DockerTask": [[1, 4, 1, "", "container_args"], [1, 3, 1, "", "init"]], "pydra.engine.ShellCommandTask": [[1, 4, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 3, 1, "", "input_spec"], [1, 3, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 5, 1, "", "close"], [1, 5, 1, "", "expand_runnable"], [1, 5, 1, "", "expand_workflow"], [1, 5, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 5, 1, "", "add"], [1, 4, 1, "", "checksum"], [1, 5, 1, "", "create_connections"], [1, 5, 1, "", "create_dotfile"], [1, 4, 1, "", "graph_sorted"], [1, 4, 1, "", "nodes"], [1, 5, 1, "", "set_output"]], "pydra.engine.audit": [[2, 2, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 5, 1, "", "audit_check"], [2, 5, 1, "", "audit_message"], [2, 5, 1, "", "audit_task"], [2, 5, 1, "", "finalize_audit"], [2, 5, 1, "", "monitor"], [2, 5, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 2, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 2, 1, "", "TaskBase"], [4, 2, 1, "", "Workflow"], [4, 1, 1, "", "is_lazy"], [4, 1, 1, "", "is_task"], [4, 1, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 3, 1, "", "audit_flags"], [4, 4, 1, "", "cache_dir"], [4, 4, 1, "", "cache_locations"], [4, 4, 1, "", "can_resume"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "checksum_states"], [4, 5, 1, "", "combine"], [4, 4, 1, "", "cont_dim"], [4, 4, 1, "", "done"], [4, 4, 1, "", "errored"], [4, 4, 1, "", "generated_output_names"], [4, 5, 1, "", "get_input_el"], [4, 5, 1, "", "help"], [4, 4, 1, "", "output_dir"], [4, 4, 1, "", "output_names"], [4, 5, 1, "", "pickle_task"], [4, 5, 1, "", "result"], [4, 5, 1, "", "set_state"], [4, 5, 1, "", "split"], [4, 4, 1, "", "uid"], [4, 4, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 5, 1, "", "add"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "create_connections"], [4, 5, 1, "", "create_dotfile"], [4, 4, 1, "", "graph_sorted"], [4, 4, 1, "", "nodes"], [4, 5, 1, "", "set_output"]], "pydra.engine.graph": [[5, 2, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[5, 5, 1, "", "add_edges"], [5, 5, 1, "", "add_edges_description"], [5, 5, 1, "", "add_nodes"], [5, 5, 1, "", "calculate_max_paths"], [5, 5, 1, "", "copy"], [5, 5, 1, "", "create_dotfile_detailed"], [5, 5, 1, "", "create_dotfile_nested"], [5, 5, 1, "", "create_dotfile_simple"], [5, 4, 1, "", "edges"], [5, 4, 1, "", "edges_names"], [5, 5, 1, "", "export_graph"], [5, 4, 1, "", "nodes"], [5, 4, 1, "", "nodes_details"], [5, 4, 1, "", "nodes_names_map"], [5, 5, 1, "", "remove_nodes"], [5, 5, 1, "", "remove_nodes_connections"], [5, 5, 1, "", "remove_previous_connections"], [5, 5, 1, "", "remove_successors_nodes"], [5, 4, 1, "", "sorted_nodes"], [5, 4, 1, "", "sorted_nodes_names"], [5, 5, 1, "", "sorting"]], "pydra.engine.helpers": [[6, 2, 1, "", "PydraFileLock"], [6, 1, 1, "", "argstr_formatting"], [6, 1, 1, "", "copyfile_workflow"], [6, 1, 1, "", "create_checksum"], [6, 1, 1, "", "custom_validator"], [6, 1, 1, "", "ensure_list"], [6, 1, 1, "", "execute"], [6, 1, 1, "", "gather_runtime_info"], [6, 1, 1, "", "get_available_cpus"], [6, 1, 1, "", "get_open_loop"], [6, 1, 1, "", "hash_function"], [6, 1, 1, "", "hash_value"], [6, 1, 1, "", "load_and_run"], [6, 1, 1, "", "load_and_run_async"], [6, 1, 1, "", "load_result"], [6, 1, 1, "", "load_task"], [6, 1, 1, "", "make_klass"], [6, 1, 1, "", "output_from_inputfields"], [6, 1, 1, "", "position_sort"], [6, 1, 1, "", "print_help"], [6, 1, 1, "", "read_and_display"], [6, 1, 1, "", "read_and_display_async"], [6, 1, 1, "", "read_stream_and_display"], [6, 1, 1, "", "record_error"], [6, 1, 1, "", "save"], [6, 1, 1, "", "task_hash"]], "pydra.engine.helpers_file": [[7, 1, 1, "", "copyfile"], [7, 1, 1, "", "copyfile_input"], [7, 1, 1, "", "copyfiles"], [7, 1, 1, "", "ensure_list"], [7, 1, 1, "", "fname_presuffix"], [7, 1, 1, "", "get_related_files"], [7, 1, 1, "", "hash_dir"], [7, 1, 1, "", "hash_file"], [7, 1, 1, "", "is_container"], [7, 1, 1, "", "is_existing_file"], [7, 1, 1, "", "is_local_file"], [7, 1, 1, "", "on_cifs"], [7, 6, 1, "", "related_filetype_sets"], [7, 1, 1, "", "split_filename"], [7, 1, 1, "", "template_update"], [7, 1, 1, "", "template_update_single"]], "pydra.engine.helpers_state": [[8, 7, 1, "", "PydraStateError"], [8, 1, 1, "", "add_name_combiner"], [8, 1, 1, "", "add_name_splitter"], [8, 1, 1, "", "combine_final_groups"], [8, 1, 1, "", "converter_groups_to_input"], [8, 1, 1, "", "flatten"], [8, 1, 1, "", "input_shape"], [8, 1, 1, "", "inputs_types_to_dict"], [8, 1, 1, "", "iter_splits"], [8, 1, 1, "", "map_splits"], [8, 1, 1, "", "remove_inp_from_splitter_rpn"], [8, 1, 1, "", "rpn2splitter"], [8, 1, 1, "", "splits_groups"], [8, 1, 1, "", "splitter2rpn"]], "pydra.engine.specs": [[9, 2, 1, "", "BaseSpec"], [9, 2, 1, "", "ContainerSpec"], [9, 2, 1, "", "Directory"], [9, 2, 1, "", "DockerSpec"], [9, 2, 1, "", "File"], [9, 2, 1, "", "FunctionSpec"], [9, 2, 1, "", "LazyField"], [9, 2, 1, "", "MultiInputFile"], [9, 2, 1, "", "MultiInputObj"], [9, 2, 1, "", "MultiOutputFile"], [9, 2, 1, "", "MultiOutputObj"], [9, 2, 1, "", "Result"], [9, 2, 1, "", "Runtime"], [9, 2, 1, "", "RuntimeSpec"], [9, 2, 1, "", "ShellOutSpec"], [9, 2, 1, "", "ShellSpec"], [9, 2, 1, "", "SingularitySpec"], [9, 2, 1, "", "SpecInfo"], [9, 2, 1, "", "TaskHook"], [9, 1, 1, "", "attr_fields"], [9, 1, 1, "", "attr_fields_dict"], [9, 1, 1, "", "donothing"], [9, 1, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[9, 5, 1, "", "check_fields_input_spec"], [9, 5, 1, "", "check_metadata"], [9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "copyfile_input"], [9, 4, 1, "", "hash"], [9, 5, 1, "", "retrieve_values"], [9, 5, 1, "", "template_update"]], "pydra.engine.specs.ContainerSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "container_xargs"], [9, 3, 1, "", "image"]], "pydra.engine.specs.DockerSpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.FunctionSpec": [[9, 5, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[9, 5, 1, "", "get_value"]], "pydra.engine.specs.MultiInputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.MultiOutputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.Result": [[9, 3, 1, "", "errored"], [9, 5, 1, "", "get_output_field"], [9, 3, 1, "", "output"], [9, 3, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[9, 3, 1, "", "cpu_peak_percent"], [9, 3, 1, "", "rss_peak_gb"], [9, 3, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "network"], [9, 3, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "generated_output_names"], [9, 3, 1, "", "return_code"], [9, 3, 1, "", "stderr"], [9, 3, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[9, 3, 1, "", "args"], [9, 5, 1, "", "check_metadata"], [9, 3, 1, "", "executable"], [9, 5, 1, "", "retrieve_values"]], "pydra.engine.specs.SingularitySpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.SpecInfo": [[9, 3, 1, "", "bases"], [9, 3, 1, "", "fields"], [9, 3, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[9, 3, 1, "", "post_run"], [9, 3, 1, "", "post_run_task"], [9, 3, 1, "", "pre_run"], [9, 3, 1, "", "pre_run_task"], [9, 5, 1, "", "reset"]], "pydra.engine.state": [[10, 2, 1, "", "State"]], "pydra.engine.state.State": [[10, 4, 1, "id0", "combiner"], [10, 5, 1, "", "combiner_validation"], [10, 4, 1, "", "current_combiner"], [10, 4, 1, "", "current_combiner_all"], [10, 4, 1, "", "current_splitter"], [10, 4, 1, "", "current_splitter_rpn"], [10, 3, 1, "", "final_combined_ind_mapping"], [10, 3, 1, "", "group_for_inputs"], [10, 3, 1, "", "group_for_inputs_final"], [10, 3, 1, "", "groups_stack_final"], [10, 4, 1, "id1", "inner_inputs"], [10, 3, 1, "", "inputs_ind"], [10, 3, 1, "", "name"], [10, 4, 1, "id2", "other_states"], [10, 5, 1, "", "prepare_inputs"], [10, 5, 1, "", "prepare_states"], [10, 5, 1, "", "prepare_states_combined_ind"], [10, 5, 1, "", "prepare_states_ind"], [10, 5, 1, "", "prepare_states_val"], [10, 4, 1, "", "prev_state_combiner"], [10, 4, 1, "", "prev_state_combiner_all"], [10, 4, 1, "", "prev_state_splitter"], [10, 4, 1, "", "prev_state_splitter_rpn"], [10, 4, 1, "", "prev_state_splitter_rpn_compact"], [10, 5, 1, "", "set_input_groups"], [10, 5, 1, "", "splits"], [10, 4, 1, "id3", "splitter"], [10, 4, 1, "id4", "splitter_final"], [10, 4, 1, "id5", "splitter_rpn"], [10, 4, 1, "id6", "splitter_rpn_compact"], [10, 4, 1, "", "splitter_rpn_final"], [10, 5, 1, "", "splitter_validation"], [10, 3, 1, "", "states_ind"], [10, 3, 1, "", "states_val"], [10, 5, 1, "", "update_connections"]], "pydra.engine.submitter": [[11, 2, 1, "", "Submitter"], [11, 1, 1, "", "get_runnable_tasks"], [11, 1, 1, "", "is_runnable"], [11, 1, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[11, 5, 1, "", "close"], [11, 5, 1, "", "expand_runnable"], [11, 5, 1, "", "expand_workflow"], [11, 5, 1, "", "submit_from_call"]], "pydra.engine.task": [[12, 2, 1, "", "ContainerTask"], [12, 2, 1, "", "DockerTask"], [12, 2, 1, "", "FunctionTask"], [12, 2, 1, "", "ShellCommandTask"], [12, 2, 1, "", "SingularityTask"], [12, 1, 1, "", "split_cmd"]], "pydra.engine.task.ContainerTask": [[12, 5, 1, "", "bind_paths"], [12, 5, 1, "", "binds"], [12, 5, 1, "", "container_check"]], "pydra.engine.task.DockerTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.task.ShellCommandTask": [[12, 4, 1, "", "cmdline"], [12, 4, 1, "", "command_args"], [12, 3, 1, "", "input_spec"], [12, 3, 1, "", "output_spec"]], "pydra.engine.task.SingularityTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.workers": [[13, 2, 1, "", "ConcurrentFuturesWorker"], [13, 2, 1, "", "DaskWorker"], [13, 2, 1, "", "DistributedWorker"], [13, 2, 1, "", "SGEWorker"], [13, 2, 1, "", "SerialWorker"], [13, 2, 1, "", "SlurmWorker"], [13, 2, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_as_coro"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_dask"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[13, 5, 1, "", "fetch_finished"], [13, 3, 1, "", "max_jobs"]], "pydra.engine.workers.SGEWorker": [[13, 5, 1, "", "check_for_results_files"], [13, 5, 1, "", "get_output_by_task_pkl"], [13, 5, 1, "", "get_tasks_to_run"], [13, 5, 1, "", "run_el"], [13, 5, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_serial"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[13, 5, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.mark": [[15, 0, 0, "-", "functions"]], "pydra.mark.functions": [[15, 1, 1, "", "annotate"], [15, 1, 1, "", "task"]], "pydra.utils": [[18, 0, 0, "-", "messenger"], [19, 0, 0, "-", "profiler"]], "pydra.utils.messenger": [[18, 2, 1, "", "AuditFlag"], [18, 2, 1, "", "FileMessenger"], [18, 2, 1, "", "Messenger"], [18, 2, 1, "", "PrintMessenger"], [18, 2, 1, "", "RemoteRESTMessenger"], [18, 2, 1, "", "RuntimeHooks"], [18, 1, 1, "", "collect_messages"], [18, 1, 1, "", "gen_uuid"], [18, 1, 1, "", "make_message"], [18, 1, 1, "", "now"], [18, 1, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "NONE"], [18, 3, 1, "", "PROV"], [18, 3, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[18, 3, 1, "", "resource_monitor_post_stop"], [18, 3, 1, "", "resource_monitor_pre_start"], [18, 3, 1, "", "task_execute_post_exit"], [18, 3, 1, "", "task_execute_pre_entry"], [18, 3, 1, "", "task_run_entry"], [18, 3, 1, "", "task_run_exit"]], "pydra.utils.profiler": [[19, 2, 1, "", "ResourceMonitor"], [19, 1, 1, "", "get_max_resources_used"], [19, 1, 1, "", "get_system_total_memory_gb"], [19, 1, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[19, 4, 1, "", "fname"], [19, 5, 1, "", "run"], [19, 5, 1, "", "stop"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:property", "5": "py:method", "6": "py:data", "7": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "method", "Python method"], "6": ["py", "data", "Python data"], "7": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 23], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 23], "packag": [1, 14, 16, 17], "submodul": [1, 14, 17], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19], "boutiqu": 3, "core": 4, "graph": 5, "helper": 6, "helpers_fil": 7, "copi": 7, "option": 7, "exist": 7, "file": 7, "new": [7, 24], "helpers_st": 8, "spec": [9, 24], "state": [10, 22, 26], "submitt": 11, "task": [12, 16, 21, 22], "note": [12, 20], "worker": 13, "mark": [14, 15], "function": [15, 22], "util": [17, 18, 19], "messeng": 18, "profil": 19, "releas": 20, "0": 20, "8": 20, "7": 20, "6": 20, "2": 20, "1": 20, "5": 20, "4": 20, "3": 20, "group": 21, "": [21, 22, 23], "output": [21, 25], "dataflow": [22, 23], "compon": 22, "workflow": 22, "shell": 22, "command": 22, "contain": 22, "welcom": 23, "A": 23, "simpl": 23, "scalabl": 23, "semant": 23, "document": 23, "content": 23, "indic": 23, "tabl": 23, "input": [24, 26], "specif": [24, 25], "ad": 24, "field": 24, "type": [24, 26], "metadata": [24, 25], "valid": 24, "nest": 26, "loop": 26, "over": 26, "splitter": 26, "scalar": 26, "outer": 26, "user": 27, "guid": 27}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [14, "submodules"], [17, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.graph module": [[5, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[6, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[7, "module-pydra.engine.helpers_file"]], "Copy options for existing files": [[7, null]], "Copy options for new files": [[7, null]], "pydra.engine.helpers_state module": [[8, "module-pydra.engine.helpers_state"]], "pydra.engine.specs module": [[9, "module-pydra.engine.specs"]], "pydra.engine.state module": [[10, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[11, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[12, "module-pydra.engine.task"]], "Notes:": [[12, null]], "pydra.engine.workers module": [[13, "module-pydra.engine.workers"]], "pydra.mark package": [[14, "module-pydra.mark"]], "pydra.mark.functions module": [[15, "module-pydra.mark.functions"]], "pydra.tasks package": [[16, "module-pydra.tasks"]], "pydra.utils package": [[17, "module-pydra.utils"]], "pydra.utils.messenger module": [[18, "module-pydra.utils.messenger"]], "pydra.utils.profiler module": [[19, "module-pydra.utils.profiler"]], "Release Notes": [[20, "release-notes"]], "0.8.0": [[20, "id1"]], "0.7.0": [[20, "id2"]], "0.6.2": [[20, "id3"]], "0.6.1": [[20, "id4"]], "0.6": [[20, "id5"]], "0.5": [[20, "id6"]], "0.4": [[20, "id7"]], "0.3.1": [[20, "id8"]], "0.3": [[20, "id9"]], "0.2.2": [[20, "id10"]], "0.2.1": [[20, "id11"]], "0.2": [[20, "id12"]], "0.1": [[20, "id13"]], "0.0.1": [[20, "id14"]], "Grouping Task\u2019s Output": [[21, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[22, "dataflows-components-task-and-workflow"]], "Function Tasks": [[22, "function-tasks"]], "Shell Command Tasks": [[22, "shell-command-tasks"]], "Container Tasks": [[22, "container-tasks"]], "Workflows": [[22, "workflows"]], "Task\u2019s State": [[22, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[23, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[23, null]], "Indices and tables": [[23, "indices-and-tables"]], "Input Specification": [[24, "input-specification"]], "Adding a New Field to the Spec": [[24, "adding-a-new-field-to-the-spec"]], "Types": [[24, "types"]], "Metadata": [[24, "metadata"], [25, "metadata"]], "Validators": [[24, "validators"]], "Output Specification": [[25, "output-specification"]], "State and Nested Loops over Input": [[26, "state-and-nested-loops-over-input"]], "Types of Splitter": [[26, "types-of-splitter"]], "Scalar Splitter": [[26, "scalar-splitter"]], "Outer Splitter": [[26, "outer-splitter"]], "User Guide": [[27, "user-guide"]]}, "indexentries": {"check_latest_version() (in module pydra)": [[0, "pydra.check_latest_version"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.graph"], [6, "module-pydra.engine.helpers"], [7, "module-pydra.engine.helpers_file"], [8, "module-pydra.engine.helpers_state"], [9, "module-pydra.engine.specs"], [10, "module-pydra.engine.state"], [11, "module-pydra.engine.submitter"], [12, "module-pydra.engine.task"], [13, "module-pydra.engine.workers"], [14, "module-pydra.mark"], [15, "module-pydra.mark.functions"], [16, "module-pydra.tasks"], [17, "module-pydra.utils"], [18, "module-pydra.utils.messenger"], [19, "module-pydra.utils.profiler"]], "pydra": [[0, "module-pydra"]], "set_input_validator() (in module pydra)": [[0, "pydra.set_input_validator"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "dockertask (class in pydra.engine)": [[1, "pydra.engine.DockerTask"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "container_args (pydra.engine.dockertask property)": [[1, "pydra.engine.DockerTask.container_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "init (pydra.engine.dockertask attribute)": [[1, "pydra.engine.DockerTask.init"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "digraph (class in pydra.engine.graph)": [[5, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[5, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[6, "pydra.engine.helpers.PydraFileLock"]], "argstr_formatting() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.create_checksum"]], "custom_validator() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.custom_validator"]], "ensure_list() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.execute"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_open_loop"]], "hash_function() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_function"]], "hash_value() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_value"]], "load_and_run() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.output_from_inputfields"]], "position_sort() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[6, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.save"]], "task_hash() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.task_hash"]], "copyfile() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile"]], "copyfile_input() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile_input"]], "copyfiles() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfiles"]], "ensure_list() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.ensure_list"]], "fname_presuffix() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.fname_presuffix"]], "get_related_files() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.get_related_files"]], "hash_dir() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_dir"]], "hash_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_file"]], "is_container() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_container"]], "is_existing_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_existing_file"]], "is_local_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.on_cifs"]], "pydra.engine.helpers_file": [[7, "module-pydra.engine.helpers_file"]], "related_filetype_sets (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.related_filetype_sets"]], "split_filename() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.split_filename"]], "template_update() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[8, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[8, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splitter2rpn"]], "basespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.BaseSpec"]], "containerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ContainerSpec"]], "directory (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Directory"]], "dockerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.DockerSpec"]], "file (class in pydra.engine.specs)": [[9, "pydra.engine.specs.File"]], "functionspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyField"]], "multiinputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputFile"]], "multiinputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputObj"]], "multioutputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputFile"]], "multioutputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputObj"]], "result (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellSpec"]], "singularityspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SingularitySpec"]], "specinfo (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SpecInfo"]], "taskhook (class in pydra.engine.specs)": [[9, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields"]], "attr_fields_dict() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields_dict"]], "bases (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.bases"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[9, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container"]], "container (pydra.engine.specs.dockerspec attribute)": [[9, "pydra.engine.specs.DockerSpec.container"]], "container (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.container"]], "container (pydra.engine.specs.singularityspec attribute)": [[9, "pydra.engine.specs.SingularitySpec.container"]], "container_xargs (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container_xargs"]], "converter() (pydra.engine.specs.multiinputobj class method)": [[9, "pydra.engine.specs.MultiInputObj.converter"]], "converter() (pydra.engine.specs.multioutputobj class method)": [[9, "pydra.engine.specs.MultiOutputObj.converter"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.executable"]], "fields (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[9, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[9, "pydra.engine.specs.BaseSpec.hash"]], "image (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.image"]], "name (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[9, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[9, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.runtime"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.template_update"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[10, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[10, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[10, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[10, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[10, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[10, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[10, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[10, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[10, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[11, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[11, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.submit_from_call"]], "containertask (class in pydra.engine.task)": [[12, "pydra.engine.task.ContainerTask"]], "dockertask (class in pydra.engine.task)": [[12, "pydra.engine.task.DockerTask"]], "functiontask (class in pydra.engine.task)": [[12, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[12, "pydra.engine.task.ShellCommandTask"]], "singularitytask (class in pydra.engine.task)": [[12, "pydra.engine.task.SingularityTask"]], "bind_paths() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.bind_paths"]], "binds() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.binds"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.command_args"]], "container_args (pydra.engine.task.dockertask property)": [[12, "pydra.engine.task.DockerTask.container_args"]], "container_args (pydra.engine.task.singularitytask property)": [[12, "pydra.engine.task.SingularityTask.container_args"]], "container_check() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.container_check"]], "init (pydra.engine.task.dockertask attribute)": [[12, "pydra.engine.task.DockerTask.init"]], "init (pydra.engine.task.singularitytask attribute)": [[12, "pydra.engine.task.SingularityTask.init"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[12, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[12, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DistributedWorker"]], "sgeworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[13, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[13, "pydra.engine.workers.DistributedWorker.max_jobs"]], "pydra.engine.workers": [[13, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[13, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.submit_array_job"]], "pydra.mark": [[14, "module-pydra.mark"]], "annotate() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[15, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.task"]], "pydra.tasks": [[16, "module-pydra.tasks"]], "pydra.utils": [[17, "module-pydra.utils"]], "all (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[18, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[18, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[18, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[18, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[18, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "resourcemonitor (class in pydra.utils.profiler)": [[19, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[19, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[19, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.stop"]]}}) \ No newline at end of file diff --git a/0.21/state.html b/0.21/state.html new file mode 100644 index 0000000000..a15af277bf --- /dev/null +++ b/0.21/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.21/user_guide.html b/0.21/user_guide.html new file mode 100644 index 0000000000..23fb42ca79 --- /dev/null +++ b/0.21/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.22/.buildinfo b/0.22/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/0.22/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/0.22/.doctrees/api.doctree b/0.22/.doctrees/api.doctree new file mode 100644 index 0000000000..75a6888879 Binary files /dev/null and b/0.22/.doctrees/api.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.audit.doctree b/0.22/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..da1640dc28 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.boutiques.doctree b/0.22/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..05f389f79b Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.core.doctree b/0.22/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..d8bab5da41 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.core.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.doctree b/0.22/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..427bf05eb9 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.graph.doctree b/0.22/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..726bf122d9 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.helpers.doctree b/0.22/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..a4de72ce47 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.helpers_file.doctree b/0.22/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..8aaaaa3e42 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.helpers_state.doctree b/0.22/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..2e2095b913 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.specs.doctree b/0.22/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..7aa2192dae Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.state.doctree b/0.22/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..d8236f9d6d Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.state.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.submitter.doctree b/0.22/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..ac26b25719 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.task.doctree b/0.22/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..22a65b81b4 Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.task.doctree differ diff --git a/0.22/.doctrees/api/pydra.engine.workers.doctree b/0.22/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..0561c8372c Binary files /dev/null and b/0.22/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/0.22/.doctrees/api/pydra.mark.doctree b/0.22/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..2e609a4394 Binary files /dev/null and b/0.22/.doctrees/api/pydra.mark.doctree differ diff --git a/0.22/.doctrees/api/pydra.mark.functions.doctree b/0.22/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..048b307c4f Binary files /dev/null and b/0.22/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/0.22/.doctrees/api/pydra.tasks.doctree b/0.22/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..43aa3dd7e5 Binary files /dev/null and b/0.22/.doctrees/api/pydra.tasks.doctree differ diff --git a/0.22/.doctrees/api/pydra.utils.doctree b/0.22/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..219f2c0ddc Binary files /dev/null and b/0.22/.doctrees/api/pydra.utils.doctree differ diff --git a/0.22/.doctrees/api/pydra.utils.messenger.doctree b/0.22/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..8caf2d339a Binary files /dev/null and b/0.22/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/0.22/.doctrees/api/pydra.utils.profiler.doctree b/0.22/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..2199e5cf04 Binary files /dev/null and b/0.22/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/0.22/.doctrees/changes.doctree b/0.22/.doctrees/changes.doctree new file mode 100644 index 0000000000..2858f8c620 Binary files /dev/null and b/0.22/.doctrees/changes.doctree differ diff --git a/0.22/.doctrees/combiner.doctree b/0.22/.doctrees/combiner.doctree new file mode 100644 index 0000000000..ceef7f8cfb Binary files /dev/null and b/0.22/.doctrees/combiner.doctree differ diff --git a/0.22/.doctrees/components.doctree b/0.22/.doctrees/components.doctree new file mode 100644 index 0000000000..62ec133d78 Binary files /dev/null and b/0.22/.doctrees/components.doctree differ diff --git a/0.22/.doctrees/environment.pickle b/0.22/.doctrees/environment.pickle new file mode 100644 index 0000000000..8210ddd2e9 Binary files /dev/null and b/0.22/.doctrees/environment.pickle differ diff --git a/0.22/.doctrees/index.doctree b/0.22/.doctrees/index.doctree new file mode 100644 index 0000000000..ad400abc02 Binary files /dev/null and b/0.22/.doctrees/index.doctree differ diff --git a/0.22/.doctrees/input_spec.doctree b/0.22/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..8e06ce4977 Binary files /dev/null and b/0.22/.doctrees/input_spec.doctree differ diff --git a/0.22/.doctrees/output_spec.doctree b/0.22/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..23fb677a31 Binary files /dev/null and b/0.22/.doctrees/output_spec.doctree differ diff --git a/0.22/.doctrees/state.doctree b/0.22/.doctrees/state.doctree new file mode 100644 index 0000000000..0ae60b4b49 Binary files /dev/null and b/0.22/.doctrees/state.doctree differ diff --git a/0.22/.doctrees/user_guide.doctree b/0.22/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..9dc78c30b2 Binary files /dev/null and b/0.22/.doctrees/user_guide.doctree differ diff --git a/0.22/.nojekyll b/0.22/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/0.22/_images/nd_spl_1.png b/0.22/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/0.22/_images/nd_spl_1.png differ diff --git a/0.22/_images/nd_spl_3.png b/0.22/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/0.22/_images/nd_spl_3.png differ diff --git a/0.22/_images/nd_spl_3_comb1.png b/0.22/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/0.22/_images/nd_spl_3_comb1.png differ diff --git a/0.22/_images/nd_spl_3_comb3.png b/0.22/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/0.22/_images/nd_spl_3_comb3.png differ diff --git a/0.22/_images/nd_spl_4.png b/0.22/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/0.22/_images/nd_spl_4.png differ diff --git a/0.22/_sources/api.rst.txt b/0.22/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/0.22/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/0.22/_sources/api/pydra.engine.audit.rst.txt b/0.22/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.boutiques.rst.txt b/0.22/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/0.22/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.core.rst.txt b/0.22/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.graph.rst.txt b/0.22/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.helpers.rst.txt b/0.22/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.helpers_file.rst.txt b/0.22/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.helpers_state.rst.txt b/0.22/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.rst.txt b/0.22/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..7cafa8d6ad --- /dev/null +++ b/0.22/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,26 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/0.22/_sources/api/pydra.engine.specs.rst.txt b/0.22/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.state.rst.txt b/0.22/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/0.22/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.submitter.rst.txt b/0.22/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/0.22/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.task.rst.txt b/0.22/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/0.22/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.engine.workers.rst.txt b/0.22/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/0.22/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.mark.functions.rst.txt b/0.22/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/0.22/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.mark.rst.txt b/0.22/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/0.22/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/0.22/_sources/api/pydra.tasks.rst.txt b/0.22/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/0.22/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.utils.messenger.rst.txt b/0.22/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/0.22/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.utils.profiler.rst.txt b/0.22/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/0.22/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/0.22/_sources/api/pydra.utils.rst.txt b/0.22/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..946fe9055d --- /dev/null +++ b/0.22/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,16 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.messenger + pydra.utils.profiler diff --git a/0.22/_sources/changes.rst.txt b/0.22/_sources/changes.rst.txt new file mode 100644 index 0000000000..0fb4187e33 --- /dev/null +++ b/0.22/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messanger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/0.22/_sources/combiner.rst.txt b/0.22/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/0.22/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/0.22/_sources/components.rst.txt b/0.22/_sources/components.rst.txt new file mode 100644 index 0000000000..7872fec87c --- /dev/null +++ b/0.22/_sources/components.rst.txt @@ -0,0 +1,187 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2(x=[1, 5]).split("x").combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. +The results are grouped back when returning the result from the *Task*. +While this example +illustrates mapping and grouping of results over a single parameter, *Pydra* +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/0.22/_sources/index.rst.txt b/0.22/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/0.22/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/0.22/_sources/input_spec.rst.txt b/0.22/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/0.22/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/0.22/_sources/output_spec.rst.txt b/0.22/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/0.22/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/0.22/_sources/state.rst.txt b/0.22/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/0.22/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/0.22/_sources/user_guide.rst.txt b/0.22/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/0.22/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/0.22/_static/_sphinx_javascript_frameworks_compat.js b/0.22/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/0.22/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/0.22/_static/banner.css b/0.22/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/0.22/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/0.22/_static/basic.css b/0.22/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/0.22/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/0.22/_static/css/badge_only.css b/0.22/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/0.22/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/0.22/_static/css/fonts/Roboto-Slab-Bold.woff b/0.22/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/0.22/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/0.22/_static/css/fonts/Roboto-Slab-Bold.woff2 b/0.22/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/0.22/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/0.22/_static/css/fonts/Roboto-Slab-Regular.woff b/0.22/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/0.22/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/0.22/_static/css/fonts/Roboto-Slab-Regular.woff2 b/0.22/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/0.22/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/0.22/_static/css/fonts/fontawesome-webfont.eot b/0.22/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/0.22/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/0.22/_static/css/fonts/fontawesome-webfont.svg b/0.22/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/0.22/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0.22/_static/css/fonts/fontawesome-webfont.ttf b/0.22/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/0.22/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/0.22/_static/css/fonts/fontawesome-webfont.woff b/0.22/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/0.22/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/0.22/_static/css/fonts/fontawesome-webfont.woff2 b/0.22/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/0.22/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/0.22/_static/css/fonts/lato-bold-italic.woff b/0.22/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/0.22/_static/css/fonts/lato-bold-italic.woff differ diff --git a/0.22/_static/css/fonts/lato-bold-italic.woff2 b/0.22/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/0.22/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/0.22/_static/css/fonts/lato-bold.woff b/0.22/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/0.22/_static/css/fonts/lato-bold.woff differ diff --git a/0.22/_static/css/fonts/lato-bold.woff2 b/0.22/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/0.22/_static/css/fonts/lato-bold.woff2 differ diff --git a/0.22/_static/css/fonts/lato-normal-italic.woff b/0.22/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/0.22/_static/css/fonts/lato-normal-italic.woff differ diff --git a/0.22/_static/css/fonts/lato-normal-italic.woff2 b/0.22/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/0.22/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/0.22/_static/css/fonts/lato-normal.woff b/0.22/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/0.22/_static/css/fonts/lato-normal.woff differ diff --git a/0.22/_static/css/fonts/lato-normal.woff2 b/0.22/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/0.22/_static/css/fonts/lato-normal.woff2 differ diff --git a/0.22/_static/css/theme.css b/0.22/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/0.22/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/0.22/_static/doctools.js b/0.22/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/0.22/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/0.22/_static/documentation_options.js b/0.22/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/0.22/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/0.22/_static/file.png b/0.22/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/0.22/_static/file.png differ diff --git a/0.22/_static/jquery.js b/0.22/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/0.22/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.22/_static/js/html5shiv.min.js b/0.22/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/0.22/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.22/_static/js/theme.js b/0.22/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/0.22/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/0.22/_static/minus.png b/0.22/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/0.22/_static/minus.png differ diff --git a/0.22/_static/plus.png b/0.22/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/0.22/_static/plus.png differ diff --git a/0.22/_static/pygments.css b/0.22/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/0.22/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/0.22/_static/searchtools.js b/0.22/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/0.22/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/0.22/_static/sphinx_highlight.js b/0.22/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/0.22/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/0.22/api.html b/0.22/api.html new file mode 100644 index 0000000000..1bf3717907 --- /dev/null +++ b/0.22/api.html @@ -0,0 +1,677 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+pydra.check_latest_version()
+
+ +
+
+pydra.set_input_validator(flag=False)
+
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.audit.html b/0.22/api/pydra.engine.audit.html new file mode 100644 index 0000000000..05edc4eab0 --- /dev/null +++ b/0.22/api/pydra.engine.audit.html @@ -0,0 +1,243 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.boutiques.html b/0.22/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..7b5e19d484 --- /dev/null +++ b/0.22/api/pydra.engine.boutiques.html @@ -0,0 +1,181 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.core.html b/0.22/api/pydra.engine.core.html new file mode 100644 index 0000000000..9da5f72b83 --- /dev/null +++ b/0.22/api/pydra.engine.core.html @@ -0,0 +1,458 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elemntary tasks and +Workflow instances inherit.

+
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner, overwrite=False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner – TODO

  • +
  • overwrite (bool) – TODO

  • +
+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Return type:
+

result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter, overwrite=False, cont_dim=None, **kwargs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • overwrite (bool) – TODO

  • +
  • cont_dim (dict) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.graph.html b/0.22/api/pydra.engine.graph.html new file mode 100644 index 0000000000..cec5e7de5f --- /dev/null +++ b/0.22/api/pydra.engine.graph.html @@ -0,0 +1,350 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other format, equires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.helpers.html b/0.22/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..2fbe7ce17a --- /dev/null +++ b/0.22/api/pydra.engine.helpers.html @@ -0,0 +1,459 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.custom_validator(instance, attribute, value)
+

simple custom validation +take into account ty.Union, ty.List, ty.Dict (but only one level depth) +adding an additional validator, if allowe_values provided

+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.hash_function(obj)
+

Generate hash of object.

+
+ +
+
+pydra.engine.helpers.hash_value(value, tp=None, metadata=None, precalculated=None)
+

calculating hash or returning values recursively

+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+
+pydra.engine.helpers.task_hash(task)
+

Calculate the checksum of a task.

+

input hash, output hash, environment hash

+
+
Parameters:
+

task (TaskBase) – The input task.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.helpers_file.html b/0.22/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..87d0313a9f --- /dev/null +++ b/0.22/api/pydra.engine.helpers_file.html @@ -0,0 +1,444 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+pydra.engine.helpers_file.copyfile(originalfile, newfile, copy=False, create_new=False, use_hardlink=True, copy_related_files=True)
+

Copy or link files.

+

If use_hardlink is True, and the file can be hard-linked, then a +link is created, instead of copying the file.

+

If a hard link is not created and copy is False, then a symbolic +link is created.

+
+

Copy options for existing files

+
    +
  • symlink

    +
    +
      +
    • to regular file originalfile (keep if symlinking)

    • +
    • to same dest as symlink originalfile (keep if symlinking)

    • +
    • to other file (unlink)

    • +
    +
    +
  • +
  • regular file

    +
    +
      +
    • hard link to originalfile (keep)

    • +
    • copy of file (same hash) (keep)

    • +
    • different file (diff hash) (unlink)

    • +
    +
    +
  • +
+
+
+

Copy options for new files

+
    +
  • use_hardlink & can_hardlink => hardlink

  • +
  • ~hardlink & ~copy & can_symlink => symlink

  • +
  • ~hardlink & ~symlink => copy

  • +
+
+
+
Parameters:
+
    +
  • originalfile (str) – full path to original file

  • +
  • newfile (str) – full path to new file

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for POSIX systems

  • +
  • use_hardlink (Bool) – specifies whether to hard-link files, when able +(Default=False), taking precedence over copy

  • +
  • copy_related_files (Bool) – specifies whether to also operate on related files, as defined in +related_filetype_sets

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.copyfile_input(inputs, output_dir)
+

Implement the base class method.

+
+ +
+
+pydra.engine.helpers_file.copyfiles(filelist, dest, copy=False, create_new=False)
+

Copy or symlink files in filelist to dest directory.

+
+
Parameters:
+
    +
  • filelist (list) – List of files to copy.

  • +
  • dest (path/files) – full path to destination. If it is a list of length greater +than 1, then it assumes that these are the names of the new +files.

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for posix systems

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.fname_presuffix(fname, prefix='', suffix='', newpath=None, use_ext=True)
+

Manipulate path and name of input filename.

+
+
Parameters:
+
    +
  • fname (str) – A filename (may or may not include path)

  • +
  • prefix (str) – Characters to prepend to the filename

  • +
  • suffix (str) – Characters to append to the filename

  • +
  • newpath (str) – Path to replace the path of the input fname

  • +
  • use_ext (bool) – If True (default), appends the extension of the original file +to the output name.

  • +
+
+
Returns:
+

path – Absolute path of the modified filename

+
+
Return type:
+

str

+
+
+

Examples

+
>>> import pytest, sys
+>>> if sys.platform.startswith('win'): pytest.skip()
+>>> from pydra.engine.helpers_file import fname_presuffix
+>>> fname = 'foo.nii.gz'
+>>> fname_presuffix(fname,'pre','post','/tmp')
+'/tmp/prefoopost.nii.gz'
+
+
+
+ +
+ +

Return a list of related files.

+

As defined in related_filetype_sets, for a filename +(e.g., Nifti-Pair, Analyze (SPM), and AFNI files).

+
+
Parameters:
+
    +
  • filename (str) – File name to find related filetypes of.

  • +
  • include_this_file (bool) – If true, output includes the input filename.

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.hash_dir(dirpath, crypto=<built-in function openssl_sha256>, ignore_hidden_files=False, ignore_hidden_dirs=False, raise_notfound=True, precalculated=None)
+

Compute hash of directory contents.

+

This function computes the hash of every file in directory dirpath and then +computes the hash of that list of hashes to return a single hash value. The +directory is traversed recursively.

+
+
Parameters:
+
    +
  • dirpath (str) – Path to directory.

  • +
  • crypto (:obj: function) – cryptographic hash functions

  • +
  • ignore_hidden_files (bool) – If True, ignore filenames that begin with ..

  • +
  • ignore_hidden_dirs (bool) – If True, ignore files in directories that begin with ..

  • +
  • raise_notfound (bool) – If True and dirpath does not exist, raise FileNotFound exception. If +False and dirpath does not exist, return None.

  • +
+
+
Returns:
+

hash – Hash of the directory contents.

+
+
Return type:
+

str

+
+
+
+ +
+
+pydra.engine.helpers_file.hash_file(afile, chunk_len=8192, crypto=<built-in function openssl_sha256>, raise_notfound=True, precalculated=None)
+

Compute hash of a file using ‘crypto’ module.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_existing_file(value)
+

checking if an object is an existing file

+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.on_cifs(fname)
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+
+ +
+
+pydra.engine.helpers_file.related_filetype_sets = [('.hdr', '.img', '.mat'), ('.nii', '.mat'), ('.BRIK', '.HEAD')]
+

List of neuroimaging file types that are to be interpreted together.

+
+ +
+
+pydra.engine.helpers_file.split_filename(fname)
+

Split a filename into parts: path, base filename and extension.

+
+
Parameters:
+

fname (str) – file or path name

+
+
Returns:
+

    +
  • pth (str) – base path from fname

  • +
  • fname (str) – filename from fname, without extension

  • +
  • ext (str) – file extension from fname

  • +
+

+
+
+

Examples

+
>>> pth, fname, ext = split_filename('/home/data/subject.nii.gz')
+>>> pth
+'/home/data'
+
+
+
>>> fname
+'subject'
+
+
+
>>> ext
+'.nii.gz'
+
+
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.helpers_state.html b/0.22/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..44d06e339f --- /dev/null +++ b/0.22/api/pydra.engine.helpers_state.html @@ -0,0 +1,300 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter, name)
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.html b/0.22/api/pydra.engine.html new file mode 100644 index 0000000000..adf9272014 --- /dev/null +++ b/0.22/api/pydra.engine.html @@ -0,0 +1,414 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.specs.html b/0.22/api/pydra.engine.specs.html new file mode 100644 index 0000000000..27722b4146 --- /dev/null +++ b/0.22/api/pydra.engine.specs.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+

Compute a basic hash for any given set of fields.

+
+ +
+
+retrieve_values(wf, state_index=None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.ContainerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container: File | str | None, container_xargs: List[str] | None = None)
+

Bases: ShellSpec

+

Refine the generic command-line specification to container execution.

+
+
+container: File | str | None
+

The container.

+
+ +
+
+container_xargs: List[str] | None
+
+ +
+
+image: File | str
+

The image to be containerized.

+
+ +
+ +
+
+class pydra.engine.specs.Directory
+

Bases: object

+

An os.pathlike object, designating a folder.

+
+ +
+
+class pydra.engine.specs.DockerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'docker')
+

Bases: ContainerSpec

+

Particularize container specifications to the Docker engine.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.File
+

Bases: object

+

An os.pathlike object, designating a file.

+
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(node, attr_type)
+

Bases: object

+

Lazy fields implement promises.

+
+
+get_value(wf, state_index=None)
+

Return the value of a lazy field.

+
+ +
+ +
+
+class pydra.engine.specs.MultiInputFile
+

Bases: MultiInputObj

+

A ty.List[File] object, converter changes a single file path to a list

+
+ +
+
+class pydra.engine.specs.MultiInputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes a single values to a list

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.MultiOutputFile
+

Bases: MultiOutputObj

+

A ty.List[File] object, converter changes an 1-el list to the single value

+
+ +
+
+class pydra.engine.specs.MultiOutputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes an 1-el list to the single value

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: File | str, stderr: File | str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Collect additional outputs from shelltask output_spec.

+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: File | str
+

The process’ standard input.

+
+ +
+
+stdout: File | str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SingularitySpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'singularity')
+

Bases: ContainerSpec

+

Particularize container specifications to Singularity.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Tuple[Type] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Tuple[Type]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.attr_fields_dict(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.state.html b/0.22/api/pydra.engine.state.html new file mode 100644 index 0000000000..1dc57af2b6 --- /dev/null +++ b/0.22/api/pydra.engine.state.html @@ -0,0 +1,597 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.submitter.html b/0.22/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..8eafad3f6b --- /dev/null +++ b/0.22/api/pydra.engine.submitter.html @@ -0,0 +1,263 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.task.html b/0.22/api/pydra.engine.task.html new file mode 100644 index 0000000000..1f0f13b6e0 --- /dev/null +++ b/0.22/api/pydra.engine.task.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.ContainerTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Extend shell command task for containerized execution.

+
+
+bind_paths()
+

Get bound mount points

+
+
Returns:
+

mount points – mapping from local path to tuple of container path + mode

+
+
Return type:
+

dict

+
+
+
+ +
+
+binds(opt)
+

Specify mounts to bind from local filesystems to container and working directory.

+

Uses py:meth:bind_paths

+
+ +
+
+container_check(container_type)
+

Get container-specific CLI arguments.

+
+ +
+ +
+
+class pydra.engine.task.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.task.SingularityTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with Singularity.

+
+
+property container_args
+

Get container-specific CLI arguments.

+
+ +
+
+init = False
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.engine.workers.html b/0.22/api/pydra.engine.workers.html new file mode 100644 index 0000000000..46725fef84 --- /dev/null +++ b/0.22/api/pydra.engine.workers.html @@ -0,0 +1,381 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.mark.functions.html b/0.22/api/pydra.mark.functions.html new file mode 100644 index 0000000000..d71d9ac651 --- /dev/null +++ b/0.22/api/pydra.mark.functions.html @@ -0,0 +1,196 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.mark.html b/0.22/api/pydra.mark.html new file mode 100644 index 0000000000..57d8d07c31 --- /dev/null +++ b/0.22/api/pydra.mark.html @@ -0,0 +1,176 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.tasks.html b/0.22/api/pydra.tasks.html new file mode 100644 index 0000000000..cd5db65b08 --- /dev/null +++ b/0.22/api/pydra.tasks.html @@ -0,0 +1,169 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.utils.html b/0.22/api/pydra.utils.html new file mode 100644 index 0000000000..611614885d --- /dev/null +++ b/0.22/api/pydra.utils.html @@ -0,0 +1,177 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.utils.messenger.html b/0.22/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..5020157a34 --- /dev/null +++ b/0.22/api/pydra.utils.messenger.html @@ -0,0 +1,373 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/api/pydra.utils.profiler.html b/0.22/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..7480aff484 --- /dev/null +++ b/0.22/api/pydra.utils.profiler.html @@ -0,0 +1,243 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequence to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/changes.html b/0.22/changes.html new file mode 100644 index 0000000000..d3d2d78016 --- /dev/null +++ b/0.22/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messanger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/combiner.html b/0.22/combiner.html new file mode 100644 index 0000000000..7d278794a4 --- /dev/null +++ b/0.22/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/components.html b/0.22/components.html new file mode 100644 index 0000000000..9c901f2e8f --- /dev/null +++ b/0.22/components.html @@ -0,0 +1,337 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2(x=[1, 5]).split("x").combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. +The results are grouped back when returning the result from the Task. +While this example +illustrates mapping and grouping of results over a single parameter, Pydra +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/genindex.html b/0.22/genindex.html new file mode 100644 index 0000000000..88ec3bed3d --- /dev/null +++ b/0.22/genindex.html @@ -0,0 +1,1283 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/index.html b/0.22/index.html new file mode 100644 index 0000000000..d836bea914 --- /dev/null +++ b/0.22/index.html @@ -0,0 +1,244 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/input_spec.html b/0.22/input_spec.html new file mode 100644 index 0000000000..bcf303be76 --- /dev/null +++ b/0.22/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/objects.inv b/0.22/objects.inv new file mode 100644 index 0000000000..92761904eb Binary files /dev/null and b/0.22/objects.inv differ diff --git a/0.22/output_spec.html b/0.22/output_spec.html new file mode 100644 index 0000000000..532c19fe5c --- /dev/null +++ b/0.22/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/py-modindex.html b/0.22/py-modindex.html new file mode 100644 index 0000000000..0942fa311a --- /dev/null +++ b/0.22/py-modindex.html @@ -0,0 +1,250 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.messenger +
    + pydra.utils.profiler +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/search.html b/0.22/search.html new file mode 100644 index 0000000000..3105c4d6d6 --- /dev/null +++ b/0.22/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/0.22/searchindex.js b/0.22/searchindex.js new file mode 100644 index 0000000000..db10eeda5b --- /dev/null +++ b/0.22/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.messenger", "api/pydra.utils.profiler", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.profiler.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.messenger module", "pydra.utils.profiler module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 6, 7, 8, 9, 11, 16, 18, 22, 23, 24, 25, 26], "pydra": [0, 20, 21, 22, 24, 26], "workflow": [0, 1, 4, 5, 6, 9, 11, 15, 20, 21, 23, 26, 27], "engin": [0, 19, 20, 26], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rewrit": 0, "nipyp": [0, 7, 19, 20, 23], "map": [0, 5, 10, 12, 22, 23, 26], "join": 0, "first": [0, 21], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 24, 25], "oper": [0, 7, 10, 26], "It": [0, 4, 10, 21, 22, 23], "form": [0, 6, 8, 10, 22, 25], "core": [0, 1, 11, 19, 20], "2": [0, 1, 6, 11, 15, 18, 22, 23, 24, 26], "0": [0, 1, 4, 6, 8, 11, 15, 18, 23], "ecosystem": [0, 23], "check_latest_vers": [0, 23], "set_input_valid": [0, 23, 24], "flag": [0, 1, 2, 4, 18, 20, 22, 24, 25], "fals": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 19, 24, 25], "packag": [0, 20, 22, 23], "auditflag": [0, 1, 4, 12, 18], "all": [0, 1, 4, 5, 7, 8, 9, 10, 11, 18, 20, 21, 22, 24, 26], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20], "prov": [0, 1, 18], "resourc": [0, 1, 2, 18, 19, 23], "dockertask": [0, 1, 12, 20, 22], "container_arg": [0, 1, 12, 20], "init": [0, 1, 12], "shellcommandtask": [0, 1, 3, 12, 20, 22, 24, 25], "cmdline": [0, 1, 12, 20], "command_arg": [0, 1, 12, 20], "input_spec": [0, 1, 4, 6, 7, 9, 12, 20, 22, 24, 25], "output_spec": [0, 1, 4, 6, 7, 9, 12, 24, 25], "submitt": [0, 1, 6, 20], "close": [0, 1, 6, 11, 13], "expand_runn": [0, 1, 11], "expand_workflow": [0, 1, 11], "submit_from_cal": [0, 1, 11], "add": [0, 1, 4, 5, 20, 22], "checksum": [0, 1, 4, 6, 20], "create_connect": [0, 1, 4], "create_dotfil": [0, 1, 4, 20], "graph_sort": [0, 1, 4], "node": [0, 1, 4, 5, 8, 9, 10, 12, 19, 20, 22, 23, 26], "set_output": [0, 1, 4, 22], "submodul": 0, "audit": [0, 1, 4, 12, 18, 20, 23], "modul": [0, 1, 14, 17, 23], "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "monitor": [0, 1, 2, 12, 18, 19], "start_audit": [0, 2], "boutiqu": [0, 1, 20], "boshtask": [0, 3, 20], "taskbas": [0, 1, 4, 6, 11, 12, 22], "audit_flag": [0, 1, 2, 4, 12], "cache_dir": [0, 1, 4, 12], "cache_loc": [0, 1, 4, 6, 12, 20], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 6, 8, 10, 20, 21, 22, 23, 24, 26], "cont_dim": [0, 1, 4, 8, 10, 12, 20], "done": [0, 4, 26], "error": [0, 1, 4, 6, 7, 8, 9, 11, 19, 20, 23, 24, 25], "generated_output_nam": [0, 4, 9], "get_input_el": [0, 4], "help": [0, 4, 22, 23], "output_dir": [0, 1, 4, 7, 9, 25], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 6, 7, 9, 10, 20, 21, 22, 23], "set_stat": [0, 4], "split": [0, 4, 7, 8, 10, 12, 21, 22, 26], "uid": [0, 4], "version": [0, 4, 24], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "graph": [0, 1, 4, 11, 18, 20, 22, 23, 26], "digraph": [0, 5], "add_edg": [0, 5], "add_edges_descript": [0, 1, 4, 5], "add_nod": [0, 5], "calculate_max_path": [0, 5], "copi": [0, 5, 6, 9, 12, 20, 24, 26], "create_dotfile_detail": [0, 5], "create_dotfile_nest": [0, 5], "create_dotfile_simpl": [0, 5], "edg": [0, 5], "edges_nam": [0, 5], "export_graph": [0, 5], "nodes_detail": [0, 5], "nodes_names_map": [0, 5], "remove_nod": [0, 5], "remove_nodes_connect": [0, 5], "remove_previous_connect": [0, 5], "remove_successors_nod": [0, 5], "sorted_nod": [0, 5], "sorted_nodes_nam": [0, 5], "sort": [0, 1, 4, 5, 6], "helper": [0, 1], "pydrafilelock": [0, 6], "argstr_format": [0, 6], "copyfile_workflow": [0, 6], "create_checksum": [0, 6], "custom_valid": [0, 6], "ensure_list": [0, 6, 7], "execut": [0, 1, 6, 9, 11, 12, 13, 19, 22, 23, 24, 25, 26], "gather_runtime_info": [0, 6], "get_available_cpu": [0, 6, 20], "get_open_loop": [0, 6], "hash_funct": [0, 6], "hash_valu": [0, 6], "load_and_run": [0, 6, 20], "load_and_run_async": [0, 6], "load_result": [0, 6], "load_task": [0, 6], "make_klass": [0, 6], "output_from_inputfield": [0, 6], "position_sort": [0, 6], "print_help": [0, 6], "read_and_displai": [0, 6], "read_and_display_async": [0, 6], "read_stream_and_displai": [0, 6], "record_error": [0, 6], "save": [0, 6], "task_hash": [0, 6], "helpers_fil": [0, 1], "copyfil": [0, 7, 24], "copyfile_input": [0, 7, 9], "fname_presuffix": [0, 7], "get_related_fil": [0, 7], "hash_dir": [0, 7, 20], "hash_fil": [0, 7], "is_contain": [0, 7], "is_existing_fil": [0, 7], "is_local_fil": [0, 7], "on_cif": [0, 7], "related_filetype_set": [0, 7], "split_filenam": [0, 7], "template_upd": [0, 7, 9], "template_update_singl": [0, 7], "helpers_st": [0, 1], "pydrastateerror": [0, 8, 20], "add_name_combin": [0, 8], "add_name_splitt": [0, 8], "combine_final_group": [0, 8], "converter_groups_to_input": [0, 8], "flatten": [0, 8], "input_shap": [0, 8], "inputs_types_to_dict": [0, 8], "iter_split": [0, 8], "map_split": [0, 8], "remove_inp_from_splitter_rpn": [0, 8], "rpn2splitter": [0, 8], "splits_group": [0, 8], "splitter2rpn": [0, 8], "spec": [0, 1, 4, 6, 7, 12, 20, 25, 27], "basespec": [0, 1, 4, 9, 12], "check_fields_input_spec": [0, 9], "check_metadata": [0, 9], "collect_additional_output": [0, 9], "hash": [0, 6, 7, 9, 12, 20, 22, 23], "retrieve_valu": [0, 9], "containerspec": [0, 9], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 23, 24, 25, 27], "container_xarg": [0, 9], "imag": [0, 9, 22], "directori": [0, 1, 2, 4, 6, 7, 9, 12, 20, 22, 24], "dockerspec": [0, 9], "file": [0, 4, 6, 9, 12, 18, 19, 20, 22, 23, 24, 25], "functionspec": [0, 9], "lazyfield": [0, 9], "get_valu": [0, 9], "multiinputfil": [0, 9], "multiinputobj": [0, 9, 24], "convert": [0, 8, 9, 20, 22, 24], "multioutputfil": [0, 9], "multioutputobj": [0, 9, 24], "get_output_field": [0, 9], "output": [0, 1, 2, 4, 5, 6, 7, 9, 10, 18, 20, 22, 23, 24, 26, 27], "runtim": [0, 6, 9], "cpu_peak_perc": [0, 9], "rss_peak_gb": [0, 9], "vms_peak_gb": [0, 9], "runtimespec": [0, 9], "network": [0, 9], "outdir": [0, 5, 9], "shelloutspec": [0, 9, 25], "return_cod": [0, 9], "stderr": [0, 9, 25], "stdout": [0, 9, 25], "shellspec": [0, 9, 22, 24], "arg": [0, 1, 3, 6, 9, 12, 22], "singularityspec": [0, 9], "specinfo": [0, 1, 4, 9, 12, 22, 24, 25], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 24, 25, 26], "field": [0, 1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 25, 26, 27], "name": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 22, 24, 25], "taskhook": [0, 9], "post_run": [0, 9], "post_run_task": [0, 9], "pre_run": [0, 9], "pre_run_task": [0, 9], "reset": [0, 9], "attr_field": [0, 9], "attr_fields_dict": [0, 9], "donoth": [0, 9], "path_to_str": [0, 9], "state": [0, 1, 4, 8, 11, 12, 18, 20, 23, 27], "splitter": [0, 4, 8, 10, 20, 21, 22, 27], "splitter_rpn_compact": [0, 10], "splitter_rpn": [0, 8, 10], "splitter_fin": [0, 10], "other_st": [0, 8, 10], "inner_input": [0, 8, 10], "states_ind": [0, 10], "states_v": [0, 10], "inputs_ind": [0, 10], "group_for_input": [0, 8, 10], "group_for_inputs_fin": [0, 10], "groups_stack_fin": [0, 10], "final_combined_ind_map": [0, 10], "combiner_valid": [0, 10], "current_combin": [0, 10], "current_combiner_al": [0, 10], "current_splitt": [0, 10], "current_splitter_rpn": [0, 10], "prepare_input": [0, 10], "prepare_st": [0, 10], "prepare_states_combined_ind": [0, 10], "prepare_states_ind": [0, 10], "prepare_states_v": [0, 10], "prev_state_combin": [0, 10], "prev_state_combiner_al": [0, 10], "prev_state_splitt": [0, 10], "prev_state_splitter_rpn": [0, 10], "prev_state_splitter_rpn_compact": [0, 10], "set_input_group": [0, 10], "splitter_rpn_fin": [0, 10], "splitter_valid": [0, 10], "update_connect": [0, 10], "get_runnable_task": [0, 11], "is_runn": [0, 11], "prepare_runnable_with_st": [0, 11], "task": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 13, 15, 20, 23, 24, 25, 26, 27], "containertask": [0, 1, 12, 22, 24], "bind_path": [0, 12], "bind": [0, 12, 20], "container_check": [0, 12], "functiontask": [0, 12, 15, 20, 22], "singularitytask": [0, 12, 20, 22], "split_cmd": [0, 12], "worker": [0, 1, 11, 20], "concurrentfutureswork": [0, 13], "exec_as_coro": [0, 13], "run_el": [0, 13], "daskwork": [0, 13], "exec_dask": [0, 13], "distributedwork": [0, 13], "fetch_finish": [0, 13], "max_job": [0, 13], "sgework": [0, 13], "check_for_results_fil": [0, 13], "get_output_by_task_pkl": [0, 13], "get_tasks_to_run": [0, 13], "submit_array_job": [0, 13], "serialwork": [0, 13], "exec_seri": [0, 13], "slurmwork": [0, 13], "mark": [0, 5, 22], "function": [0, 7, 8, 9, 14, 19, 20, 23, 24, 25, 27], "annot": [0, 15, 22], "util": [0, 1, 2], "messeng": [0, 1, 2, 4, 12, 17], "filemesseng": [0, 18], "send": [0, 1, 2, 11, 18], "printmesseng": [0, 18], "remoterestmesseng": [0, 18], "runtimehook": [0, 18], "resource_monitor_post_stop": [0, 18], "resource_monitor_pre_start": [0, 18], "task_execute_post_exit": [0, 18], "task_execute_pre_entri": [0, 18], "task_run_entri": [0, 18], "task_run_exit": [0, 18], "collect_messag": [0, 18], "gen_uuid": [0, 18], "make_messag": [0, 18], "now": [0, 18, 20, 22], "send_messag": [0, 18], "profil": [0, 17], "resourcemonitor": [0, 19], "fname": [0, 6, 7, 19], "run": [0, 1, 4, 5, 6, 7, 9, 10, 11, 13, 19, 20, 22, 23], "stop": [0, 19], "get_max_resources_us": [0, 19], "get_system_total_memory_gb": [0, 19], "log_nodes_cb": [0, 19], "valu": [1, 4, 6, 7, 8, 9, 10, 18, 19, 20, 21, 22, 23, 24, 25, 26], "qualnam": [1, 18], "type": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 25, 27], "start": [1, 2, 5, 18, 19, 24], "1": [1, 4, 6, 7, 8, 9, 11, 13, 18, 22, 23, 24, 26], "boundari": [1, 18], "3": [1, 6, 11, 18, 23, 26], "track": [1, 2, 9, 10, 12, 18, 19, 22, 23], "proven": [1, 2, 12, 18, 23], "do": [1, 11, 18, 25], "onli": [1, 4, 6, 7, 10, 11, 12, 18, 21, 24, 25, 26], "container_info": [1, 3, 12, 22], "kwarg": [1, 3, 4, 6, 9, 11, 12, 13, 18], "extend": [1, 12, 22, 23, 26], "shell": [1, 3, 9, 12, 23, 24, 25, 27], "command": [1, 3, 5, 6, 7, 9, 12, 23, 24, 25, 27], "container": [1, 9, 12], "docker": [1, 7, 9, 12, 22, 23], "properti": [1, 4, 5, 9, 10, 12, 19], "get": [1, 4, 5, 6, 8, 9, 10, 12, 18, 19, 20, 22, 26], "specif": [1, 4, 6, 9, 10, 12, 18, 19, 20, 21, 22, 23, 26, 27], "cli": [1, 12], "argument": [1, 12, 22, 24], "return": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 24, 25], "list": [1, 4, 5, 6, 7, 8, 9, 10, 12, 20, 21, 22, 24, 25, 26], "ha": [1, 4, 5, 7, 10, 11, 12, 21, 22, 23, 24, 25, 26], "wrap": [1, 12], "element": [1, 4, 10, 12, 20, 21, 22, 24, 25, 26], "actual": [1, 12], "line": [1, 6, 9, 12, 22, 23], "submit": [1, 12], "plugin": [1, 6, 11], "cf": [1, 11], "object": [1, 2, 4, 5, 6, 7, 9, 10, 11, 13, 18, 22, 24, 25], "backend": [1, 11], "previous": [1, 5, 11, 23], "loop": [1, 6, 11, 13, 23, 27], "async": [1, 6, 11, 13], "runnabl": [1, 5, 11, 13, 22, 26], "wait": [1, 11], "rerun": [1, 4, 6, 11, 12, 13, 20], "thi": [1, 4, 5, 6, 7, 8, 9, 11, 13, 19, 21, 22, 23, 24, 25, 26], "coroutin": [1, 6, 11, 13], "handl": [1, 2, 11, 20, 23], "expans": [1, 11], "remov": [1, 5, 7, 8, 10, 11, 20, 24, 25], "ani": [1, 4, 5, 9, 11, 19, 22, 23, 24, 25], "from": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 20, 21, 22, 23, 24, 25, 26], "If": [1, 2, 4, 6, 7, 11, 24, 25], "set": [1, 4, 6, 7, 9, 10, 11, 13, 19, 20, 21, 22, 23, 26], "default": [1, 7, 9, 11, 24, 25], "aggreg": [1, 11, 24], "them": [1, 5, 6, 11, 20], "true": [1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 18, 22, 24, 25], "complet": [1, 11, 22], "paramet": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 26], "instanc": [1, 4, 6, 11, 22], "bool": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 18, 22, 24, 25], "await": [1, 11, 13], "futur": [1, 11, 13, 20], "befor": [1, 4, 10, 11, 24], "wf": [1, 6, 9, 11, 20, 22], "expand": [1, 11, 20], "stateless": [1, 11, 26], "method": [1, 4, 5, 7, 11, 20, 21, 22, 26], "reach": [1, 11], "_run_task": [1, 11], "comput": [1, 4, 7, 9, 11, 23], "should": [1, 7, 8, 9, 10, 11, 22, 24, 25], "call": [1, 11, 19, 21, 22, 23, 24, 26], "onc": [1, 11], "per": [1, 11], "serv": [1, 11, 22], "bridg": [1, 11], "between": [1, 5, 10, 11, 22, 23, 24], "sync": [1, 11], "land": [1, 11], "There": [1, 11, 22, 24], "ar": [1, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 21, 22, 23, 24, 25, 26], "4": [1, 11, 18, 23], "potenti": [1, 11], "path": [1, 4, 5, 6, 7, 9, 11, 12, 18, 20, 24], "differ": [1, 7, 11, 22, 23, 25, 26], "than": [1, 7, 11, 22, 25], "without": [1, 4, 5, 7, 10, 11, 22], "python": [1, 6, 11, 12, 13, 20, 22, 23, 24, 26], "10": [1, 11], "minimum": [1, 11], "probabl": [1, 11], "refactor": [1, 11, 20], "us": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 20, 21, 22, 23, 24, 25, 26], "structur": [1, 4, 5, 9, 11], "pattern": [1, 11], "match": [1, 11], "str": [1, 4, 6, 7, 9, 10, 12, 18, 22, 24, 25], "messenger_arg": [1, 2, 4, 12], "propagate_rerun": [1, 4, 20], "A": [1, 2, 4, 5, 6, 7, 9, 10, 13, 18, 19, 22, 24, 25, 26], "composit": [1, 4], "ad": [1, 4, 5, 6, 8, 20, 22, 25, 27], "calcul": [1, 4, 5, 6, 10, 20], "uniqu": [1, 4, 6, 18], "creat": [1, 2, 4, 5, 6, 7, 8, 10, 16, 20, 22, 23, 24, 25, 26], "need": [1, 4, 5, 9, 10, 21, 26], "have": [1, 4, 6, 7, 8, 10, 22, 25, 26], "input": [1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 25, 27], "etc": [1, 4, 24], "detail": [1, 4, 5, 22], "connect": [1, 4, 5, 8, 10, 22], "particular": [1, 2, 4, 9], "exist": [1, 4, 22, 23, 24, 25], "self": [1, 2, 4, 5, 10], "descript": [1, 4, 5, 20, 24, 25], "simpl": [1, 4, 5, 6, 20, 22, 24], "export": [1, 4, 5], "dotfil": [1, 4, 5, 20], "option": [1, 2, 4, 10, 18, 22, 24, 26], "other": [1, 4, 5, 7, 8, 20, 22, 23, 24, 25, 26], "format": [1, 4, 5, 6, 18, 20], "represent": [1, 4, 10], "write": [1, 4, 6, 12, 18], "todo": [1, 4, 6, 9, 18], "keep": [2, 7, 9, 10, 19], "inform": [2, 6, 10, 18, 24, 25], "develop": [2, 23], "determin": [2, 10], "whether": [2, 4, 7, 13], "enabl": [2, 20, 23, 24], "obj": [2, 4, 5, 6, 7, 11, 18], "check": [2, 4, 5, 7, 9, 11, 20, 24], "boolean": 2, "AND": 2, "oudit_flag": 2, "messag": [2, 18, 23], "dict": [2, 4, 6, 7, 10, 12, 18, 24], "json": [2, 12, 18, 19, 23], "ld": [2, 18, 23], "sent": [2, 24, 25], "end": [2, 8, 19, 26], "odir": 2, "record": [2, 18, 19], "until": [2, 6, 13], "case": [2, 6], "insid": [2, 24], "o": [2, 6, 7, 9, 18, 20, 24], "pathlik": [2, 6, 9, 18], "descriptor": [3, 20], "basic": [4, 9, 21, 22], "process": [4, 6, 9, 10, 12, 18, 19, 20], "gener": [4, 6, 8, 9, 18, 22, 23], "step": 4, "which": [4, 5, 6, 7, 8, 10], "both": [4, 22], "elemntari": 4, "inherit": [4, 9, 22], "what": 4, "avail": [4, 6, 9, 10, 20], "locat": 4, "cach": [4, 6, 23], "sourc": [4, 23], "accept": [4, 19, 20], "checkpoint": 4, "restart": 4, "state_index": [4, 9], "replac": [4, 7], "recreat": 4, "overwrit": 4, "parameter": 4, "one": [4, 6, 8, 9, 13, 21, 22, 24, 26], "more": [4, 20, 22, 24, 26], "previou": [4, 8, 10, 21, 24], "been": [4, 23], "final": [4, 8, 10, 13, 21], "store": [4, 23], "rais": [4, 7, 20, 25], "an": [4, 6, 7, 9, 13, 20, 21, 22, 23, 24, 25, 26], "doesn": [4, 10, 24], "t": [4, 10, 20, 24], "depend": [4, 8, 10], "provid": [4, 6, 8, 9, 21, 22, 23, 24, 25, 26], "ind": [4, 6], "collect": [4, 6, 9, 16, 18, 23], "requir": [4, 8, 9, 20, 22, 23, 24, 25, 26], "returnhelp": 4, "print": [4, 6, 18], "filesystem": [4, 7, 12], "where": [4, 6, 21, 23, 26], "written": [4, 7, 21, 23], "": [4, 6, 8, 10, 13, 18, 20, 24, 25, 26, 27], "everyth": 4, "see": [4, 5, 25], "pickl": [4, 6, 20], "full": [4, 7, 10, 20, 21, 24], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 6, 9, 15, 18, 19, 24], "index": [4, 6, 23], "multipl": [4, 20, 21, 24, 26], "val": [4, 8], "togeth": [4, 7, 10, 21, 23, 24, 25], "indic": [4, 10, 20], "parametr": 4, "over": [4, 7, 10, 22, 23, 27], "dimens": [4, 8, 10], "assum": [4, 7, 8, 26], "so": [4, 19, 20, 22, 26], "most": [4, 22, 26], "outer": [4, 10, 21, 27], "dim": 4, "id": [4, 19], "number": [4, 6, 8, 10, 13, 20], "slurm": [4, 13, 20], "script": [4, 22], "lazi": [4, 9, 22], "look": [4, 6], "like": [4, 22], "data": [5, 6, 7, 9, 26], "support": [5, 6, 7, 20, 21, 22, 23, 24, 26], "direct": [5, 22, 23], "new_edg": 5, "new": [5, 6, 10, 19, 23, 25, 27], "new_edge_detail": 5, "fill": 5, "_nodes_detail": 5, "new_nod": 5, "insert": [5, 24], "maximum": [5, 13], "histori": 5, "predecessor": 5, "duplic": 5, "dictionari": [5, 8, 10, 18, 19, 24, 25], "same": [5, 7, 10, 21, 25, 26], "graph_det": 5, "nest": [5, 20, 22, 23, 27], "includ": [5, 7, 10, 22, 24, 25], "link": [5, 7, 18, 24], "pair": [5, 7, 8], "thei": [5, 6, 21, 26], "ext": [5, 7], "png": 5, "equir": 5, "dot": [5, 20], "current": [5, 6, 10, 20], "each": [5, 8, 10, 21, 22, 23, 24, 25, 26], "check_readi": 5, "re": [5, 10], "doe": [5, 7, 19, 24, 26], "remove_node_connect": 5, "_node_wip": 5, "when": [5, 7, 8, 9, 10, 18, 20, 21, 22, 26], "refer": 5, "readi": 5, "also": [5, 7, 9, 10, 20, 21, 24, 26], "prune": 5, "follow": [5, 6, 21, 22, 26], "presort": 5, "either": [5, 7], "administr": 6, "framework": [6, 23], "lockfil": 6, "wrapper": [6, 13], "filelock": 6, "softfilelock": 6, "make": [6, 21, 23], "work": [6, 12, 20, 22, 23, 26], "asyncio": [6, 13], "argstr": [6, 22, 24], "value_upd": 6, "field_nam": [6, 9], "updat": [6, 7, 9, 10, 15, 20], "wf_path": 6, "given": [6, 7, 9, 19], "string": [6, 7, 9, 12, 19, 24], "attribut": [6, 20, 22, 26], "custom": [6, 8, 20, 22, 24, 25], "valid": [6, 10, 20, 27], "take": [6, 7, 9, 21, 24, 25], "account": [6, 9], "ty": [6, 9], "union": [6, 24], "level": [6, 21], "depth": [6, 23], "addit": [6, 8, 9, 21, 22, 23, 24, 25, 26], "allowe_valu": 6, "tuple2list": 6, "whatev": 6, "exampl": [6, 7, 15, 21, 22, 24, 25, 26], "abc": 6, "b": [6, 10], "c": [6, 21, 23], "tupl": [6, 7, 9, 10, 12, 20, 24, 25, 26], "5": [6, 18, 19, 22, 23], "cmd": [6, 12], "strip": 6, "event": 6, "unless": [6, 24, 25], "alreadi": [6, 7, 20], "extract": [6, 22], "cpu": [6, 9, 20], "total": [6, 19], "system": [6, 7, 12, 13, 19, 20], "n_proc": [6, 13], "eventloop": 6, "tp": 6, "metadata": [6, 9, 22, 27], "precalcul": [6, 7], "recurs": [6, 7], "task_pkl": [6, 13], "load": [6, 20], "proper": [6, 20], "restor": 6, "identifi": [6, 18], "order": [6, 10, 21, 22, 24, 25, 26], "prioriti": 6, "names_onli": 6, "posit": [6, 22, 24], "convent": 6, "lowest": 6, "highest": 6, "unspecifi": 6, "neg": [6, 24], "d": 6, "e": [6, 7, 9, 10, 18, 21, 22, 24, 25, 26], "f": [6, 7], "visit": 6, "its": [6, 26], "interfac": [6, 10, 13, 20, 23], "hide_displai": 6, "captur": [6, 23], "standard": [6, 8, 9, 18], "displai": 6, "arriv": 6, "stream": 6, "read": [6, 7, 12, 20], "eof": 6, "discuss": 6, "stackoverflow": 6, "error_path": 6, "task_path": 6, "name_prefix": 6, "environ": [6, 12, 22], "port": 7, "after": [7, 10, 21, 22, 26], "part": [7, 10, 12, 23, 24, 25], "were": [7, 20, 23], "relat": [7, 10, 26], "py2": 7, "originalfil": 7, "newfil": 7, "create_new": 7, "use_hardlink": 7, "copy_related_fil": 7, "can": [7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26], "hard": [7, 24], "instead": [7, 20, 25], "symbol": 7, "symlink": 7, "regular": 7, "dest": 7, "unlink": 7, "diff": 7, "can_hardlink": 7, "hardlink": 7, "can_symlink": 7, "origin": [7, 8, 12, 23, 26], "specifi": [7, 8, 10, 12, 20, 21, 22, 24, 25], "posix": 7, "abl": 7, "preced": 7, "defin": [7, 22], "implement": [7, 9, 12, 13, 20, 23], "filelist": 7, "destin": 7, "length": [7, 8, 26], "greater": [7, 23], "filenam": [7, 19], "prefix": 7, "suffix": 7, "newpath": 7, "use_ext": 7, "manipul": [7, 23], "mai": [7, 21, 23], "charact": 7, "prepend": 7, "append": [7, 18], "extens": [7, 20, 24, 25], "absolut": 7, "modifi": 7, "import": [7, 10, 15, 21, 22], "pytest": 7, "sy": 7, "platform": 7, "startswith": 7, "win": 7, "skip": 7, "foo": 7, "nii": 7, "gz": 7, "pre": 7, "post": [7, 18], "tmp": 7, "prefoopost": 7, "include_this_fil": 7, "As": [7, 22, 24, 25], "g": [7, 9, 10, 22, 24, 25], "nifti": 7, "analyz": 7, "spm": [7, 23], "afni": [7, 23], "find": 7, "filetyp": 7, "dirpath": 7, "crypto": 7, "built": 7, "openssl_sha256": 7, "ignore_hidden_fil": 7, "ignore_hidden_dir": 7, "raise_notfound": 7, "content": 7, "everi": [7, 8, 10, 24], "singl": [7, 9, 10, 18, 20, 21, 22], "travers": 7, "cryptograph": 7, "ignor": 7, "begin": 7, "filenotfound": 7, "except": [7, 8, 20], "afil": 7, "chunk_len": 7, "8192": 7, "item": 7, "otherwis": [7, 19, 25], "cif": 7, "mount": [7, 12], "host": 7, "On": 7, "window": [7, 20], "through": [7, 26], "share": [7, 22, 23], "minshal": 7, "french": 7, "text": 7, "driver": 7, "expos": 7, "we": [7, 22, 24], "found": 7, "under": 7, "concurr": [7, 13, 20], "access": 7, "featur": [7, 22, 23, 26], "failur": [7, 20], "recent": 7, "lead": 7, "inconsist": 7, "behavior": 7, "filenotfounderror": 7, "disabl": [7, 24], "hdr": 7, "img": 7, "mat": 7, "brik": 7, "head": 7, "neuroimag": [7, 23], "interpret": 7, "pth": 7, "home": 7, "subject": 7, "state_ind": 7, "map_copyfil": 7, "templat": [7, 9, 16, 20, 22, 24, 25], "present": 7, "inputs_dict_st": 7, "spec_typ": 7, "inputs_dict": 7, "output_file_templ": [7, 22, 24, 25], "mostli": 8, "group": [8, 10, 22, 23, 27], "groups_stack": 8, "kei": [8, 10, 22, 23, 24, 26], "axi": [8, 10], "ax": [8, 10], "cur_depth": 8, "max_depth": 8, "inp": [8, 10], "shape": 8, "iter": 8, "split_it": 8, "prescrib": 8, "inputs_to_remov": 8, "due": [8, 10], "mutat": 8, "revers": [8, 24], "polish": 8, "notat": [8, 10], "recurr": 8, "algorithm": [8, 23], "perform": [8, 19, 26], "convers": [8, 24], "time": [8, 9, 23], "stack": [8, 10], "state_field": [8, 10], "translat": 8, "user": [8, 20, 21, 22, 23, 24, 25, 26], "impos": 8, "unwrap": [8, 10], "dataclass": [9, 20], "medatada": 9, "xor": [9, 24], "fulfil": 9, "mandatori": [9, 22, 24, 25], "point": [9, 12, 18, 22], "refin": 9, "design": [9, 23], "folder": 9, "invok": 9, "attr_typ": 9, "promis": 9, "chang": [9, 20, 24, 25], "classmethod": 9, "el": 9, "regard": 9, "float": [9, 15, 19, 22, 24], "repres": [9, 10, 21, 22, 23, 24, 26], "peak": 9, "consumpt": 9, "physic": 9, "ram": [9, 19], "virtual": 9, "memori": [9, 19, 20], "cwl": 9, "inlinejavascriptrequir": 9, "schemadefrequir": 9, "dockerrequir": 9, "softwarerequir": 9, "initialworkdirrequir": 9, "envvarrequir": 9, "shellcommandrequir": 9, "resourcerequir": 9, "inlinescriptrequir": 9, "shelltask": [9, 20], "exit": 9, "code": [9, 18, 20, 23], "pars": [9, 11], "singular": [9, 12, 20, 22, 23], "_noth": 9, "noth": [9, 20, 24, 25], "least": 9, "callabl": [9, 12, 25], "hook": [9, 18], "exclude_nam": 9, "reduc": [10, 22, 23, 26], "about": [10, 24, 25], "scalar": [10, 27], "rpn": 10, "compact": [10, 18], "_na": 10, "relev": 10, "could": [10, 24], "partial": [10, 23], "associ": [10, 23], "correct": 10, "propag": 10, "explicitli": 10, "had": 10, "prepar": 10, "merg": [10, 26], "inner": [10, 20, 21], "elements_to_remove_comb": 10, "hlpst": 10, "evalu": [10, 26], "prev": 10, "come": 10, "art": 10, "_nb": 10, "especi": 10, "address": [10, 23], "variabl": [10, 12, 20], "new_other_st": 10, "new_combin": 10, "within": [11, 21, 22], "neurodock": 12, "conda": 12, "env": 12, "niceman": 12, "config": 12, "intern": [12, 13, 19], "extern": [12, 23], "callback": [12, 19], "resum": 12, "dmtcp": 12, "local": [12, 24], "fragment": 12, "remot": [12, 18], "server": 12, "isol": 12, "bound": 12, "mode": [12, 20], "opt": 12, "py": [12, 13], "meth": 12, "container_typ": 12, "func": [12, 15], "separ": [12, 16, 20, 22, 24, 25], "respect": [12, 22], "quot": 12, "thereof": 12, "parallel": 13, "pool": 13, "dask": [13, 20], "distribut": [13, 20, 23], "experiment": [13, 20], "limit": [13, 20, 22], "test": [13, 20], "finish": 13, "submiss": 13, "attr": [13, 20, 24, 25], "pend": 13, "job": 13, "poll_delai": 13, "qsub_arg": 13, "write_output_fil": 13, "max_job_array_length": 13, "50": 13, "indirect_submit_host": 13, "max_thread": 13, "poll_for_result_fil": 13, "default_threads_per_task": 13, "polls_before_checking_evict": 13, "60": 13, "collect_jobs_delai": 13, "30": 13, "default_qsub_arg": 13, "max_mem_fre": 13, "jobid": 13, "threads_request": 13, "task_qsub_arg": 13, "mem_fre": 13, "api": [13, 20, 23], "sarg": 13, "tasks_to_run": 13, "error_fil": 13, "linearli": 13, "sbatch_arg": 13, "decor": [15, 22, 23], "appli": [15, 21], "def": [15, 22], "squar": [15, 26], "promot": 15, "namespac": [16, 20], "reserv": 16, "manag": [16, 20, 26], "To": 16, "pleas": 16, "fork": 16, "redirect": 18, "truncat": 18, "open": [18, 23], "abstract": 18, "rest": 18, "endpoint": 18, "statu": [18, 19], "request": 18, "intenum": 18, "allow": [18, 20, 21, 22, 23, 24], "6": [18, 23], "collected_path": 18, "message_path": 18, "ld_op": 18, "compil": 18, "place": 18, "pld": 18, "jsonld": 18, "context": 18, "build": [18, 23, 24, 25], "non": 18, "timestamp": 18, "nidm": 18, "log": [18, 19], "pid": 19, "interv": 19, "logdir": 19, "thread": 19, "certain": 19, "frequenc": 19, "mem_mb": 19, "num_thread": 19, "pyfunc": 19, "integ": [19, 24], "high": 19, "watermark": 19, "far": 19, "dure": 19, "mb": 19, "gb": 19, "statist": [19, 22], "pipelin": [19, 23], "being": [19, 23], "consid": [19, 24], "info": 19, "logger": 19, "fix": 20, "issu": 20, "guid": [20, 23], "docstr": 20, "messang": 20, "syntax": [20, 22, 24, 25, 26], "newer": 20, "padra": 20, "improv": [20, 22], "adapt": 20, "better": 20, "switch": 20, "pkg_resourc": 20, "declare_namespac": 20, "stdlib": 20, "pkgutil": 20, "extend_path": 20, "move": 20, "readm": 20, "rst": 20, "declar": [20, 22], "ensur": [20, 23], "edit": 20, "instal": 20, "conflict": 20, "mention": [20, 24, 25], "txt": 20, "tutori": 20, "repo": 20, "codecov": 20, "_connect": 20, "numpi": [20, 22], "arrai": 20, "to_job": 20, "kept": 20, "standalon": [20, 22, 23], "create_pyscript": 20, "simplifi": 20, "report": 20, "fli": 20, "make_class": 20, "properli": 20, "azur": 20, "ci": 20, "etelementri": 20, "verbos": 20, "reorgan": 20, "small": 20, "some": [20, 23], "osx": 20, "sto": 20, "travi": 20, "right": 20, "pass": [20, 21, 22, 23, 24, 25], "test_rerun": 20, "dimension": [20, 21], "how": [20, 22], "much": 20, "sphinx": 20, "document": 20, "contribut": 20, "md": 20, "empti": [20, 24], "fail": 20, "big": 20, "next": [20, 22, 26], "lzout": [20, 22], "all_": 20, "dataflow": [20, 21, 26, 27], "creation": 20, "notebook": 20, "concept": [20, 21, 22, 23, 26], "initi": 20, "In": [21, 22, 23, 24, 25, 26], "achiev": 21, "note": [21, 23], "sens": 21, "x": [21, 22, 26], "x_1": [21, 26], "x_2": [21, 26], "x_n": [21, 26], "mapsto": [21, 26], "out": [21, 22], "out_": 21, "comb": 21, "x_i": 21, "situat": 21, "variou": 21, "wai": [21, 26], "section": [21, 22, 24, 25, 26], "might": [21, 22, 23], "want": [21, 24, 25], "y": [21, 22, 26], "would": [21, 26], "two": [21, 22, 26], "y1": 21, "y2": 21, "y_m": [21, 26], "longmapsto": [21, 26], "y_1": [21, 26], "howev": [21, 24], "One": [21, 22, 26], "These": [21, 22, 23, 26], "mix": 21, "describ": [22, 24, 26], "thu": 22, "construct": [22, 23], "dual": 22, "sever": [22, 23, 24], "applic": [22, 23, 26], "librari": [22, 23], "interact": [22, 23], "termin": 22, "np": 22, "fft": 22, "ndarrai": 22, "fft_task": 22, "random": 22, "rand": 22, "512": 22, "anoth": [22, 23], "arbitrari": [22, 23, 26], "mean": [22, 25], "std": 22, "mean_dev": 22, "my_data": 22, "st": 22, "stdev": 22, "facilit": [22, 23], "downstream": 22, "pwd": 22, "l": 22, "my_dir": 22, "accommod": 22, "complex": [22, 24, 26], "fsl": [22, 23], "bet": [22, 24], "brain": 22, "tool": [22, 23], "input_fil": 22, "output_fil": 22, "m": [22, 24], "treat": [22, 24], "shown": 22, "even": 22, "out_fil": [22, 24], "bet_input_spec": [22, 24], "in_fil": [22, 24], "help_str": [22, 24, 25], "_br": [22, 24], "mask": [22, 24], "binari": [22, 24], "child": 22, "parent": [22, 24, 25], "softwar": [22, 23], "extrem": 22, "project": [22, 23], "encapsul": 22, "technologi": 22, "scientif": [22, 23], "reproduc": [22, 23], "behind": [22, 23], "directli": 22, "automat": 22, "equival": 22, "busybox": 22, "subclass": 22, "act": 22, "hashabl": 22, "unit": 22, "unlik": 22, "emb": 22, "acycl": [22, 23], "simpli": 22, "special": [22, 24, 26], "assign": 22, "rather": 22, "mult": 22, "mlt": 22, "lzin": 22, "add2": 22, "control": [22, 26], "heart": 22, "power": [22, 23], "formal": 22, "Its": 22, "recombin": [22, 23], "task_with_st": 22, "respons": 22, "back": 22, "while": [22, 23], "illustr": 22, "scalabl": 22, "lightweight": 23, "commun": 23, "purpos": 23, "domain": 23, "often": 23, "sophist": 23, "analys": 23, "encompass": 23, "larg": 23, "necessarili": 23, "author": 23, "program": 23, "common": 23, "practic": 23, "semi": 23, "manual": 23, "scientist": 23, "approach": 23, "conceptu": 23, "easi": 23, "consum": 23, "prone": 23, "difficult": 23, "consist": 23, "demand": 23, "organ": 23, "fulli": 23, "autom": 23, "wa": [23, 24, 25, 26], "motiv": 23, "second": [23, 26], "uniform": 23, "compon": [23, 27], "born": 23, "decad": 23, "ant": 23, "freesurf": 23, "flexibl": [23, 26], "made": 23, "ideal": 23, "basi": 23, "popular": 23, "preprocess": 23, "fmriprep": 23, "pac": 23, "meant": 23, "eas": 23, "mind": 23, "itself": 23, "goal": [23, 26], "well": 23, "reusabl": 23, "customiz": 23, "compos": 23, "encourag": 23, "similar": [23, 26], "model": 23, "global": 23, "reus": 23, "alongsid": 23, "integr": 23, "nativ": 23, "via": 23, "mechan": 23, "activ": 23, "releas": 23, "8": 23, "7": 23, "programm": 23, "subpackag": 23, "search": 23, "page": 23, "let": 24, "alwai": [24, 25], "you": [24, 25], "think": [24, 25], "usual": [24, 25], "top": [24, 25], "your": [24, 25], "cover": [24, 25], "customis": [24, 25], "three": [24, 25], "But": 24, "below": 24, "field1": 24, "field1_nam": 24, "ib": [24, 25], "field1_typ": 24, "shorter": 24, "abov": 24, "short": [24, 25], "sep": 24, "v": 24, "inp_field": 24, "nonneg": 24, "allowed_valu": 24, "mutual": 24, "exclus": 24, "possibl": [24, 25], "container_path": 24, "file1": [24, 25], "output_field_nam": [24, 25], "keep_extens": [24, 25], "readonli": 24, "flda": 24, "fldb": 24, "formatt": 24, "entir": [24, 25], "allowev_valu": 24, "out1": 25, "inp1": [25, 26], "inp2": [25, 26], "similarli": 25, "recogn": 25, "main": 26, "distinguish": 26, "typic": 26, "involv": 26, "signific": 26, "overhead": 26, "up": 26, "simplest": 26, "therefor": 26, "diagram": 26, "colour": 26, "whenev": 26, "complic": 26, "wise": 26, "parenthesi": 26, "y_2": 26, "y_n": 26, "bracket": 26, "schemat": 26, "inp3": 26, "pairwis": 26, "explain": 26}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "check_latest_version"], [1, 0, 0, "-", "engine"], [14, 0, 0, "-", "mark"], [0, 1, 1, "", "set_input_validator"], [16, 0, 0, "-", "tasks"], [17, 0, 0, "-", "utils"]], "pydra.engine": [[1, 2, 1, "", "AuditFlag"], [1, 2, 1, "", "DockerTask"], [1, 2, 1, "", "ShellCommandTask"], [1, 2, 1, "", "Submitter"], [1, 2, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "graph"], [6, 0, 0, "-", "helpers"], [7, 0, 0, "-", "helpers_file"], [8, 0, 0, "-", "helpers_state"], [9, 0, 0, "-", "specs"], [10, 0, 0, "-", "state"], [11, 0, 0, "-", "submitter"], [12, 0, 0, "-", "task"], [13, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 3, 1, "", "ALL"], [1, 3, 1, "", "NONE"], [1, 3, 1, "", "PROV"], [1, 3, 1, "", "RESOURCE"]], "pydra.engine.DockerTask": [[1, 4, 1, "", "container_args"], [1, 3, 1, "", "init"]], "pydra.engine.ShellCommandTask": [[1, 4, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 3, 1, "", "input_spec"], [1, 3, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 5, 1, "", "close"], [1, 5, 1, "", "expand_runnable"], [1, 5, 1, "", "expand_workflow"], [1, 5, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 5, 1, "", "add"], [1, 4, 1, "", "checksum"], [1, 5, 1, "", "create_connections"], [1, 5, 1, "", "create_dotfile"], [1, 4, 1, "", "graph_sorted"], [1, 4, 1, "", "nodes"], [1, 5, 1, "", "set_output"]], "pydra.engine.audit": [[2, 2, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 5, 1, "", "audit_check"], [2, 5, 1, "", "audit_message"], [2, 5, 1, "", "audit_task"], [2, 5, 1, "", "finalize_audit"], [2, 5, 1, "", "monitor"], [2, 5, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 2, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 2, 1, "", "TaskBase"], [4, 2, 1, "", "Workflow"], [4, 1, 1, "", "is_lazy"], [4, 1, 1, "", "is_task"], [4, 1, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 3, 1, "", "audit_flags"], [4, 4, 1, "", "cache_dir"], [4, 4, 1, "", "cache_locations"], [4, 4, 1, "", "can_resume"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "checksum_states"], [4, 5, 1, "", "combine"], [4, 4, 1, "", "cont_dim"], [4, 4, 1, "", "done"], [4, 4, 1, "", "errored"], [4, 4, 1, "", "generated_output_names"], [4, 5, 1, "", "get_input_el"], [4, 5, 1, "", "help"], [4, 4, 1, "", "output_dir"], [4, 4, 1, "", "output_names"], [4, 5, 1, "", "pickle_task"], [4, 5, 1, "", "result"], [4, 5, 1, "", "set_state"], [4, 5, 1, "", "split"], [4, 4, 1, "", "uid"], [4, 4, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 5, 1, "", "add"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "create_connections"], [4, 5, 1, "", "create_dotfile"], [4, 4, 1, "", "graph_sorted"], [4, 4, 1, "", "nodes"], [4, 5, 1, "", "set_output"]], "pydra.engine.graph": [[5, 2, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[5, 5, 1, "", "add_edges"], [5, 5, 1, "", "add_edges_description"], [5, 5, 1, "", "add_nodes"], [5, 5, 1, "", "calculate_max_paths"], [5, 5, 1, "", "copy"], [5, 5, 1, "", "create_dotfile_detailed"], [5, 5, 1, "", "create_dotfile_nested"], [5, 5, 1, "", "create_dotfile_simple"], [5, 4, 1, "", "edges"], [5, 4, 1, "", "edges_names"], [5, 5, 1, "", "export_graph"], [5, 4, 1, "", "nodes"], [5, 4, 1, "", "nodes_details"], [5, 4, 1, "", "nodes_names_map"], [5, 5, 1, "", "remove_nodes"], [5, 5, 1, "", "remove_nodes_connections"], [5, 5, 1, "", "remove_previous_connections"], [5, 5, 1, "", "remove_successors_nodes"], [5, 4, 1, "", "sorted_nodes"], [5, 4, 1, "", "sorted_nodes_names"], [5, 5, 1, "", "sorting"]], "pydra.engine.helpers": [[6, 2, 1, "", "PydraFileLock"], [6, 1, 1, "", "argstr_formatting"], [6, 1, 1, "", "copyfile_workflow"], [6, 1, 1, "", "create_checksum"], [6, 1, 1, "", "custom_validator"], [6, 1, 1, "", "ensure_list"], [6, 1, 1, "", "execute"], [6, 1, 1, "", "gather_runtime_info"], [6, 1, 1, "", "get_available_cpus"], [6, 1, 1, "", "get_open_loop"], [6, 1, 1, "", "hash_function"], [6, 1, 1, "", "hash_value"], [6, 1, 1, "", "load_and_run"], [6, 1, 1, "", "load_and_run_async"], [6, 1, 1, "", "load_result"], [6, 1, 1, "", "load_task"], [6, 1, 1, "", "make_klass"], [6, 1, 1, "", "output_from_inputfields"], [6, 1, 1, "", "position_sort"], [6, 1, 1, "", "print_help"], [6, 1, 1, "", "read_and_display"], [6, 1, 1, "", "read_and_display_async"], [6, 1, 1, "", "read_stream_and_display"], [6, 1, 1, "", "record_error"], [6, 1, 1, "", "save"], [6, 1, 1, "", "task_hash"]], "pydra.engine.helpers_file": [[7, 1, 1, "", "copyfile"], [7, 1, 1, "", "copyfile_input"], [7, 1, 1, "", "copyfiles"], [7, 1, 1, "", "ensure_list"], [7, 1, 1, "", "fname_presuffix"], [7, 1, 1, "", "get_related_files"], [7, 1, 1, "", "hash_dir"], [7, 1, 1, "", "hash_file"], [7, 1, 1, "", "is_container"], [7, 1, 1, "", "is_existing_file"], [7, 1, 1, "", "is_local_file"], [7, 1, 1, "", "on_cifs"], [7, 6, 1, "", "related_filetype_sets"], [7, 1, 1, "", "split_filename"], [7, 1, 1, "", "template_update"], [7, 1, 1, "", "template_update_single"]], "pydra.engine.helpers_state": [[8, 7, 1, "", "PydraStateError"], [8, 1, 1, "", "add_name_combiner"], [8, 1, 1, "", "add_name_splitter"], [8, 1, 1, "", "combine_final_groups"], [8, 1, 1, "", "converter_groups_to_input"], [8, 1, 1, "", "flatten"], [8, 1, 1, "", "input_shape"], [8, 1, 1, "", "inputs_types_to_dict"], [8, 1, 1, "", "iter_splits"], [8, 1, 1, "", "map_splits"], [8, 1, 1, "", "remove_inp_from_splitter_rpn"], [8, 1, 1, "", "rpn2splitter"], [8, 1, 1, "", "splits_groups"], [8, 1, 1, "", "splitter2rpn"]], "pydra.engine.specs": [[9, 2, 1, "", "BaseSpec"], [9, 2, 1, "", "ContainerSpec"], [9, 2, 1, "", "Directory"], [9, 2, 1, "", "DockerSpec"], [9, 2, 1, "", "File"], [9, 2, 1, "", "FunctionSpec"], [9, 2, 1, "", "LazyField"], [9, 2, 1, "", "MultiInputFile"], [9, 2, 1, "", "MultiInputObj"], [9, 2, 1, "", "MultiOutputFile"], [9, 2, 1, "", "MultiOutputObj"], [9, 2, 1, "", "Result"], [9, 2, 1, "", "Runtime"], [9, 2, 1, "", "RuntimeSpec"], [9, 2, 1, "", "ShellOutSpec"], [9, 2, 1, "", "ShellSpec"], [9, 2, 1, "", "SingularitySpec"], [9, 2, 1, "", "SpecInfo"], [9, 2, 1, "", "TaskHook"], [9, 1, 1, "", "attr_fields"], [9, 1, 1, "", "attr_fields_dict"], [9, 1, 1, "", "donothing"], [9, 1, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[9, 5, 1, "", "check_fields_input_spec"], [9, 5, 1, "", "check_metadata"], [9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "copyfile_input"], [9, 4, 1, "", "hash"], [9, 5, 1, "", "retrieve_values"], [9, 5, 1, "", "template_update"]], "pydra.engine.specs.ContainerSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "container_xargs"], [9, 3, 1, "", "image"]], "pydra.engine.specs.DockerSpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.FunctionSpec": [[9, 5, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[9, 5, 1, "", "get_value"]], "pydra.engine.specs.MultiInputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.MultiOutputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.Result": [[9, 3, 1, "", "errored"], [9, 5, 1, "", "get_output_field"], [9, 3, 1, "", "output"], [9, 3, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[9, 3, 1, "", "cpu_peak_percent"], [9, 3, 1, "", "rss_peak_gb"], [9, 3, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "network"], [9, 3, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "generated_output_names"], [9, 3, 1, "", "return_code"], [9, 3, 1, "", "stderr"], [9, 3, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[9, 3, 1, "", "args"], [9, 5, 1, "", "check_metadata"], [9, 3, 1, "", "executable"], [9, 5, 1, "", "retrieve_values"]], "pydra.engine.specs.SingularitySpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.SpecInfo": [[9, 3, 1, "", "bases"], [9, 3, 1, "", "fields"], [9, 3, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[9, 3, 1, "", "post_run"], [9, 3, 1, "", "post_run_task"], [9, 3, 1, "", "pre_run"], [9, 3, 1, "", "pre_run_task"], [9, 5, 1, "", "reset"]], "pydra.engine.state": [[10, 2, 1, "", "State"]], "pydra.engine.state.State": [[10, 4, 1, "id0", "combiner"], [10, 5, 1, "", "combiner_validation"], [10, 4, 1, "", "current_combiner"], [10, 4, 1, "", "current_combiner_all"], [10, 4, 1, "", "current_splitter"], [10, 4, 1, "", "current_splitter_rpn"], [10, 3, 1, "", "final_combined_ind_mapping"], [10, 3, 1, "", "group_for_inputs"], [10, 3, 1, "", "group_for_inputs_final"], [10, 3, 1, "", "groups_stack_final"], [10, 4, 1, "id1", "inner_inputs"], [10, 3, 1, "", "inputs_ind"], [10, 3, 1, "", "name"], [10, 4, 1, "id2", "other_states"], [10, 5, 1, "", "prepare_inputs"], [10, 5, 1, "", "prepare_states"], [10, 5, 1, "", "prepare_states_combined_ind"], [10, 5, 1, "", "prepare_states_ind"], [10, 5, 1, "", "prepare_states_val"], [10, 4, 1, "", "prev_state_combiner"], [10, 4, 1, "", "prev_state_combiner_all"], [10, 4, 1, "", "prev_state_splitter"], [10, 4, 1, "", "prev_state_splitter_rpn"], [10, 4, 1, "", "prev_state_splitter_rpn_compact"], [10, 5, 1, "", "set_input_groups"], [10, 5, 1, "", "splits"], [10, 4, 1, "id3", "splitter"], [10, 4, 1, "id4", "splitter_final"], [10, 4, 1, "id5", "splitter_rpn"], [10, 4, 1, "id6", "splitter_rpn_compact"], [10, 4, 1, "", "splitter_rpn_final"], [10, 5, 1, "", "splitter_validation"], [10, 3, 1, "", "states_ind"], [10, 3, 1, "", "states_val"], [10, 5, 1, "", "update_connections"]], "pydra.engine.submitter": [[11, 2, 1, "", "Submitter"], [11, 1, 1, "", "get_runnable_tasks"], [11, 1, 1, "", "is_runnable"], [11, 1, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[11, 5, 1, "", "close"], [11, 5, 1, "", "expand_runnable"], [11, 5, 1, "", "expand_workflow"], [11, 5, 1, "", "submit_from_call"]], "pydra.engine.task": [[12, 2, 1, "", "ContainerTask"], [12, 2, 1, "", "DockerTask"], [12, 2, 1, "", "FunctionTask"], [12, 2, 1, "", "ShellCommandTask"], [12, 2, 1, "", "SingularityTask"], [12, 1, 1, "", "split_cmd"]], "pydra.engine.task.ContainerTask": [[12, 5, 1, "", "bind_paths"], [12, 5, 1, "", "binds"], [12, 5, 1, "", "container_check"]], "pydra.engine.task.DockerTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.task.ShellCommandTask": [[12, 4, 1, "", "cmdline"], [12, 4, 1, "", "command_args"], [12, 3, 1, "", "input_spec"], [12, 3, 1, "", "output_spec"]], "pydra.engine.task.SingularityTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.workers": [[13, 2, 1, "", "ConcurrentFuturesWorker"], [13, 2, 1, "", "DaskWorker"], [13, 2, 1, "", "DistributedWorker"], [13, 2, 1, "", "SGEWorker"], [13, 2, 1, "", "SerialWorker"], [13, 2, 1, "", "SlurmWorker"], [13, 2, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_as_coro"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_dask"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[13, 5, 1, "", "fetch_finished"], [13, 3, 1, "", "max_jobs"]], "pydra.engine.workers.SGEWorker": [[13, 5, 1, "", "check_for_results_files"], [13, 5, 1, "", "get_output_by_task_pkl"], [13, 5, 1, "", "get_tasks_to_run"], [13, 5, 1, "", "run_el"], [13, 5, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_serial"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[13, 5, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.mark": [[15, 0, 0, "-", "functions"]], "pydra.mark.functions": [[15, 1, 1, "", "annotate"], [15, 1, 1, "", "task"]], "pydra.utils": [[18, 0, 0, "-", "messenger"], [19, 0, 0, "-", "profiler"]], "pydra.utils.messenger": [[18, 2, 1, "", "AuditFlag"], [18, 2, 1, "", "FileMessenger"], [18, 2, 1, "", "Messenger"], [18, 2, 1, "", "PrintMessenger"], [18, 2, 1, "", "RemoteRESTMessenger"], [18, 2, 1, "", "RuntimeHooks"], [18, 1, 1, "", "collect_messages"], [18, 1, 1, "", "gen_uuid"], [18, 1, 1, "", "make_message"], [18, 1, 1, "", "now"], [18, 1, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "NONE"], [18, 3, 1, "", "PROV"], [18, 3, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[18, 3, 1, "", "resource_monitor_post_stop"], [18, 3, 1, "", "resource_monitor_pre_start"], [18, 3, 1, "", "task_execute_post_exit"], [18, 3, 1, "", "task_execute_pre_entry"], [18, 3, 1, "", "task_run_entry"], [18, 3, 1, "", "task_run_exit"]], "pydra.utils.profiler": [[19, 2, 1, "", "ResourceMonitor"], [19, 1, 1, "", "get_max_resources_used"], [19, 1, 1, "", "get_system_total_memory_gb"], [19, 1, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[19, 4, 1, "", "fname"], [19, 5, 1, "", "run"], [19, 5, 1, "", "stop"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:property", "5": "py:method", "6": "py:data", "7": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "method", "Python method"], "6": ["py", "data", "Python data"], "7": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 23], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 23], "packag": [1, 14, 16, 17], "submodul": [1, 14, 17], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19], "boutiqu": 3, "core": 4, "graph": 5, "helper": 6, "helpers_fil": 7, "copi": 7, "option": 7, "exist": 7, "file": 7, "new": [7, 24], "helpers_st": 8, "spec": [9, 24], "state": [10, 22, 26], "submitt": 11, "task": [12, 16, 21, 22], "note": [12, 20], "worker": 13, "mark": [14, 15], "function": [15, 22], "util": [17, 18, 19], "messeng": 18, "profil": 19, "releas": 20, "0": 20, "8": 20, "7": 20, "6": 20, "2": 20, "1": 20, "5": 20, "4": 20, "3": 20, "group": 21, "": [21, 22, 23], "output": [21, 25], "dataflow": [22, 23], "compon": 22, "workflow": 22, "shell": 22, "command": 22, "contain": 22, "welcom": 23, "A": 23, "simpl": 23, "scalabl": 23, "semant": 23, "document": 23, "content": 23, "indic": 23, "tabl": 23, "input": [24, 26], "specif": [24, 25], "ad": 24, "field": 24, "type": [24, 26], "metadata": [24, 25], "valid": 24, "nest": 26, "loop": 26, "over": 26, "splitter": 26, "scalar": 26, "outer": 26, "user": 27, "guid": 27}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [14, "submodules"], [17, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.graph module": [[5, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[6, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[7, "module-pydra.engine.helpers_file"]], "Copy options for existing files": [[7, null]], "Copy options for new files": [[7, null]], "pydra.engine.helpers_state module": [[8, "module-pydra.engine.helpers_state"]], "pydra.engine.specs module": [[9, "module-pydra.engine.specs"]], "pydra.engine.state module": [[10, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[11, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[12, "module-pydra.engine.task"]], "Notes:": [[12, null]], "pydra.engine.workers module": [[13, "module-pydra.engine.workers"]], "pydra.mark package": [[14, "module-pydra.mark"]], "pydra.mark.functions module": [[15, "module-pydra.mark.functions"]], "pydra.tasks package": [[16, "module-pydra.tasks"]], "pydra.utils package": [[17, "module-pydra.utils"]], "pydra.utils.messenger module": [[18, "module-pydra.utils.messenger"]], "pydra.utils.profiler module": [[19, "module-pydra.utils.profiler"]], "Release Notes": [[20, "release-notes"]], "0.8.0": [[20, "id1"]], "0.7.0": [[20, "id2"]], "0.6.2": [[20, "id3"]], "0.6.1": [[20, "id4"]], "0.6": [[20, "id5"]], "0.5": [[20, "id6"]], "0.4": [[20, "id7"]], "0.3.1": [[20, "id8"]], "0.3": [[20, "id9"]], "0.2.2": [[20, "id10"]], "0.2.1": [[20, "id11"]], "0.2": [[20, "id12"]], "0.1": [[20, "id13"]], "0.0.1": [[20, "id14"]], "Grouping Task\u2019s Output": [[21, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[22, "dataflows-components-task-and-workflow"]], "Function Tasks": [[22, "function-tasks"]], "Shell Command Tasks": [[22, "shell-command-tasks"]], "Container Tasks": [[22, "container-tasks"]], "Workflows": [[22, "workflows"]], "Task\u2019s State": [[22, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[23, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[23, null]], "Indices and tables": [[23, "indices-and-tables"]], "Input Specification": [[24, "input-specification"]], "Adding a New Field to the Spec": [[24, "adding-a-new-field-to-the-spec"]], "Types": [[24, "types"]], "Metadata": [[24, "metadata"], [25, "metadata"]], "Validators": [[24, "validators"]], "Output Specification": [[25, "output-specification"]], "State and Nested Loops over Input": [[26, "state-and-nested-loops-over-input"]], "Types of Splitter": [[26, "types-of-splitter"]], "Scalar Splitter": [[26, "scalar-splitter"]], "Outer Splitter": [[26, "outer-splitter"]], "User Guide": [[27, "user-guide"]]}, "indexentries": {"check_latest_version() (in module pydra)": [[0, "pydra.check_latest_version"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.graph"], [6, "module-pydra.engine.helpers"], [7, "module-pydra.engine.helpers_file"], [8, "module-pydra.engine.helpers_state"], [9, "module-pydra.engine.specs"], [10, "module-pydra.engine.state"], [11, "module-pydra.engine.submitter"], [12, "module-pydra.engine.task"], [13, "module-pydra.engine.workers"], [14, "module-pydra.mark"], [15, "module-pydra.mark.functions"], [16, "module-pydra.tasks"], [17, "module-pydra.utils"], [18, "module-pydra.utils.messenger"], [19, "module-pydra.utils.profiler"]], "pydra": [[0, "module-pydra"]], "set_input_validator() (in module pydra)": [[0, "pydra.set_input_validator"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "dockertask (class in pydra.engine)": [[1, "pydra.engine.DockerTask"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "container_args (pydra.engine.dockertask property)": [[1, "pydra.engine.DockerTask.container_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "init (pydra.engine.dockertask attribute)": [[1, "pydra.engine.DockerTask.init"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "digraph (class in pydra.engine.graph)": [[5, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[5, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[6, "pydra.engine.helpers.PydraFileLock"]], "argstr_formatting() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.create_checksum"]], "custom_validator() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.custom_validator"]], "ensure_list() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.execute"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_open_loop"]], "hash_function() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_function"]], "hash_value() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_value"]], "load_and_run() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.output_from_inputfields"]], "position_sort() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[6, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.save"]], "task_hash() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.task_hash"]], "copyfile() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile"]], "copyfile_input() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile_input"]], "copyfiles() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfiles"]], "ensure_list() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.ensure_list"]], "fname_presuffix() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.fname_presuffix"]], "get_related_files() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.get_related_files"]], "hash_dir() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_dir"]], "hash_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_file"]], "is_container() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_container"]], "is_existing_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_existing_file"]], "is_local_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.on_cifs"]], "pydra.engine.helpers_file": [[7, "module-pydra.engine.helpers_file"]], "related_filetype_sets (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.related_filetype_sets"]], "split_filename() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.split_filename"]], "template_update() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[8, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[8, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splitter2rpn"]], "basespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.BaseSpec"]], "containerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ContainerSpec"]], "directory (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Directory"]], "dockerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.DockerSpec"]], "file (class in pydra.engine.specs)": [[9, "pydra.engine.specs.File"]], "functionspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyField"]], "multiinputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputFile"]], "multiinputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputObj"]], "multioutputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputFile"]], "multioutputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputObj"]], "result (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellSpec"]], "singularityspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SingularitySpec"]], "specinfo (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SpecInfo"]], "taskhook (class in pydra.engine.specs)": [[9, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields"]], "attr_fields_dict() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields_dict"]], "bases (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.bases"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[9, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container"]], "container (pydra.engine.specs.dockerspec attribute)": [[9, "pydra.engine.specs.DockerSpec.container"]], "container (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.container"]], "container (pydra.engine.specs.singularityspec attribute)": [[9, "pydra.engine.specs.SingularitySpec.container"]], "container_xargs (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container_xargs"]], "converter() (pydra.engine.specs.multiinputobj class method)": [[9, "pydra.engine.specs.MultiInputObj.converter"]], "converter() (pydra.engine.specs.multioutputobj class method)": [[9, "pydra.engine.specs.MultiOutputObj.converter"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.executable"]], "fields (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[9, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[9, "pydra.engine.specs.BaseSpec.hash"]], "image (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.image"]], "name (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[9, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[9, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.runtime"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.template_update"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[10, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[10, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[10, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[10, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[10, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[10, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[10, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[10, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[10, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[11, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[11, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.submit_from_call"]], "containertask (class in pydra.engine.task)": [[12, "pydra.engine.task.ContainerTask"]], "dockertask (class in pydra.engine.task)": [[12, "pydra.engine.task.DockerTask"]], "functiontask (class in pydra.engine.task)": [[12, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[12, "pydra.engine.task.ShellCommandTask"]], "singularitytask (class in pydra.engine.task)": [[12, "pydra.engine.task.SingularityTask"]], "bind_paths() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.bind_paths"]], "binds() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.binds"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.command_args"]], "container_args (pydra.engine.task.dockertask property)": [[12, "pydra.engine.task.DockerTask.container_args"]], "container_args (pydra.engine.task.singularitytask property)": [[12, "pydra.engine.task.SingularityTask.container_args"]], "container_check() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.container_check"]], "init (pydra.engine.task.dockertask attribute)": [[12, "pydra.engine.task.DockerTask.init"]], "init (pydra.engine.task.singularitytask attribute)": [[12, "pydra.engine.task.SingularityTask.init"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[12, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[12, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DistributedWorker"]], "sgeworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[13, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[13, "pydra.engine.workers.DistributedWorker.max_jobs"]], "pydra.engine.workers": [[13, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[13, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.submit_array_job"]], "pydra.mark": [[14, "module-pydra.mark"]], "annotate() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[15, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.task"]], "pydra.tasks": [[16, "module-pydra.tasks"]], "pydra.utils": [[17, "module-pydra.utils"]], "all (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[18, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[18, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[18, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[18, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[18, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "resourcemonitor (class in pydra.utils.profiler)": [[19, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[19, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[19, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.stop"]]}}) \ No newline at end of file diff --git a/0.22/state.html b/0.22/state.html new file mode 100644 index 0000000000..acb6d98a54 --- /dev/null +++ b/0.22/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.22/user_guide.html b/0.22/user_guide.html new file mode 100644 index 0000000000..c1b4095580 --- /dev/null +++ b/0.22/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.23.0-alpha/.buildinfo b/0.23.0-alpha/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/0.23.0-alpha/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/0.23.0-alpha/.doctrees/api.doctree b/0.23.0-alpha/.doctrees/api.doctree new file mode 100644 index 0000000000..db410e6dc7 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.audit.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..69c2461292 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.boutiques.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..012e7ecb0a Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.core.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..ccd2aeb228 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.core.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..5734dc3e81 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.graph.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..f1efd9e74c Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.helpers.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..f46b782dd9 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_file.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..1e722ce5bb Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_state.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..e62c71b09a Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.specs.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..2291d43ca5 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.state.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..f0ee2c9b5f Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.state.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.submitter.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..2ef77626ab Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.task.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..41bc9e182e Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.task.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.engine.workers.doctree b/0.23.0-alpha/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..b1072764c3 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.mark.doctree b/0.23.0-alpha/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..ae84ca4d67 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.mark.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.mark.functions.doctree b/0.23.0-alpha/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..4cc8c34720 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.tasks.doctree b/0.23.0-alpha/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..78e3ca0856 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.tasks.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.utils.doctree b/0.23.0-alpha/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..c90a1377af Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.utils.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.utils.hash.doctree b/0.23.0-alpha/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..978f065e53 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.utils.messenger.doctree b/0.23.0-alpha/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..9d6baf9ee9 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.utils.profiler.doctree b/0.23.0-alpha/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..a1c423a891 Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/0.23.0-alpha/.doctrees/api/pydra.utils.typing.doctree b/0.23.0-alpha/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..65cb11ccbd Binary files /dev/null and b/0.23.0-alpha/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/0.23.0-alpha/.doctrees/changes.doctree b/0.23.0-alpha/.doctrees/changes.doctree new file mode 100644 index 0000000000..81b1857df5 Binary files /dev/null and b/0.23.0-alpha/.doctrees/changes.doctree differ diff --git a/0.23.0-alpha/.doctrees/combiner.doctree b/0.23.0-alpha/.doctrees/combiner.doctree new file mode 100644 index 0000000000..bceb154eca Binary files /dev/null and b/0.23.0-alpha/.doctrees/combiner.doctree differ diff --git a/0.23.0-alpha/.doctrees/components.doctree b/0.23.0-alpha/.doctrees/components.doctree new file mode 100644 index 0000000000..115d96427e Binary files /dev/null and b/0.23.0-alpha/.doctrees/components.doctree differ diff --git a/0.23.0-alpha/.doctrees/environment.pickle b/0.23.0-alpha/.doctrees/environment.pickle new file mode 100644 index 0000000000..3fd8567053 Binary files /dev/null and b/0.23.0-alpha/.doctrees/environment.pickle differ diff --git a/0.23.0-alpha/.doctrees/index.doctree b/0.23.0-alpha/.doctrees/index.doctree new file mode 100644 index 0000000000..6cb382f6ed Binary files /dev/null and b/0.23.0-alpha/.doctrees/index.doctree differ diff --git a/0.23.0-alpha/.doctrees/input_spec.doctree b/0.23.0-alpha/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..76b8944ed2 Binary files /dev/null and b/0.23.0-alpha/.doctrees/input_spec.doctree differ diff --git a/0.23.0-alpha/.doctrees/output_spec.doctree b/0.23.0-alpha/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..e55804356b Binary files /dev/null and b/0.23.0-alpha/.doctrees/output_spec.doctree differ diff --git a/0.23.0-alpha/.doctrees/state.doctree b/0.23.0-alpha/.doctrees/state.doctree new file mode 100644 index 0000000000..7fffcef1b3 Binary files /dev/null and b/0.23.0-alpha/.doctrees/state.doctree differ diff --git a/0.23.0-alpha/.doctrees/user_guide.doctree b/0.23.0-alpha/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..98d1422d7e Binary files /dev/null and b/0.23.0-alpha/.doctrees/user_guide.doctree differ diff --git a/0.23.0-alpha/.nojekyll b/0.23.0-alpha/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/0.23.0-alpha/_images/nd_spl_1.png b/0.23.0-alpha/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/0.23.0-alpha/_images/nd_spl_1.png differ diff --git a/0.23.0-alpha/_images/nd_spl_3.png b/0.23.0-alpha/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/0.23.0-alpha/_images/nd_spl_3.png differ diff --git a/0.23.0-alpha/_images/nd_spl_3_comb1.png b/0.23.0-alpha/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/0.23.0-alpha/_images/nd_spl_3_comb1.png differ diff --git a/0.23.0-alpha/_images/nd_spl_3_comb3.png b/0.23.0-alpha/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/0.23.0-alpha/_images/nd_spl_3_comb3.png differ diff --git a/0.23.0-alpha/_images/nd_spl_4.png b/0.23.0-alpha/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/0.23.0-alpha/_images/nd_spl_4.png differ diff --git a/0.23.0-alpha/_sources/api.rst.txt b/0.23.0-alpha/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/0.23.0-alpha/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/0.23.0-alpha/_sources/api/pydra.engine.audit.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.boutiques.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.core.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.graph.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.helpers.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.helpers_file.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.helpers_state.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..7cafa8d6ad --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,26 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/0.23.0-alpha/_sources/api/pydra.engine.specs.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.state.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.submitter.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.task.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.engine.workers.rst.txt b/0.23.0-alpha/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.mark.functions.rst.txt b/0.23.0-alpha/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.mark.rst.txt b/0.23.0-alpha/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/0.23.0-alpha/_sources/api/pydra.tasks.rst.txt b/0.23.0-alpha/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.utils.hash.rst.txt b/0.23.0-alpha/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.utils.messenger.rst.txt b/0.23.0-alpha/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.utils.profiler.rst.txt b/0.23.0-alpha/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/api/pydra.utils.rst.txt b/0.23.0-alpha/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..67da0e040d --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,18 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.profiler + pydra.utils.typing diff --git a/0.23.0-alpha/_sources/api/pydra.utils.typing.rst.txt b/0.23.0-alpha/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/0.23.0-alpha/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23.0-alpha/_sources/changes.rst.txt b/0.23.0-alpha/_sources/changes.rst.txt new file mode 100644 index 0000000000..0fb4187e33 --- /dev/null +++ b/0.23.0-alpha/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messanger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/0.23.0-alpha/_sources/combiner.rst.txt b/0.23.0-alpha/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/0.23.0-alpha/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/0.23.0-alpha/_sources/components.rst.txt b/0.23.0-alpha/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/0.23.0-alpha/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/0.23.0-alpha/_sources/index.rst.txt b/0.23.0-alpha/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/0.23.0-alpha/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/0.23.0-alpha/_sources/input_spec.rst.txt b/0.23.0-alpha/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/0.23.0-alpha/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/0.23.0-alpha/_sources/output_spec.rst.txt b/0.23.0-alpha/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/0.23.0-alpha/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/0.23.0-alpha/_sources/state.rst.txt b/0.23.0-alpha/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/0.23.0-alpha/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/0.23.0-alpha/_sources/user_guide.rst.txt b/0.23.0-alpha/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/0.23.0-alpha/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/0.23.0-alpha/_static/_sphinx_javascript_frameworks_compat.js b/0.23.0-alpha/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/0.23.0-alpha/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/0.23.0-alpha/_static/banner.css b/0.23.0-alpha/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/0.23.0-alpha/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/0.23.0-alpha/_static/basic.css b/0.23.0-alpha/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/0.23.0-alpha/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/0.23.0-alpha/_static/css/badge_only.css b/0.23.0-alpha/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/0.23.0-alpha/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff2 b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff2 b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.eot b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.svg b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.ttf b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff2 b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff b/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff2 b/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-bold.woff b/0.23.0-alpha/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-bold.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-bold.woff2 b/0.23.0-alpha/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-bold.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff b/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff2 b/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-normal.woff b/0.23.0-alpha/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-normal.woff differ diff --git a/0.23.0-alpha/_static/css/fonts/lato-normal.woff2 b/0.23.0-alpha/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/0.23.0-alpha/_static/css/fonts/lato-normal.woff2 differ diff --git a/0.23.0-alpha/_static/css/theme.css b/0.23.0-alpha/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/0.23.0-alpha/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/0.23.0-alpha/_static/doctools.js b/0.23.0-alpha/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/0.23.0-alpha/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/0.23.0-alpha/_static/documentation_options.js b/0.23.0-alpha/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/0.23.0-alpha/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/0.23.0-alpha/_static/file.png b/0.23.0-alpha/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/0.23.0-alpha/_static/file.png differ diff --git a/0.23.0-alpha/_static/jquery.js b/0.23.0-alpha/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/0.23.0-alpha/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.23.0-alpha/_static/js/html5shiv.min.js b/0.23.0-alpha/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/0.23.0-alpha/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.23.0-alpha/_static/js/theme.js b/0.23.0-alpha/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/0.23.0-alpha/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/0.23.0-alpha/_static/minus.png b/0.23.0-alpha/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/0.23.0-alpha/_static/minus.png differ diff --git a/0.23.0-alpha/_static/plus.png b/0.23.0-alpha/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/0.23.0-alpha/_static/plus.png differ diff --git a/0.23.0-alpha/_static/pygments.css b/0.23.0-alpha/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/0.23.0-alpha/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/0.23.0-alpha/_static/searchtools.js b/0.23.0-alpha/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/0.23.0-alpha/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/0.23.0-alpha/_static/sphinx_highlight.js b/0.23.0-alpha/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/0.23.0-alpha/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/0.23.0-alpha/api.html b/0.23.0-alpha/api.html new file mode 100644 index 0000000000..57740597d8 --- /dev/null +++ b/0.23.0-alpha/api.html @@ -0,0 +1,988 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.audit.html b/0.23.0-alpha/api/pydra.engine.audit.html new file mode 100644 index 0000000000..bc7b11a6c2 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.audit.html @@ -0,0 +1,246 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.boutiques.html b/0.23.0-alpha/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..eb8e6091ce --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.boutiques.html @@ -0,0 +1,184 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.core.html b/0.23.0-alpha/api/pydra.engine.core.html new file mode 100644 index 0000000000..ddd6b41b34 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.core.html @@ -0,0 +1,500 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elemntary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Return type:
+

result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.graph.html b/0.23.0-alpha/api/pydra.engine.graph.html new file mode 100644 index 0000000000..d289d766ee --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.graph.html @@ -0,0 +1,353 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other format, equires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.helpers.html b/0.23.0-alpha/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..fe55498fe0 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.helpers.html @@ -0,0 +1,448 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.helpers_file.html b/0.23.0-alpha/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..e1c4f5b791 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.helpers_file.html @@ -0,0 +1,317 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.helpers_state.html b/0.23.0-alpha/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..983c49084c --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.helpers_state.html @@ -0,0 +1,321 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.html b/0.23.0-alpha/api/pydra.engine.html new file mode 100644 index 0000000000..d8541b5a61 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.html @@ -0,0 +1,428 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.specs.html b/0.23.0-alpha/api/pydra.engine.specs.html new file mode 100644 index 0000000000..61b42d43fe --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.specs.html @@ -0,0 +1,696 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+

Compute a basic hash for any given set of fields.

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.ContainerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container: File | str | None, container_xargs: List[str] | None = None)
+

Bases: ShellSpec

+

Refine the generic command-line specification to container execution.

+
+
+container: File | str | None
+

The container.

+
+ +
+
+container_xargs: List[str] | None
+
+ +
+
+image: File | str
+

The image to be containerized.

+
+ +
+ +
+
+class pydra.engine.specs.DockerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'docker')
+

Bases: ContainerSpec

+

Particularize container specifications to the Docker engine.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SingularitySpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'singularity')
+

Bases: ContainerSpec

+

Particularize container specifications to Singularity.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.state.html b/0.23.0-alpha/api/pydra.engine.state.html new file mode 100644 index 0000000000..d5db00c980 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.state.html @@ -0,0 +1,600 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.submitter.html b/0.23.0-alpha/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..6cf11cff83 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.submitter.html @@ -0,0 +1,266 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.task.html b/0.23.0-alpha/api/pydra.engine.task.html new file mode 100644 index 0000000000..07b2dc832e --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.task.html @@ -0,0 +1,364 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.ContainerTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Extend shell command task for containerized execution.

+
+
+SUPPORTED_COPY_MODES = 13
+
+ +
+
+bind_paths()
+

Get bound mount points

+
+
Returns:
+

mount points – mapping from local path to tuple of container path + mode

+
+
Return type:
+

dict

+
+
+
+ +
+
+binds(opt)
+

Specify mounts to bind from local filesystems to container and working directory.

+

Uses py:meth:bind_paths

+
+ +
+
+container_check(container_type)
+

Get container-specific CLI arguments.

+
+ +
+ +
+
+class pydra.engine.task.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.task.SingularityTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with Singularity.

+
+
+property container_args
+

Get container-specific CLI arguments.

+
+ +
+
+init = False
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.engine.workers.html b/0.23.0-alpha/api/pydra.engine.workers.html new file mode 100644 index 0000000000..96de1d60c7 --- /dev/null +++ b/0.23.0-alpha/api/pydra.engine.workers.html @@ -0,0 +1,384 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.mark.functions.html b/0.23.0-alpha/api/pydra.mark.functions.html new file mode 100644 index 0000000000..339bc82e49 --- /dev/null +++ b/0.23.0-alpha/api/pydra.mark.functions.html @@ -0,0 +1,201 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.mark.html b/0.23.0-alpha/api/pydra.mark.html new file mode 100644 index 0000000000..3524db13fa --- /dev/null +++ b/0.23.0-alpha/api/pydra.mark.html @@ -0,0 +1,207 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.tasks.html b/0.23.0-alpha/api/pydra.tasks.html new file mode 100644 index 0000000000..957f45c1d6 --- /dev/null +++ b/0.23.0-alpha/api/pydra.tasks.html @@ -0,0 +1,172 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.utils.hash.html b/0.23.0-alpha/api/pydra.utils.hash.html new file mode 100644 index 0000000000..3d13cd84b2 --- /dev/null +++ b/0.23.0-alpha/api/pydra.utils.hash.html @@ -0,0 +1,253 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache({}))
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache({}))
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.utils.html b/0.23.0-alpha/api/pydra.utils.html new file mode 100644 index 0000000000..7b63bf7f61 --- /dev/null +++ b/0.23.0-alpha/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.utils.messenger.html b/0.23.0-alpha/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..00c83c4f15 --- /dev/null +++ b/0.23.0-alpha/api/pydra.utils.messenger.html @@ -0,0 +1,376 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.utils.profiler.html b/0.23.0-alpha/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..5feceea716 --- /dev/null +++ b/0.23.0-alpha/api/pydra.utils.profiler.html @@ -0,0 +1,248 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/api/pydra.utils.typing.html b/0.23.0-alpha/api/pydra.utils.typing.html new file mode 100644 index 0000000000..0ec6b88f59 --- /dev/null +++ b/0.23.0-alpha/api/pydra.utils.typing.html @@ -0,0 +1,444 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)))
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+static is_instance(obj: object, candidates: Type[Any] | Iterable[Type[Any]]) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Iterable[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/changes.html b/0.23.0-alpha/changes.html new file mode 100644 index 0000000000..26a69d95a5 --- /dev/null +++ b/0.23.0-alpha/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messanger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/combiner.html b/0.23.0-alpha/combiner.html new file mode 100644 index 0000000000..07728c1e7c --- /dev/null +++ b/0.23.0-alpha/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/components.html b/0.23.0-alpha/components.html new file mode 100644 index 0000000000..8ab85f64e3 --- /dev/null +++ b/0.23.0-alpha/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/genindex.html b/0.23.0-alpha/genindex.html new file mode 100644 index 0000000000..48a56611f9 --- /dev/null +++ b/0.23.0-alpha/genindex.html @@ -0,0 +1,1449 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/index.html b/0.23.0-alpha/index.html new file mode 100644 index 0000000000..8679dad715 --- /dev/null +++ b/0.23.0-alpha/index.html @@ -0,0 +1,247 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/input_spec.html b/0.23.0-alpha/input_spec.html new file mode 100644 index 0000000000..e061d36a2c --- /dev/null +++ b/0.23.0-alpha/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/objects.inv b/0.23.0-alpha/objects.inv new file mode 100644 index 0000000000..12b756bca6 Binary files /dev/null and b/0.23.0-alpha/objects.inv differ diff --git a/0.23.0-alpha/output_spec.html b/0.23.0-alpha/output_spec.html new file mode 100644 index 0000000000..49c46da94e --- /dev/null +++ b/0.23.0-alpha/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/py-modindex.html b/0.23.0-alpha/py-modindex.html new file mode 100644 index 0000000000..c6c2d62d48 --- /dev/null +++ b/0.23.0-alpha/py-modindex.html @@ -0,0 +1,260 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/search.html b/0.23.0-alpha/search.html new file mode 100644 index 0000000000..0b8da2181b --- /dev/null +++ b/0.23.0-alpha/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/0.23.0-alpha/searchindex.js b/0.23.0-alpha/searchindex.js new file mode 100644 index 0000000000..9ce3b0ea12 --- /dev/null +++ b/0.23.0-alpha/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 6, 8, 9, 11, 16, 18, 19, 24, 25, 26, 27, 28], "pydra": [0, 22, 23, 24, 26, 28], "workflow": [0, 1, 4, 5, 6, 9, 11, 15, 22, 23, 25, 28, 29], "engin": [0, 20, 21, 22, 28], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "rewrit": 0, "nipyp": [0, 7, 20, 22, 25], "map": [0, 5, 10, 12, 18, 21, 24, 25, 28], "join": [0, 18], "first": [0, 23], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 21, 22, 24, 26, 27], "oper": [0, 10, 28], "It": [0, 4, 10, 23, 24, 25], "form": [0, 6, 8, 9, 10, 24, 27], "core": [0, 1, 9, 11, 20, 22], "2": [0, 1, 6, 11, 12, 14, 15, 18, 19, 24, 25, 26, 28], "0": [0, 1, 4, 6, 8, 11, 14, 15, 19, 25], "ecosystem": [0, 25], "auditflag": [0, 1, 4, 12, 19, 25], "valu": [0, 1, 4, 6, 7, 8, 9, 10, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "name": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 19, 22, 24, 26, 27], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 21, 22], "modul": [0, 1, 14, 17, 25], "qualnam": [0, 1, 19], "type": [0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 17, 18, 19, 20, 22, 24, 27, 29], "start": [0, 1, 2, 5, 18, 19, 20, 26], "1": [0, 1, 4, 6, 7, 8, 11, 13, 18, 19, 24, 25, 26, 28], "boundari": [0, 1, 19], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 21, 24, 25, 26, 27, 28], "flag": [0, 1, 2, 4, 19, 22, 24, 26, 27], "audit": [0, 1, 4, 12, 19, 22, 25], "all": [0, 1, 4, 5, 7, 8, 9, 10, 11, 19, 21, 22, 23, 24, 26, 28], "3": [0, 1, 6, 11, 19, 25, 28], "track": [0, 1, 2, 9, 10, 12, 19, 20, 24, 25], "proven": [0, 1, 2, 12, 19, 25], "resourc": [0, 1, 2, 19, 20, 25], "util": [0, 1, 2, 7], "do": [0, 1, 11, 18, 19, 27], "monitor": [0, 1, 2, 12, 19, 20], "prov": [0, 1, 19], "onli": [0, 1, 4, 6, 10, 11, 12, 19, 21, 23, 26, 27, 28], "dockertask": [0, 1, 12, 22, 24, 25], "container_info": [0, 1, 3, 12, 24], "arg": [0, 1, 3, 4, 6, 9, 12, 21, 24], "kwarg": [0, 1, 3, 4, 6, 7, 9, 11, 12, 13, 19, 21], "containertask": [0, 1, 12, 24, 26], "extend": [0, 1, 12, 21, 24, 25, 28], "shell": [0, 1, 3, 9, 12, 25, 26, 27, 29], "command": [0, 1, 3, 5, 6, 7, 9, 12, 25, 26, 27, 29], "task": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 13, 14, 15, 22, 25, 26, 27, 28, 29], "container": [0, 1, 9, 12], "execut": [0, 1, 6, 9, 11, 12, 13, 20, 24, 25, 26, 27, 28], "docker": [0, 1, 7, 9, 12, 24, 25], "properti": [0, 1, 4, 5, 9, 10, 12, 20], "container_arg": [0, 1, 12, 22], "get": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 19, 20, 21, 22, 24, 28], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 19, 21, 22, 25, 26, 27, 29], "specif": [0, 1, 4, 6, 9, 10, 12, 19, 20, 22, 23, 24, 25, 28, 29], "cli": [0, 1, 12], "argument": [0, 1, 12, 18, 21, 24, 26], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 24, 26, 27], "list": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 21, 22, 23, 24, 26, 27, 28], "ha": [0, 1, 4, 5, 7, 10, 11, 12, 23, 24, 25, 26, 27, 28], "state": [0, 1, 4, 8, 9, 11, 12, 19, 22, 25, 29], "init": [0, 1, 12], "fals": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 20, 21, 26, 27], "shellcommandtask": [0, 1, 3, 12, 22, 24, 25, 26, 27], "taskbas": [0, 1, 4, 6, 9, 11, 12, 24], "wrap": [0, 1, 4, 12], "element": [0, 1, 4, 10, 12, 21, 22, 23, 24, 26, 27, 28], "default_copy_col": [0, 1, 4, 12], "cmdline": [0, 1, 12, 22], "actual": [0, 1, 12], "line": [0, 1, 6, 9, 12, 24, 25], "submit": [0, 1, 12], "command_arg": [0, 1, 12, 22], "input_spec": [0, 1, 4, 6, 7, 9, 12, 22, 24, 26, 27], "output_spec": [0, 1, 4, 6, 7, 12, 26, 27], "submitt": [0, 1, 6, 22, 25], "plugin": [0, 1, 6, 11], "cf": [0, 1, 11], "object": [0, 1, 2, 4, 5, 6, 7, 9, 10, 11, 13, 18, 19, 21, 24, 26, 27], "send": [0, 1, 2, 11, 19], "backend": [0, 1, 11], "close": [0, 1, 6, 11, 13, 18], "previous": [0, 1, 5, 11, 21, 25], "run": [0, 1, 4, 5, 6, 7, 9, 10, 11, 13, 20, 22, 24, 25], "loop": [0, 1, 6, 11, 13, 25, 29], "async": [0, 1, 6, 11, 13], "expand_runn": [0, 1, 11], "runnabl": [0, 1, 5, 11, 13, 24, 28], "wait": [0, 1, 11], "rerun": [0, 1, 4, 6, 11, 12, 13, 22], "thi": [0, 1, 4, 5, 6, 7, 8, 9, 11, 13, 18, 20, 21, 23, 24, 25, 26, 27, 28], "coroutin": [0, 1, 6, 11, 13], "handl": [0, 1, 2, 11, 21, 22, 25], "expans": [0, 1, 11], "remov": [0, 1, 5, 7, 8, 10, 11, 22, 26, 27], "ani": [0, 1, 4, 5, 6, 7, 9, 11, 20, 21, 24, 25, 26, 27], "from": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28], "If": [0, 1, 2, 4, 6, 7, 11, 18, 21, 26, 27], "set": [0, 1, 4, 6, 7, 9, 10, 11, 13, 20, 21, 22, 23, 24, 25, 28], "default": [0, 1, 4, 9, 11, 18, 26, 27], "aggreg": [0, 1, 11, 26], "worker": [0, 1, 11, 22], "them": [0, 1, 4, 5, 6, 11, 22], "true": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 19, 21, 24, 26, 27], "complet": [0, 1, 11, 24], "error": [0, 1, 4, 6, 7, 8, 9, 11, 20, 22, 25, 26, 27], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 19, 20, 21, 24, 25, 28], "instanc": [0, 1, 4, 11, 21, 24], "bool": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 19, 21, 24, 26, 27], "await": [0, 1, 11, 13], "futur": [0, 1, 11, 13, 22], "befor": [0, 1, 4, 10, 11, 26], "expand_workflow": [0, 1, 11], "wf": [0, 1, 6, 9, 11, 22, 24], "expand": [0, 1, 11, 21, 22], "stateless": [0, 1, 11, 28], "method": [0, 1, 4, 5, 11, 22, 23, 24, 28], "reach": [0, 1, 11], "_run_task": [0, 1, 11], "comput": [0, 1, 4, 9, 11, 21, 25], "submit_from_cal": [0, 1, 11], "should": [0, 1, 7, 8, 9, 10, 11, 18, 21, 24, 26, 27], "call": [0, 1, 11, 18, 20, 23, 24, 25, 26, 28], "onc": [0, 1, 11, 21], "per": [0, 1, 11], "serv": [0, 1, 11, 24], "bridg": [0, 1, 11], "between": [0, 1, 5, 9, 10, 11, 21, 24, 25, 26], "sync": [0, 1, 11], "land": [0, 1, 11], "There": [0, 1, 11, 24, 26], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "4": [0, 1, 11, 19, 25], "potenti": [0, 1, 11, 21], "path": [0, 1, 4, 5, 6, 7, 9, 11, 12, 19, 21, 22, 26], "differ": [0, 1, 11, 24, 25, 27, 28], "than": [0, 1, 11, 24, 27], "without": [0, 1, 4, 5, 7, 10, 11, 24], "python": [0, 1, 6, 11, 12, 13, 18, 22, 24, 25, 26, 28], "10": [0, 1, 11], "minimum": [0, 1, 11], "probabl": [0, 1, 11], "refactor": [0, 1, 11, 22], "us": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28], "structur": [0, 1, 4, 5, 9, 11], "pattern": [0, 1, 11, 21], "match": [0, 1, 11, 21], "audit_flag": [0, 1, 2, 4, 12], "cache_dir": [0, 1, 4, 12], "cache_loc": [0, 1, 4, 6, 12, 22], "str": [0, 1, 4, 6, 7, 8, 9, 10, 12, 18, 19, 21, 24, 26, 27], "dict": [0, 1, 2, 4, 7, 10, 12, 18, 19, 21, 26], "specinfo": [0, 1, 4, 9, 12, 24, 26, 27], "cont_dim": [0, 1, 4, 8, 10, 12, 22], "messenger_arg": [0, 1, 2, 4, 12], "messeng": [0, 1, 2, 4, 12, 17], "basespec": [0, 1, 4, 9, 12], "propagate_rerun": [0, 1, 4, 22], "A": [0, 1, 2, 4, 5, 6, 9, 10, 13, 18, 19, 20, 21, 24, 26, 27, 28], "composit": [0, 1, 4], "graph": [0, 1, 4, 11, 19, 22, 24, 25, 28], "add": [0, 1, 4, 5, 22, 24], "ad": [0, 1, 4, 5, 8, 22, 24, 27, 29], "checksum": [0, 1, 4, 6, 22], "calcul": [0, 1, 4, 5, 10, 22], "uniqu": [0, 1, 4, 6, 7, 18, 19], "creat": [0, 1, 2, 4, 5, 6, 7, 8, 10, 16, 18, 22, 24, 25, 26, 27, 28], "directori": [0, 1, 2, 4, 6, 7, 12, 22, 24, 26], "node": [0, 1, 4, 5, 8, 9, 10, 12, 20, 22, 24, 25, 28], "need": [0, 1, 4, 5, 9, 10, 23, 28], "have": [0, 1, 4, 6, 7, 8, 10, 24, 27, 28], "input": [0, 1, 4, 5, 6, 7, 8, 9, 10, 22, 23, 24, 25, 27, 29], "etc": [0, 1, 4, 26], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 5, 24], "connect": [0, 1, 4, 5, 8, 10, 24], "particular": [0, 1, 2, 4, 9], "exist": [0, 1, 4, 24, 25, 26, 27], "add_edges_descript": [0, 1, 4, 5], "self": [0, 1, 2, 4, 5, 10], "descript": [0, 1, 4, 5, 22, 26, 27], "output": [0, 1, 2, 4, 5, 6, 7, 9, 10, 19, 22, 24, 25, 26, 28, 29], "field": [0, 1, 4, 5, 6, 7, 8, 9, 10, 21, 22, 23, 24, 27, 28, 29], "create_dotfil": [0, 1, 4, 22], "simpl": [0, 1, 4, 5, 22, 24, 26], "export": [0, 1, 4, 5], "output_dir": [0, 1, 4, 7, 9, 27], "dotfil": [0, 1, 4, 5, 22], "option": [0, 1, 2, 4, 9, 10, 19, 21, 24, 26, 28], "other": [0, 1, 4, 5, 8, 21, 22, 24, 25, 26, 27, 28], "format": [0, 1, 4, 5, 6, 19, 22], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 5, 6], "represent": [0, 1, 4, 10], "lzin": [0, 1, 4, 24], "set_output": [0, 1, 4, 24], "tupl": [0, 1, 4, 6, 7, 8, 9, 10, 12, 21, 22, 26, 27, 28], "lazyfield": [0, 1, 4, 9, 21], "link": [0, 1, 4, 5, 19, 26], "lazi": [0, 1, 4, 9, 24], "singl": [0, 1, 4, 6, 7, 10, 18, 19, 22, 23, 24], "packag": [0, 22, 24, 25], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 22], "boshtask": [0, 3, 22], "supported_copy_mod": [0, 4, 12], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 6, 8, 10, 22, 23, 24, 25, 26, 28], "done": [0, 4, 28], "generated_output_nam": [0, 4, 9], "get_input_el": [0, 4], "help": [0, 4, 24, 25], "lzout": [0, 4, 22, 24], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 6, 7, 9, 10, 22, 23, 24, 25], "set_stat": [0, 4], "split": [0, 4, 8, 9, 10, 12, 21, 23, 24, 28], "uid": [0, 4], "version": [0, 4, 21, 26], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "digraph": [0, 5], "add_edg": [0, 5], "add_nod": [0, 5], "calculate_max_path": [0, 5], "copi": [0, 5, 6, 7, 9, 12, 21, 22, 26, 28], "create_dotfile_detail": [0, 5], "create_dotfile_nest": [0, 5], "create_dotfile_simpl": [0, 5], "edg": [0, 5], "edges_nam": [0, 5], "export_graph": [0, 5], "nodes_detail": [0, 5], "nodes_names_map": [0, 5], "remove_nod": [0, 5], "remove_nodes_connect": [0, 5], "remove_previous_connect": [0, 5], "remove_successors_nod": [0, 5], "sorted_nod": [0, 5], "sorted_nodes_nam": [0, 5], "helper": [0, 1], "pydrafilelock": [0, 6], "allowed_values_valid": [0, 6], "argstr_format": [0, 6], "copyfile_workflow": [0, 6], "create_checksum": [0, 6], "ensure_list": [0, 6, 7], "from_list_if_singl": [0, 6], "gather_runtime_info": [0, 6], "get_available_cpu": [0, 6, 22], "get_open_loop": [0, 6], "load_and_run": [0, 6, 22], "load_and_run_async": [0, 6], "load_result": [0, 6], "load_task": [0, 6], "make_klass": [0, 6], "output_from_inputfield": [0, 6], "parse_copyfil": [0, 6], "position_sort": [0, 6], "print_help": [0, 6], "read_and_displai": [0, 6], "read_and_display_async": [0, 6], "read_stream_and_displai": [0, 6], "record_error": [0, 6], "save": [0, 6], "helpers_fil": [0, 1], "mountindentifi": [0, 7], "generate_cifs_t": [0, 7], "get_mount": [0, 7], "get_mount_t": [0, 7], "on_cif": [0, 7], "on_same_mount": [0, 7], "parse_mount_t": [0, 7], "patch_tabl": [0, 7], "copy_nested_fil": [0, 7], "is_contain": [0, 7], "is_local_fil": [0, 7], "template_upd": [0, 7, 9], "template_update_singl": [0, 7], "helpers_st": [0, 1], "pydrastateerror": [0, 8, 22], "add_name_combin": [0, 8], "add_name_splitt": [0, 8], "combine_final_group": [0, 8], "converter_groups_to_input": [0, 8], "flatten": [0, 8], "input_shap": [0, 8], "inputs_types_to_dict": [0, 8], "iter_split": [0, 8], "map_split": [0, 8], "remove_inp_from_splitter_rpn": [0, 8], "rpn2splitter": [0, 8], "splits_group": [0, 8], "splitter2rpn": [0, 8], "unwrap_splitt": [0, 8], "spec": [0, 1, 4, 6, 7, 8, 12, 21, 22, 27, 29], "check_fields_input_spec": [0, 9], "check_metadata": [0, 9], "collect_additional_output": [0, 9], "copyfile_input": [0, 9], "hash": [0, 9, 12, 17, 22, 24, 25], "retrieve_valu": [0, 9], "containerspec": [0, 9], "container_xarg": [0, 9], "imag": [0, 9, 24], "dockerspec": [0, 9], "functionspec": [0, 9], "cast": [0, 9], "cast_from": [0, 9], "sanitize_splitt": [0, 9], "lazyin": [0, 9], "lazyinfield": [0, 9], "attr_typ": [0, 9], "get_valu": [0, 9], "lazyinterfac": [0, 9], "lazyout": [0, 9], "lazyoutfield": [0, 9], "multiinputobj": [0, 9, 21, 26], "multioutputtyp": [0, 9], "get_output_field": [0, 9], "runtim": [0, 6, 9], "cpu_peak_perc": [0, 9], "rss_peak_gb": [0, 9], "vms_peak_gb": [0, 9], "runtimespec": [0, 9], "network": [0, 9], "outdir": [0, 5, 9], "shelloutspec": [0, 9, 27], "return_cod": [0, 9], "stderr": [0, 9, 27], "stdout": [0, 9, 27], "shellspec": [0, 9, 24, 26], "singularityspec": [0, 9], "statearrai": [0, 4, 9, 21], "taskhook": [0, 9], "post_run": [0, 9], "post_run_task": [0, 9], "pre_run": [0, 9], "pre_run_task": [0, 9], "reset": [0, 9], "attr_field": [0, 9], "donoth": [0, 9], "path_to_str": [0, 9], "splitter": [0, 4, 8, 9, 10, 22, 23, 24, 29], "splitter_rpn_compact": [0, 10], "splitter_rpn": [0, 8, 10], "splitter_fin": [0, 10], "other_st": [0, 8, 10], "inner_input": [0, 8, 10], "states_ind": [0, 10], "states_v": [0, 10], "inputs_ind": [0, 10], "group_for_input": [0, 8, 10], "group_for_inputs_fin": [0, 10], "groups_stack_fin": [0, 10], "final_combined_ind_map": [0, 10], "combiner_valid": [0, 10], "current_combin": [0, 10], "current_combiner_al": [0, 10], "current_splitt": [0, 10], "current_splitter_rpn": [0, 10], "prepare_input": [0, 10], "prepare_st": [0, 10], "prepare_states_combined_ind": [0, 10], "prepare_states_ind": [0, 10], "prepare_states_v": [0, 10], "prev_state_combin": [0, 10], "prev_state_combiner_al": [0, 10], "prev_state_splitt": [0, 10], "prev_state_splitter_rpn": [0, 10], "prev_state_splitter_rpn_compact": [0, 10], "set_input_group": [0, 10], "splitter_rpn_fin": [0, 10], "splitter_valid": [0, 10], "update_connect": [0, 10], "get_runnable_task": [0, 11], "is_runn": [0, 11], "prepare_runnable_with_st": [0, 11], "bind_path": [0, 12], "bind": [0, 12, 22], "container_check": [0, 12], "functiontask": [0, 12, 14, 15, 22, 24], "singularitytask": [0, 12, 22, 24], "split_cmd": [0, 12], "concurrentfutureswork": [0, 13], "exec_as_coro": [0, 13], "run_el": [0, 13], "daskwork": [0, 13], "exec_dask": [0, 13], "distributedwork": [0, 13], "fetch_finish": [0, 13], "max_job": [0, 13], "sgework": [0, 13], "check_for_results_fil": [0, 13], "get_output_by_task_pkl": [0, 13], "get_tasks_to_run": [0, 13], "submit_array_job": [0, 13], "serialwork": [0, 13], "exec_seri": [0, 13], "slurmwork": [0, 13], "mark": [0, 5, 24], "annot": [0, 14, 15, 21, 24], "function": [0, 7, 8, 9, 14, 18, 20, 21, 22, 25, 26, 27, 29], "bytes_repr_mapping_cont": [0, 18], "bytes_repr_sequence_cont": [0, 18], "hash_funct": [0, 18], "hash_object": [0, 18], "hash_singl": [0, 18], "register_seri": [0, 18], "filemesseng": [0, 19], "printmesseng": [0, 19], "remoterestmesseng": [0, 19], "runtimehook": [0, 19], "resource_monitor_post_stop": [0, 19], "resource_monitor_pre_start": [0, 19], "task_execute_post_exit": [0, 19], "task_execute_pre_entri": [0, 19], "task_run_entri": [0, 19], "task_run_exit": [0, 19], "collect_messag": [0, 19], "gen_uuid": [0, 19], "make_messag": [0, 19], "now": [0, 19, 22, 24], "send_messag": [0, 19], "profil": [0, 17], "resourcemonitor": [0, 20], "fname": [0, 6, 20], "stop": [0, 20], "get_max_resources_us": [0, 20], "get_system_total_memory_gb": [0, 20], "log_nodes_cb": [0, 20], "typepars": [0, 21], "coercible_default": [0, 21], "not_coercible_default": [0, 21], "apply_to_inst": [0, 21], "check_coerc": [0, 21], "check_typ": [0, 21], "coerc": [0, 21], "coercibl": [0, 21], "contains_typ": [0, 21], "get_arg": [0, 21], "get_item_typ": [0, 21], "get_origin": [0, 21], "is_inst": [0, 21], "is_subclass": [0, 21], "matches_typ": [0, 21], "not_coerc": [0, 21], "strip_split": [0, 21], "tp": [0, 21], "keep": [2, 9, 10, 20, 21], "inform": [2, 6, 10, 19, 26, 27], "develop": [2, 25], "determin": [2, 7, 10], "whether": [2, 4, 7, 13, 21], "enabl": [2, 7, 21, 22, 25, 26], "obj": [2, 4, 5, 6, 11, 18, 19, 21], "check": [2, 4, 5, 6, 7, 9, 11, 21, 22, 26], "boolean": 2, "AND": 2, "oudit_flag": 2, "messag": [2, 19, 25], "json": [2, 12, 19, 20, 25], "ld": [2, 19, 25], "sent": [2, 26, 27], "end": [2, 8, 18, 20, 28], "odir": 2, "record": [2, 19, 20], "until": [2, 6, 13], "case": [2, 6, 24], "insid": [2, 26], "o": [2, 6, 7, 9, 19, 21, 22, 26], "pathlik": [2, 6, 7, 19, 21], "descriptor": [3, 22], "basic": [4, 9, 21, 23, 24], "process": [4, 6, 9, 10, 12, 19, 20, 22], "file": [4, 6, 7, 9, 12, 19, 20, 21, 22, 24, 25, 26, 27], "gener": [4, 6, 8, 9, 18, 19, 21, 24, 25], "step": 4, "which": [4, 5, 6, 7, 8, 10, 18, 21], "both": [4, 24], "elemntari": 4, "inherit": [4, 9, 24], "15": 4, "what": 4, "avail": [4, 6, 9, 10, 22], "locat": 4, "cach": [4, 6, 18, 21, 25], "sourc": [4, 21, 25], "accept": [4, 18, 20, 22], "checkpoint": 4, "restart": 4, "state_index": [4, 9], "replac": [4, 9], "recreat": 4, "todo": [4, 6, 9, 19], "overwrit": 4, "parameter": 4, "one": [4, 8, 9, 13, 21, 23, 24, 26, 28], "more": [4, 21, 22, 24, 26, 28], "previou": [4, 8, 10, 23, 26], "an": [4, 6, 7, 9, 13, 18, 21, 22, 23, 24, 25, 26, 27, 28], "thei": [4, 5, 6, 18, 21, 23, 28], "provid": [4, 6, 8, 9, 21, 23, 24, 25, 26, 27, 28], "refer": [4, 5, 9, 21], "been": [4, 25], "final": [4, 8, 10, 13, 18, 21, 23], "store": [4, 25], "rais": [4, 21, 22, 27], "doesn": [4, 10, 26], "t": [4, 9, 10, 21, 22, 26], "depend": [4, 8, 10, 21], "ind": [4, 6], "collect": [4, 6, 16, 19, 25], "requir": [4, 7, 8, 9, 21, 22, 24, 25, 26, 27, 28], "returnhelp": 4, "print": [4, 6, 19], "filesystem": [4, 7, 12], "where": [4, 6, 21, 23, 25, 28], "written": [4, 7, 23, 25], "": [4, 6, 8, 10, 13, 19, 22, 26, 27, 28, 29], "everyth": 4, "see": [4, 5, 9, 21, 27], "pickl": [4, 6, 22], "full": [4, 10, 22, 23, 26], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 6, 7, 9, 14, 15, 19, 20, 21, 26], "index": [4, 6, 9, 25], "multipl": [4, 7, 9, 18, 21, 22, 23, 26, 28], "val": [4, 8], "togeth": [4, 10, 23, 25, 26, 27], "indic": [4, 10, 22], "parametr": 4, "over": [4, 8, 9, 10, 24, 25, 29], "interpret": 4, "outer": [4, 10, 21, 23, 29], "product": 4, "inner": [4, 10, 21, 22, 23], "taken": 4, "keyword": 4, "dimens": [4, 8, 10], "assum": [4, 7, 8, 28], "so": [4, 18, 20, 22, 24, 28], "most": [4, 24, 28], "dim": 4, "split_input": 4, "automat": [4, 24], "pass": [4, 7, 21, 22, 23, 24, 25, 26, 27], "id": [4, 20], "number": [4, 6, 8, 10, 13, 21, 22], "slurm": [4, 13, 22], "script": [4, 24], "look": [4, 6], "like": [4, 24], "data": [5, 6, 9, 28], "support": [5, 6, 7, 21, 22, 23, 24, 25, 26, 28], "direct": [5, 24, 25], "new_edg": 5, "new": [5, 6, 7, 9, 10, 20, 25, 27, 29], "new_edge_detail": 5, "fill": 5, "_nodes_detail": 5, "new_nod": 5, "insert": [5, 26], "maximum": [5, 13], "histori": 5, "predecessor": 5, "duplic": 5, "dictionari": [5, 8, 10, 18, 19, 20, 26, 27], "same": [5, 7, 9, 10, 18, 21, 23, 27, 28], "graph_det": 5, "nest": [5, 7, 21, 22, 24, 25, 29], "includ": [5, 10, 18, 24, 26, 27], "pair": [5, 7, 8, 21], "ext": 5, "png": 5, "equir": 5, "dot": [5, 22], "current": [5, 6, 10, 22], "each": [5, 8, 10, 21, 23, 24, 25, 26, 27, 28], "check_readi": 5, "re": [5, 10], "doe": [5, 20, 26, 28], "remove_node_connect": 5, "_node_wip": 5, "when": [5, 7, 8, 9, 10, 19, 22, 23, 24, 28], "readi": 5, "also": [5, 9, 10, 22, 23, 26, 28], "prune": 5, "follow": [5, 6, 18, 23, 24, 28], "presort": 5, "either": [5, 7, 21], "administr": 6, "framework": [6, 25], "lockfil": 6, "wrapper": [6, 13], "filelock": 6, "softfilelock": 6, "make": [6, 23, 25], "work": [6, 12, 22, 24, 25, 28], "asyncio": [6, 13], "_": 6, "attribut": [6, 22, 24, 28], "allowed_valu": [6, 26], "argstr": [6, 24, 26], "value_upd": 6, "field_nam": [6, 9], "updat": [6, 7, 9, 10, 14, 15, 22], "wf_path": 6, "given": [6, 7, 9, 20, 21], "string": [6, 7, 9, 12, 18, 20, 26], "tuple2list": 6, "whatev": 6, "exampl": [6, 14, 15, 18, 21, 23, 24, 26, 27, 28], "abc": 6, "b": [6, 8, 10, 18, 21], "c": [6, 8, 23, 25], "5": [6, 19, 20, 24, 25], "cmd": [6, 12], "strip": [6, 21], "event": 6, "unless": [6, 26, 27], "alreadi": [6, 7, 22], "convert": [6, 8, 9, 21, 22, 24, 26], "item": [6, 7, 21], "length": [6, 7, 8, 28], "extract": [6, 24], "cpu": [6, 9, 22], "total": [6, 20], "system": [6, 7, 12, 13, 20, 22], "n_proc": [6, 13], "eventloop": 6, "task_pkl": [6, 13], "load": [6, 22], "proper": [6, 22], "restor": 6, "identifi": [6, 7, 18, 19], "order": [6, 7, 10, 23, 24, 26, 27, 28], "prioriti": 6, "names_onli": 6, "fld": 6, "default_col": 6, "copycol": 6, "mode": [6, 12, 22], "copyfil": [6, 26], "posit": [6, 24, 26], "convent": [6, 18], "lowest": 6, "highest": 6, "unspecifi": 6, "neg": [6, 26], "d": 6, "e": [6, 7, 8, 9, 10, 18, 19, 21, 23, 24, 26, 27, 28], "f": [6, 7, 18], "visit": 6, "its": [6, 28], "interfac": [6, 10, 13, 22, 25], "hide_displai": 6, "captur": [6, 25], "standard": [6, 8, 9, 19], "displai": 6, "arriv": 6, "stream": 6, "read": [6, 7, 12, 22], "eof": 6, "discuss": 6, "stackoverflow": 6, "error_path": 6, "write": [6, 12, 19], "task_path": 6, "name_prefix": 6, "port": 7, "after": [7, 10, 23, 24, 28], "part": [7, 10, 12, 18, 21, 25, 26, 27], "were": [7, 22, 25], "relat": [7, 10, 28], "py2": 7, "mount": [7, 12], "resid": 7, "featur": [7, 24, 25, 28], "can": [7, 8, 9, 10, 18, 21, 22, 23, 24, 25, 26, 27, 28], "g": [7, 9, 10, 18, 21, 24, 26, 27], "symlink": 7, "classmethod": [7, 9, 21], "construct": [7, 18, 24, 25], "revers": [7, 8, 26], "point": [7, 9, 12, 19, 24], "fall": 7, "under": 7, "cif": 7, "precomput": 7, "allow": [7, 19, 22, 23, 24, 25, 26], "effici": 7, "would": [7, 23, 28], "On": 7, "empti": [7, 22, 26], "mount_point": 7, "root": 7, "sit": 7, "fstype": 7, "ext4": 7, "posix": 7, "host": 7, "window": [7, 22], "through": [7, 28], "share": [7, 24, 25], "minshal": 7, "french": 7, "text": 7, "driver": 7, "expos": 7, "we": [7, 24, 26], "found": [7, 21], "concurr": [7, 13, 22], "access": [7, 9], "failur": [7, 22], "recent": 7, "lead": 7, "inconsist": 7, "behavior": 7, "filenotfounderror": 7, "disabl": [7, 26], "nb": 7, "sub": [7, 18, 21], "filemanip": 7, "adapt": [7, 22], "http": 7, "github": 7, "com": 7, "nipi": 7, "path1": 7, "path2": 7, "two": [7, 23, 24, 28], "logic": 7, "exit_cod": 7, "pars": [7, 9, 11], "produc": [7, 18], "fs_type": 7, "separ": [7, 12, 16, 22, 24, 26, 27], "_generate_cifs_t": 7, "test": [7, 13, 22], "real": 7, "mount_tabl": 7, "patch": 7, "tabl": 7, "routin": 7, "dest_dir": 7, "supported_mod": 7, "copymod": 7, "within": [7, 11, 21, 23, 24], "destin": 7, "origin": [7, 8, 12, 25, 28], "note": [7, 23, 24, 25], "differenti": [7, 9], "parent": [7, 24, 26, 27], "otherwis": [7, 20, 27], "clash": 7, "directli": [7, 18, 24], "onto": 7, "fileset": 7, "filenam": [7, 20], "state_ind": 7, "map_copyfil": 7, "templat": [7, 9, 16, 22, 24, 26, 27], "present": 7, "inputs_dict_st": 7, "spec_typ": 7, "inputs_dict": 7, "output_file_templ": [7, 24, 26, 27], "addit": [8, 9, 23, 24, 25, 26, 27, 28], "mostli": 8, "except": [8, 21, 22], "custom": [8, 18, 22, 24, 26, 27], "group": [8, 10, 24, 25, 29], "groups_stack": 8, "kei": [8, 10, 18, 24, 25, 26, 28], "axi": [8, 10], "ax": [8, 10], "specifi": [8, 10, 12, 21, 22, 23, 24, 26, 27], "cur_depth": 8, "max_depth": 8, "inp": [8, 10], "shape": 8, "iter": [8, 9, 18, 21], "split_it": 8, "prescrib": 8, "inputs_to_remov": 8, "due": [8, 10], "mutat": 8, "polish": 8, "notat": [8, 10], "recurr": 8, "algorithm": [8, 25], "perform": [8, 20, 21, 28], "convers": [8, 26], "everi": [8, 10, 26], "time": [8, 9, 25], "stack": [8, 10], "state_field": [8, 10], "translat": 8, "user": [8, 18, 22, 23, 24, 25, 26, 27, 28], "impos": 8, "unwrap": [8, 10], "flat": 8, "ty": [8, 9, 21], "dataclass": [9, 22], "medatada": 9, "xor": [9, 26], "fulfil": 9, "mandatori": [9, 24, 26, 27], "metadata": [9, 24, 29], "refin": 9, "invok": 9, "_noth": 9, "noth": [9, 22, 26, 27], "implement": [9, 12, 13, 18, 22, 25], "promis": 9, "new_typ": 9, "cast_field": 9, "strip_previ": 9, "consist": [9, 25], "arrai": [9, 22], "sequenc": [9, 18, 21], "signifi": 9, "across": [9, 18], "append": [9, 19], "frozenset": 9, "resolv": 9, "regard": 9, "float": [9, 14, 15, 20, 21, 24, 26], "repres": [9, 10, 23, 24, 25, 26, 28], "peak": 9, "consumpt": 9, "physic": 9, "ram": [9, 20], "virtual": 9, "memori": [9, 20, 22], "cwl": 9, "inlinejavascriptrequir": 9, "schemadefrequir": 9, "dockerrequir": 9, "softwarerequir": 9, "initialworkdirrequir": 9, "envvarrequir": 9, "shellcommandrequir": 9, "resourcerequir": 9, "inlinescriptrequir": 9, "take": [9, 23, 26, 27], "account": 9, "exit": 9, "code": [9, 19, 22, 25], "singular": [9, 12, 22, 24, 25], "least": 9, "callabl": [9, 12, 21, 27], "hook": [9, 19], "exclude_nam": 9, "reduc": [10, 24, 25, 28], "about": [10, 26, 27], "scalar": [10, 29], "rpn": 10, "compact": [10, 19], "_na": 10, "import": [10, 14, 15, 18, 23, 24], "relev": 10, "could": [10, 26], "partial": [10, 25], "associ": [10, 25], "valid": [10, 22, 29], "correct": 10, "propag": 10, "explicitli": [10, 21], "had": 10, "prepar": 10, "merg": [10, 28], "elements_to_remove_comb": 10, "hlpst": 10, "evalu": [10, 28], "prev": 10, "come": 10, "art": 10, "_nb": 10, "especi": 10, "address": [10, 25], "variabl": [10, 12, 22], "new_other_st": 10, "new_combin": 10, "environ": [12, 24], "neurodock": 12, "conda": 12, "env": 12, "niceman": 12, "config": 12, "intern": [12, 13, 20], "extern": [12, 25], "callback": [12, 20], "resum": 12, "dmtcp": 12, "local": [12, 18, 26], "fragment": 12, "remot": [12, 19], "server": 12, "isol": 12, "13": 12, "bound": 12, "opt": 12, "py": [12, 13], "meth": 12, "container_typ": 12, "func": [12, 14, 15, 18, 21], "respect": [12, 24], "quot": 12, "thereof": 12, "parallel": 13, "pool": 13, "dask": [13, 22], "distribut": [13, 22, 25], "experiment": [13, 22], "limit": [13, 21, 22, 24], "finish": 13, "submiss": 13, "attr": [13, 21, 22, 26, 27], "pend": 13, "job": 13, "poll_delai": 13, "qsub_arg": 13, "write_output_fil": 13, "max_job_array_length": 13, "50": 13, "indirect_submit_host": 13, "max_thread": 13, "poll_for_result_fil": 13, "default_threads_per_task": 13, "polls_before_checking_evict": 13, "60": 13, "collect_jobs_delai": 13, "30": 13, "default_qsub_arg": 13, "max_mem_fre": 13, "jobid": 13, "threads_request": 13, "task_qsub_arg": 13, "mem_fre": 13, "api": [13, 22, 25], "sarg": 13, "tasks_to_run": 13, "error_fil": 13, "linearli": 13, "sbatch_arg": 13, "def": [14, 15, 18, 24], "squar": [14, 15, 28], "promot": [14, 15], "decor": [15, 24, 25], "appli": [15, 21, 23], "namespac": [16, 22], "reserv": 16, "manag": [16, 22, 28], "To": 16, "pleas": 16, "fork": 16, "dispatch": 18, "byte": 18, "serial": 18, "content": 18, "concaten": 18, "seq": 18, "m": [18, 24, 26], "recurs": 18, "regist": 18, "scope": 18, "prevent": 18, "infinit": 18, "unsaf": 18, "reus": [18, 25], "cl": [18, 21], "yield": 18, "recommend": 18, "qualifi": 18, "prefix": 18, "colon": 18, "open": [18, 19, 25], "bracket": [18, 28], "mai": [18, 23, 25], "consid": [18, 20, 26], "These": [18, 23, 24, 25, 28], "As": [18, 24, 26, 27], "defin": [18, 21, 24], "bytes_repr": 18, "__class__": 18, "__module__": 18, "__name__": 18, "encod": 18, "__dict__": 18, "must": 18, "permit": 18, "redirect": 19, "truncat": 19, "abstract": 19, "rest": 19, "endpoint": 19, "statu": [19, 20], "request": 19, "post": 19, "intenum": 19, "6": [19, 25], "collected_path": 19, "message_path": 19, "ld_op": 19, "compil": 19, "place": 19, "pld": 19, "jsonld": 19, "context": 19, "build": [19, 25, 26, 27], "non": 19, "timestamp": 19, "nidm": 19, "log": [19, 20], "pid": 20, "interv": 20, "logdir": 20, "thread": 20, "certain": 20, "frequenc": 20, "mem_mb": 20, "num_thread": 20, "pyfunc": 20, "integ": [20, 26], "high": 20, "watermark": 20, "far": 20, "dure": 20, "mb": 20, "gb": 20, "statist": [20, 24], "pipelin": [20, 25], "being": [20, 25], "info": 20, "logger": 20, "pathlib": 21, "criteria": 21, "initialis": [21, 24], "checker": 21, "against": 21, "correspond": 21, "appear": 21, "tree": 21, "complex": [21, 24, 26, 28], "exclud": 21, "overrid": 21, "you": [21, 26, 27], "carv": 21, "out": [21, 23, 24], "target_typ": 21, "modif": 21, "repeat": 21, "target": 21, "guard": 21, "modifi": 21, "coercion": 21, "rule": 21, "typeerror": 21, "cannot": 21, "explicit": 21, "inclus": 21, "exclus": [21, 26], "member": 21, "type_": 21, "subtyp": 21, "object_": 21, "attempt": 21, "static": 21, "substitut": 21, "For": 21, "union": [21, 26], "simplif": 21, "constructor": 21, "typevar": 21, "assert": 21, "sequence_typ": 21, "find": 21, "item_typ": 21, "unsubscript": 21, "liter": 21, "classvar": 21, "unsupport": 21, "p": 21, "paramspec": 21, "42": 21, "candid": 21, "built": 21, "isinst": 21, "klass": 21, "any_ok": 21, "subclass": [21, 24], "issubclass": 21, "__init__": 21, "factor": 21, "outsid": 21, "depth": [21, 25], "wa": [21, 25, 26, 27, 28], "only_split": 21, "inner_typ": 21, "fix": 22, "issu": 22, "extens": [22, 26, 27], "guid": [22, 25], "docstr": 22, "messang": 22, "syntax": [22, 24, 26, 27, 28], "newer": 22, "padra": 22, "improv": [22, 24], "better": 22, "switch": 22, "pkg_resourc": 22, "declare_namespac": 22, "stdlib": 22, "pkgutil": 22, "extend_path": 22, "move": 22, "readm": 22, "rst": 22, "declar": [22, 24], "ensur": [22, 25], "edit": 22, "instal": 22, "conflict": 22, "mention": [22, 26, 27], "txt": 22, "tutori": 22, "repo": 22, "codecov": 22, "_connect": 22, "numpi": [22, 24], "to_job": 22, "instead": [22, 27], "kept": 22, "standalon": [22, 24, 25], "create_pyscript": 22, "simplifi": 22, "report": 22, "fli": 22, "make_class": 22, "properli": 22, "hash_dir": 22, "azur": 22, "ci": 22, "etelementri": 22, "verbos": 22, "reorgan": 22, "small": 22, "some": [22, 25], "osx": 22, "sto": 22, "travi": 22, "right": 22, "test_rerun": 22, "dimension": [22, 23], "how": [22, 24], "much": 22, "sphinx": 22, "document": 22, "contribut": 22, "md": 22, "fail": 22, "big": 22, "chang": [22, 26, 27], "shelltask": 22, "next": [22, 24, 28], "all_": 22, "dataflow": [22, 23, 28, 29], "creation": 22, "notebook": 22, "concept": [22, 23, 24, 25, 28], "initi": 22, "In": [23, 24, 25, 26, 27, 28], "achiev": 23, "sens": 23, "x": [23, 24, 28], "x_1": [23, 28], "x_2": [23, 28], "x_n": [23, 28], "mapsto": [23, 28], "out_": 23, "comb": 23, "x_i": 23, "situat": 23, "variou": 23, "wai": [23, 28], "section": [23, 24, 26, 27, 28], "might": [23, 24, 25], "want": [23, 26, 27], "y": [23, 24, 28], "y1": 23, "y2": 23, "y_m": [23, 28], "longmapsto": [23, 28], "y_1": [23, 28], "howev": [23, 26], "One": [23, 24, 28], "mix": 23, "level": 23, "describ": [24, 26, 28], "thu": 24, "dual": 24, "sever": [24, 25, 26], "applic": [24, 25, 28], "librari": [24, 25], "interact": [24, 25], "termin": 24, "np": 24, "fft": 24, "ndarrai": 24, "fft_task": 24, "random": 24, "rand": 24, "512": 24, "anoth": [24, 25], "arbitrari": [24, 25, 28], "mean": [24, 27], "std": 24, "mean_dev": 24, "my_data": 24, "st": 24, "stdev": 24, "facilit": [24, 25], "downstream": 24, "pwd": 24, "l": 24, "my_dir": 24, "accommod": 24, "fsl": [24, 25], "bet": [24, 26], "brain": 24, "tool": [24, 25], "input_fil": 24, "output_fil": 24, "treat": [24, 26], "shown": 24, "even": 24, "out_fil": [24, 26], "bet_input_spec": [24, 26], "in_fil": [24, 26], "help_str": [24, 26, 27], "_br": [24, 26], "mask": [24, 26], "binari": [24, 26], "child": 24, "softwar": [24, 25], "extrem": 24, "project": [24, 25], "encapsul": 24, "technologi": 24, "scientif": [24, 25], "reproduc": [24, 25], "behind": [24, 25], "equival": 24, "busybox": 24, "act": 24, "hashabl": 24, "unit": 24, "unlik": 24, "emb": 24, "acycl": [24, 25], "simpli": 24, "special": [24, 26, 28], "assign": 24, "rather": 24, "mult": 24, "mlt": 24, "add2": 24, "control": [24, 28], "heart": 24, "power": [24, 25], "formal": 24, "Its": 24, "recombin": [24, 25], "task_with_st": 24, "respons": 24, "back": 24, "while": [24, 25], "illustr": 24, "scalabl": 24, "lightweight": 25, "neuroimag": 25, "commun": 25, "design": 25, "purpos": 25, "domain": 25, "often": 25, "sophist": 25, "analys": 25, "encompass": 25, "larg": 25, "necessarili": 25, "author": 25, "program": 25, "common": 25, "practic": 25, "semi": 25, "manual": 25, "scientist": 25, "approach": 25, "conceptu": 25, "easi": 25, "consum": 25, "prone": 25, "difficult": 25, "demand": 25, "organ": 25, "fulli": 25, "autom": 25, "motiv": 25, "second": [25, 28], "uniform": 25, "compon": [25, 29], "born": 25, "decad": 25, "ant": 25, "afni": 25, "freesurf": 25, "spm": 25, "flexibl": [25, 28], "made": 25, "ideal": 25, "basi": 25, "popular": 25, "preprocess": 25, "fmriprep": 25, "pac": 25, "meant": 25, "eas": 25, "mind": 25, "itself": 25, "goal": [25, 28], "manipul": 25, "well": 25, "reusabl": 25, "customiz": 25, "compos": 25, "encourag": 25, "similar": [25, 28], "model": 25, "global": 25, "alongsid": 25, "integr": 25, "nativ": 25, "via": 25, "greater": 25, "mechan": 25, "activ": 25, "releas": 25, "8": 25, "7": 25, "programm": 25, "subpackag": 25, "search": 25, "page": 25, "let": 26, "alwai": [26, 27], "think": [26, 27], "usual": [26, 27], "top": [26, 27], "your": [26, 27], "cover": [26, 27], "customis": [26, 27], "three": [26, 27], "But": 26, "below": 26, "field1": 26, "field1_nam": 26, "ib": [26, 27], "field1_typ": 26, "shorter": 26, "abov": 26, "multioutputobj": 26, "short": [26, 27], "sep": 26, "v": 26, "inp_field": 26, "nonneg": 26, "mutual": 26, "hard": 26, "possibl": [26, 27], "container_path": 26, "file1": [26, 27], "output_field_nam": [26, 27], "keep_extens": [26, 27], "readonli": 26, "flda": 26, "fldb": 26, "formatt": 26, "entir": [26, 27], "allowev_valu": 26, "set_input_valid": 26, "out1": 27, "inp1": [27, 28], "inp2": [27, 28], "similarli": 27, "recogn": 27, "main": 28, "distinguish": 28, "typic": 28, "involv": 28, "signific": 28, "overhead": 28, "up": 28, "simplest": 28, "therefor": 28, "diagram": 28, "colour": 28, "whenev": 28, "complic": 28, "wise": 28, "parenthesi": 28, "y_2": 28, "y_n": 28, "schemat": 28, "inp3": 28, "pairwis": 28, "explain": 28}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "DockerTask"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [14, 0, 0, "-", "mark"], [16, 0, 0, "-", "tasks"], [17, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.DockerTask": [[0, 3, 1, "", "container_args"], [0, 2, 1, "", "init"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 3, 1, "", "command_args"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "DockerTask"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "graph"], [6, 0, 0, "-", "helpers"], [7, 0, 0, "-", "helpers_file"], [8, 0, 0, "-", "helpers_state"], [9, 0, 0, "-", "specs"], [10, 0, 0, "-", "state"], [11, 0, 0, "-", "submitter"], [12, 0, 0, "-", "task"], [13, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.DockerTask": [[1, 3, 1, "", "container_args"], [1, 2, 1, "", "init"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 3, 1, "", "command_args"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.graph": [[5, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[5, 4, 1, "", "add_edges"], [5, 4, 1, "", "add_edges_description"], [5, 4, 1, "", "add_nodes"], [5, 4, 1, "", "calculate_max_paths"], [5, 4, 1, "", "copy"], [5, 4, 1, "", "create_dotfile_detailed"], [5, 4, 1, "", "create_dotfile_nested"], [5, 4, 1, "", "create_dotfile_simple"], [5, 3, 1, "", "edges"], [5, 3, 1, "", "edges_names"], [5, 4, 1, "", "export_graph"], [5, 3, 1, "", "nodes"], [5, 3, 1, "", "nodes_details"], [5, 3, 1, "", "nodes_names_map"], [5, 4, 1, "", "remove_nodes"], [5, 4, 1, "", "remove_nodes_connections"], [5, 4, 1, "", "remove_previous_connections"], [5, 4, 1, "", "remove_successors_nodes"], [5, 3, 1, "", "sorted_nodes"], [5, 3, 1, "", "sorted_nodes_names"], [5, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[6, 1, 1, "", "PydraFileLock"], [6, 5, 1, "", "allowed_values_validator"], [6, 5, 1, "", "argstr_formatting"], [6, 5, 1, "", "copyfile_workflow"], [6, 5, 1, "", "create_checksum"], [6, 5, 1, "", "ensure_list"], [6, 5, 1, "", "execute"], [6, 5, 1, "", "from_list_if_single"], [6, 5, 1, "", "gather_runtime_info"], [6, 5, 1, "", "get_available_cpus"], [6, 5, 1, "", "get_open_loop"], [6, 5, 1, "", "load_and_run"], [6, 5, 1, "", "load_and_run_async"], [6, 5, 1, "", "load_result"], [6, 5, 1, "", "load_task"], [6, 5, 1, "", "make_klass"], [6, 5, 1, "", "output_from_inputfields"], [6, 5, 1, "", "parse_copyfile"], [6, 5, 1, "", "position_sort"], [6, 5, 1, "", "print_help"], [6, 5, 1, "", "read_and_display"], [6, 5, 1, "", "read_and_display_async"], [6, 5, 1, "", "read_stream_and_display"], [6, 5, 1, "", "record_error"], [6, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[7, 1, 1, "", "MountIndentifier"], [7, 5, 1, "", "copy_nested_files"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "is_container"], [7, 5, 1, "", "is_local_file"], [7, 5, 1, "", "template_update"], [7, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[7, 4, 1, "", "generate_cifs_table"], [7, 4, 1, "", "get_mount"], [7, 4, 1, "", "get_mount_table"], [7, 4, 1, "", "on_cifs"], [7, 4, 1, "", "on_same_mount"], [7, 4, 1, "", "parse_mount_table"], [7, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[8, 6, 1, "", "PydraStateError"], [8, 5, 1, "", "add_name_combiner"], [8, 5, 1, "", "add_name_splitter"], [8, 5, 1, "", "combine_final_groups"], [8, 5, 1, "", "converter_groups_to_input"], [8, 5, 1, "", "flatten"], [8, 5, 1, "", "input_shape"], [8, 5, 1, "", "inputs_types_to_dict"], [8, 5, 1, "", "iter_splits"], [8, 5, 1, "", "map_splits"], [8, 5, 1, "", "remove_inp_from_splitter_rpn"], [8, 5, 1, "", "rpn2splitter"], [8, 5, 1, "", "splits_groups"], [8, 5, 1, "", "splitter2rpn"], [8, 5, 1, "", "unwrap_splitter"]], "pydra.engine.specs": [[9, 1, 1, "", "BaseSpec"], [9, 1, 1, "", "ContainerSpec"], [9, 1, 1, "", "DockerSpec"], [9, 1, 1, "", "FunctionSpec"], [9, 1, 1, "", "LazyField"], [9, 1, 1, "", "LazyIn"], [9, 1, 1, "", "LazyInField"], [9, 1, 1, "", "LazyInterface"], [9, 1, 1, "", "LazyOut"], [9, 1, 1, "", "LazyOutField"], [9, 1, 1, "", "MultiInputObj"], [9, 1, 1, "", "MultiOutputType"], [9, 1, 1, "", "Result"], [9, 1, 1, "", "Runtime"], [9, 1, 1, "", "RuntimeSpec"], [9, 1, 1, "", "ShellOutSpec"], [9, 1, 1, "", "ShellSpec"], [9, 1, 1, "", "SingularitySpec"], [9, 1, 1, "", "SpecInfo"], [9, 1, 1, "", "StateArray"], [9, 1, 1, "", "TaskHook"], [9, 5, 1, "", "attr_fields"], [9, 5, 1, "", "donothing"], [9, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[9, 4, 1, "", "check_fields_input_spec"], [9, 4, 1, "", "check_metadata"], [9, 4, 1, "", "collect_additional_outputs"], [9, 4, 1, "", "copyfile_input"], [9, 3, 1, "", "hash"], [9, 4, 1, "", "retrieve_values"], [9, 4, 1, "", "template_update"]], "pydra.engine.specs.ContainerSpec": [[9, 2, 1, "", "container"], [9, 2, 1, "", "container_xargs"], [9, 2, 1, "", "image"]], "pydra.engine.specs.DockerSpec": [[9, 2, 1, "", "container"]], "pydra.engine.specs.FunctionSpec": [[9, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[9, 4, 1, "", "cast"], [9, 2, 1, "", "cast_from"], [9, 2, 1, "", "field"], [9, 2, 1, "", "name"], [9, 4, 1, "", "sanitize_splitter"], [9, 4, 1, "", "split"], [9, 2, 1, "", "splits"], [9, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[9, 2, 1, "", "attr_type"], [9, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[9, 2, 1, "", "attr_type"], [9, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[9, 2, 1, "", "errored"], [9, 4, 1, "", "get_output_field"], [9, 2, 1, "", "output"], [9, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[9, 2, 1, "", "cpu_peak_percent"], [9, 2, 1, "", "rss_peak_gb"], [9, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[9, 2, 1, "", "container"], [9, 2, 1, "", "network"], [9, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[9, 4, 1, "", "collect_additional_outputs"], [9, 4, 1, "", "generated_output_names"], [9, 2, 1, "", "return_code"], [9, 2, 1, "", "stderr"], [9, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[9, 2, 1, "", "args"], [9, 4, 1, "", "check_metadata"], [9, 2, 1, "", "executable"], [9, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SingularitySpec": [[9, 2, 1, "", "container"]], "pydra.engine.specs.SpecInfo": [[9, 2, 1, "", "bases"], [9, 2, 1, "", "fields"], [9, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[9, 2, 1, "", "post_run"], [9, 2, 1, "", "post_run_task"], [9, 2, 1, "", "pre_run"], [9, 2, 1, "", "pre_run_task"], [9, 4, 1, "", "reset"]], "pydra.engine.state": [[10, 1, 1, "", "State"]], "pydra.engine.state.State": [[10, 3, 1, "id0", "combiner"], [10, 4, 1, "", "combiner_validation"], [10, 3, 1, "", "current_combiner"], [10, 3, 1, "", "current_combiner_all"], [10, 3, 1, "", "current_splitter"], [10, 3, 1, "", "current_splitter_rpn"], [10, 2, 1, "", "final_combined_ind_mapping"], [10, 2, 1, "", "group_for_inputs"], [10, 2, 1, "", "group_for_inputs_final"], [10, 2, 1, "", "groups_stack_final"], [10, 3, 1, "id1", "inner_inputs"], [10, 2, 1, "", "inputs_ind"], [10, 2, 1, "", "name"], [10, 3, 1, "id2", "other_states"], [10, 4, 1, "", "prepare_inputs"], [10, 4, 1, "", "prepare_states"], [10, 4, 1, "", "prepare_states_combined_ind"], [10, 4, 1, "", "prepare_states_ind"], [10, 4, 1, "", "prepare_states_val"], [10, 3, 1, "", "prev_state_combiner"], [10, 3, 1, "", "prev_state_combiner_all"], [10, 3, 1, "", "prev_state_splitter"], [10, 3, 1, "", "prev_state_splitter_rpn"], [10, 3, 1, "", "prev_state_splitter_rpn_compact"], [10, 4, 1, "", "set_input_groups"], [10, 4, 1, "", "splits"], [10, 3, 1, "id3", "splitter"], [10, 3, 1, "id4", "splitter_final"], [10, 3, 1, "id5", "splitter_rpn"], [10, 3, 1, "id6", "splitter_rpn_compact"], [10, 3, 1, "", "splitter_rpn_final"], [10, 4, 1, "", "splitter_validation"], [10, 2, 1, "", "states_ind"], [10, 2, 1, "", "states_val"], [10, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[11, 1, 1, "", "Submitter"], [11, 5, 1, "", "get_runnable_tasks"], [11, 5, 1, "", "is_runnable"], [11, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[11, 4, 1, "", "close"], [11, 4, 1, "", "expand_runnable"], [11, 4, 1, "", "expand_workflow"], [11, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[12, 1, 1, "", "ContainerTask"], [12, 1, 1, "", "DockerTask"], [12, 1, 1, "", "FunctionTask"], [12, 1, 1, "", "ShellCommandTask"], [12, 1, 1, "", "SingularityTask"], [12, 5, 1, "", "split_cmd"]], "pydra.engine.task.ContainerTask": [[12, 2, 1, "", "SUPPORTED_COPY_MODES"], [12, 4, 1, "", "bind_paths"], [12, 4, 1, "", "binds"], [12, 4, 1, "", "container_check"]], "pydra.engine.task.DockerTask": [[12, 3, 1, "", "container_args"], [12, 2, 1, "", "init"]], "pydra.engine.task.ShellCommandTask": [[12, 2, 1, "", "DEFAULT_COPY_COLLATION"], [12, 3, 1, "", "cmdline"], [12, 3, 1, "", "command_args"], [12, 2, 1, "", "input_spec"], [12, 2, 1, "", "output_spec"]], "pydra.engine.task.SingularityTask": [[12, 3, 1, "", "container_args"], [12, 2, 1, "", "init"]], "pydra.engine.workers": [[13, 1, 1, "", "ConcurrentFuturesWorker"], [13, 1, 1, "", "DaskWorker"], [13, 1, 1, "", "DistributedWorker"], [13, 1, 1, "", "SGEWorker"], [13, 1, 1, "", "SerialWorker"], [13, 1, 1, "", "SlurmWorker"], [13, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[13, 4, 1, "", "close"], [13, 4, 1, "", "exec_as_coro"], [13, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[13, 4, 1, "", "close"], [13, 4, 1, "", "exec_dask"], [13, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[13, 4, 1, "", "fetch_finished"], [13, 2, 1, "", "max_jobs"]], "pydra.engine.workers.SGEWorker": [[13, 4, 1, "", "check_for_results_files"], [13, 4, 1, "", "get_output_by_task_pkl"], [13, 4, 1, "", "get_tasks_to_run"], [13, 4, 1, "", "run_el"], [13, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[13, 4, 1, "", "close"], [13, 4, 1, "", "exec_serial"], [13, 4, 1, "", "fetch_finished"], [13, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[13, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[13, 4, 1, "", "close"], [13, 4, 1, "", "fetch_finished"], [13, 4, 1, "", "run_el"]], "pydra.mark": [[14, 5, 1, "", "annotate"], [15, 0, 0, "-", "functions"], [14, 5, 1, "", "task"]], "pydra.mark.functions": [[15, 5, 1, "", "annotate"], [15, 5, 1, "", "task"]], "pydra.utils": [[18, 0, 0, "-", "hash"], [19, 0, 0, "-", "messenger"], [20, 0, 0, "-", "profiler"], [21, 0, 0, "-", "typing"]], "pydra.utils.hash": [[18, 5, 1, "", "bytes_repr_mapping_contents"], [18, 5, 1, "", "bytes_repr_sequence_contents"], [18, 5, 1, "", "hash_function"], [18, 5, 1, "", "hash_object"], [18, 5, 1, "", "hash_single"], [18, 5, 1, "", "register_serializer"]], "pydra.utils.messenger": [[19, 1, 1, "", "AuditFlag"], [19, 1, 1, "", "FileMessenger"], [19, 1, 1, "", "Messenger"], [19, 1, 1, "", "PrintMessenger"], [19, 1, 1, "", "RemoteRESTMessenger"], [19, 1, 1, "", "RuntimeHooks"], [19, 5, 1, "", "collect_messages"], [19, 5, 1, "", "gen_uuid"], [19, 5, 1, "", "make_message"], [19, 5, 1, "", "now"], [19, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[19, 2, 1, "", "ALL"], [19, 2, 1, "", "NONE"], [19, 2, 1, "", "PROV"], [19, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[19, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[19, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[19, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[19, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[19, 2, 1, "", "resource_monitor_post_stop"], [19, 2, 1, "", "resource_monitor_pre_start"], [19, 2, 1, "", "task_execute_post_exit"], [19, 2, 1, "", "task_execute_pre_entry"], [19, 2, 1, "", "task_run_entry"], [19, 2, 1, "", "task_run_exit"]], "pydra.utils.profiler": [[20, 1, 1, "", "ResourceMonitor"], [20, 5, 1, "", "get_max_resources_used"], [20, 5, 1, "", "get_system_total_memory_gb"], [20, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[20, 3, 1, "", "fname"], [20, 4, 1, "", "run"], [20, 4, 1, "", "stop"]], "pydra.utils.typing": [[21, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[21, 2, 1, "", "COERCIBLE_DEFAULT"], [21, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [21, 4, 1, "", "apply_to_instances"], [21, 4, 1, "", "check_coercible"], [21, 4, 1, "", "check_type"], [21, 4, 1, "", "coerce"], [21, 2, 1, "", "coercible"], [21, 4, 1, "", "contains_type"], [21, 4, 1, "", "get_args"], [21, 4, 1, "", "get_item_type"], [21, 4, 1, "", "get_origin"], [21, 4, 1, "", "is_instance"], [21, 4, 1, "", "is_subclass"], [21, 4, 1, "", "matches"], [21, 4, 1, "", "matches_type"], [21, 2, 1, "", "not_coercible"], [21, 4, 1, "", "strip_splits"], [21, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 25], "packag": [1, 14, 16, 17], "submodul": [1, 14, 17], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 21], "boutiqu": 3, "core": 4, "graph": 5, "helper": 6, "helpers_fil": 7, "helpers_st": 8, "spec": [9, 26], "state": [10, 24, 28], "submitt": 11, "task": [12, 16, 23, 24], "note": [12, 22], "worker": 13, "mark": [14, 15], "function": [15, 24], "util": [17, 18, 19, 20, 21], "hash": 18, "messeng": 19, "profil": 20, "type": [21, 26, 28], "releas": 22, "0": 22, "8": 22, "7": 22, "6": 22, "2": 22, "1": 22, "5": 22, "4": 22, "3": 22, "group": 23, "": [23, 24, 25], "output": [23, 27], "dataflow": [24, 25], "compon": 24, "workflow": 24, "shell": 24, "command": 24, "contain": 24, "welcom": 25, "A": 25, "simpl": 25, "scalabl": 25, "semant": 25, "document": 25, "content": 25, "indic": 25, "tabl": 25, "input": [26, 28], "specif": [26, 27], "ad": 26, "new": 26, "field": 26, "metadata": [26, 27], "valid": 26, "nest": 28, "loop": 28, "over": 28, "splitter": 28, "scalar": 28, "outer": 28, "user": 29, "guid": 29}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [14, "submodules"], [17, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.graph module": [[5, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[6, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[7, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[8, "module-pydra.engine.helpers_state"]], "pydra.engine.specs module": [[9, "module-pydra.engine.specs"]], "pydra.engine.state module": [[10, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[11, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[12, "module-pydra.engine.task"]], "Notes:": [[12, null]], "pydra.engine.workers module": [[13, "module-pydra.engine.workers"]], "pydra.mark package": [[14, "module-pydra.mark"]], "pydra.mark.functions module": [[15, "module-pydra.mark.functions"]], "pydra.tasks package": [[16, "module-pydra.tasks"]], "pydra.utils package": [[17, "module-pydra.utils"]], "pydra.utils.hash module": [[18, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[19, "module-pydra.utils.messenger"]], "pydra.utils.profiler module": [[20, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[21, "module-pydra.utils.typing"]], "Release Notes": [[22, "release-notes"]], "0.8.0": [[22, "id1"]], "0.7.0": [[22, "id2"]], "0.6.2": [[22, "id3"]], "0.6.1": [[22, "id4"]], "0.6": [[22, "id5"]], "0.5": [[22, "id6"]], "0.4": [[22, "id7"]], "0.3.1": [[22, "id8"]], "0.3": [[22, "id9"]], "0.2.2": [[22, "id10"]], "0.2.1": [[22, "id11"]], "0.2": [[22, "id12"]], "0.1": [[22, "id13"]], "0.0.1": [[22, "id14"]], "Grouping Task\u2019s Output": [[23, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[24, "dataflows-components-task-and-workflow"]], "Function Tasks": [[24, "function-tasks"]], "Shell Command Tasks": [[24, "shell-command-tasks"]], "Container Tasks": [[24, "container-tasks"]], "Workflows": [[24, "workflows"]], "Task\u2019s State": [[24, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[25, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[25, null]], "Indices and tables": [[25, "indices-and-tables"]], "Input Specification": [[26, "input-specification"]], "Adding a New Field to the Spec": [[26, "adding-a-new-field-to-the-spec"]], "Types": [[26, "types"]], "Metadata": [[26, "metadata"], [27, "metadata"]], "Validators": [[26, "validators"]], "Output Specification": [[27, "output-specification"]], "State and Nested Loops over Input": [[28, "state-and-nested-loops-over-input"]], "Types of Splitter": [[28, "types-of-splitter"]], "Scalar Splitter": [[28, "scalar-splitter"]], "Outer Splitter": [[28, "outer-splitter"]], "User Guide": [[29, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "dockertask (class in pydra)": [[0, "pydra.DockerTask"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.command_args"]], "container_args (pydra.dockertask property)": [[0, "pydra.DockerTask.container_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "init (pydra.dockertask attribute)": [[0, "pydra.DockerTask.init"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.graph"], [6, "module-pydra.engine.helpers"], [7, "module-pydra.engine.helpers_file"], [8, "module-pydra.engine.helpers_state"], [9, "module-pydra.engine.specs"], [10, "module-pydra.engine.state"], [11, "module-pydra.engine.submitter"], [12, "module-pydra.engine.task"], [13, "module-pydra.engine.workers"], [14, "module-pydra.mark"], [15, "module-pydra.mark.functions"], [16, "module-pydra.tasks"], [17, "module-pydra.utils"], [18, "module-pydra.utils.hash"], [19, "module-pydra.utils.messenger"], [20, "module-pydra.utils.profiler"], [21, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "dockertask (class in pydra.engine)": [[1, "pydra.engine.DockerTask"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "container_args (pydra.engine.dockertask property)": [[1, "pydra.engine.DockerTask.container_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "init (pydra.engine.dockertask attribute)": [[1, "pydra.engine.DockerTask.init"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "digraph (class in pydra.engine.graph)": [[5, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[5, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[6, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.parse_copyfile"]], "position_sort() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[6, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[7, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[7, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[8, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[8, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.unwrap_splitter"]], "basespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.BaseSpec"]], "containerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ContainerSpec"]], "dockerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.DockerSpec"]], "functionspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellSpec"]], "singularityspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SingularitySpec"]], "specinfo (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[9, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[9, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[9, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[9, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[9, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[9, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container"]], "container (pydra.engine.specs.dockerspec attribute)": [[9, "pydra.engine.specs.DockerSpec.container"]], "container (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.container"]], "container (pydra.engine.specs.singularityspec attribute)": [[9, "pydra.engine.specs.SingularitySpec.container"]], "container_xargs (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container_xargs"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[9, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[9, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[9, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[9, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[9, "pydra.engine.specs.BaseSpec.hash"]], "image (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.image"]], "name (pydra.engine.specs.lazyfield attribute)": [[9, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[9, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[9, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[9, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[9, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[9, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[10, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[10, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[10, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[10, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[10, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[10, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[10, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[10, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[10, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[11, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[11, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.submit_from_call"]], "containertask (class in pydra.engine.task)": [[12, "pydra.engine.task.ContainerTask"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "dockertask (class in pydra.engine.task)": [[12, "pydra.engine.task.DockerTask"]], "functiontask (class in pydra.engine.task)": [[12, "pydra.engine.task.FunctionTask"]], "supported_copy_modes (pydra.engine.task.containertask attribute)": [[12, "pydra.engine.task.ContainerTask.SUPPORTED_COPY_MODES"]], "shellcommandtask (class in pydra.engine.task)": [[12, "pydra.engine.task.ShellCommandTask"]], "singularitytask (class in pydra.engine.task)": [[12, "pydra.engine.task.SingularityTask"]], "bind_paths() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.bind_paths"]], "binds() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.binds"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.command_args"]], "container_args (pydra.engine.task.dockertask property)": [[12, "pydra.engine.task.DockerTask.container_args"]], "container_args (pydra.engine.task.singularitytask property)": [[12, "pydra.engine.task.SingularityTask.container_args"]], "container_check() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.container_check"]], "init (pydra.engine.task.dockertask attribute)": [[12, "pydra.engine.task.DockerTask.init"]], "init (pydra.engine.task.singularitytask attribute)": [[12, "pydra.engine.task.SingularityTask.init"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[12, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[12, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DistributedWorker"]], "sgeworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[13, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[13, "pydra.engine.workers.DistributedWorker.max_jobs"]], "pydra.engine.workers": [[13, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[13, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.submit_array_job"]], "annotate() (in module pydra.mark)": [[14, "pydra.mark.annotate"]], "pydra.mark": [[14, "module-pydra.mark"]], "task() (in module pydra.mark)": [[14, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[15, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.task"]], "pydra.tasks": [[16, "module-pydra.tasks"]], "pydra.utils": [[17, "module-pydra.utils"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.hash_single"]], "pydra.utils.hash": [[18, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[18, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[19, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[19, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[19, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[19, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[19, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[19, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[19, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[19, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[19, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[19, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[19, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[19, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[19, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[19, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[19, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[19, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "resourcemonitor (class in pydra.utils.profiler)": [[20, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[20, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[20, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[20, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[20, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[20, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[20, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[20, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[21, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[21, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[21, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[21, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[21, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[21, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[21, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[21, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[21, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser static method)": [[21, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.is_subclass"]], "matches() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[21, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[21, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[21, "pydra.utils.typing.TypeParser.strip_splits"]], "tp (pydra.utils.typing.typeparser attribute)": [[21, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/0.23.0-alpha/state.html b/0.23.0-alpha/state.html new file mode 100644 index 0000000000..282dd946d4 --- /dev/null +++ b/0.23.0-alpha/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23.0-alpha/user_guide.html b/0.23.0-alpha/user_guide.html new file mode 100644 index 0000000000..af3bda0e92 --- /dev/null +++ b/0.23.0-alpha/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: 0.23.0-alpha + + + +
+ + + + \ No newline at end of file diff --git a/0.23/.buildinfo b/0.23/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/0.23/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/0.23/.doctrees/api.doctree b/0.23/.doctrees/api.doctree new file mode 100644 index 0000000000..c125d9db65 Binary files /dev/null and b/0.23/.doctrees/api.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.audit.doctree b/0.23/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..301c18df92 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.boutiques.doctree b/0.23/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..f42c183bfc Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.core.doctree b/0.23/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..f1f23f6def Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.core.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.doctree b/0.23/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..000fd1977b Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.environments.doctree b/0.23/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..6d6c61fcab Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.graph.doctree b/0.23/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..fb8f5770a4 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.helpers.doctree b/0.23/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..13c2beb999 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.helpers_file.doctree b/0.23/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..de2d96223d Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.helpers_state.doctree b/0.23/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..22b0847239 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.run_pickled.doctree b/0.23/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..acd6c0bbea Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.specs.doctree b/0.23/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..8972a2d3b9 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.state.doctree b/0.23/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..1092fc6f60 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.state.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.submitter.doctree b/0.23/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..6f677eaef1 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.task.doctree b/0.23/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..c052e18961 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.task.doctree differ diff --git a/0.23/.doctrees/api/pydra.engine.workers.doctree b/0.23/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..d4167f4c50 Binary files /dev/null and b/0.23/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/0.23/.doctrees/api/pydra.mark.doctree b/0.23/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..2ae7d5969c Binary files /dev/null and b/0.23/.doctrees/api/pydra.mark.doctree differ diff --git a/0.23/.doctrees/api/pydra.mark.functions.doctree b/0.23/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..e980a4490a Binary files /dev/null and b/0.23/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/0.23/.doctrees/api/pydra.tasks.doctree b/0.23/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..9acf49f564 Binary files /dev/null and b/0.23/.doctrees/api/pydra.tasks.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.doctree b/0.23/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..78e4a5dd17 Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.hash.doctree b/0.23/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..4d85e3c111 Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.messenger.doctree b/0.23/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..5330b8f9d9 Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.misc.doctree b/0.23/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..0b62034f2e Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.profiler.doctree b/0.23/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..079b19fa2d Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/0.23/.doctrees/api/pydra.utils.typing.doctree b/0.23/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..2014d48beb Binary files /dev/null and b/0.23/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/0.23/.doctrees/changes.doctree b/0.23/.doctrees/changes.doctree new file mode 100644 index 0000000000..6a4e342c3a Binary files /dev/null and b/0.23/.doctrees/changes.doctree differ diff --git a/0.23/.doctrees/combiner.doctree b/0.23/.doctrees/combiner.doctree new file mode 100644 index 0000000000..2caebeb5bc Binary files /dev/null and b/0.23/.doctrees/combiner.doctree differ diff --git a/0.23/.doctrees/components.doctree b/0.23/.doctrees/components.doctree new file mode 100644 index 0000000000..e1db53787f Binary files /dev/null and b/0.23/.doctrees/components.doctree differ diff --git a/0.23/.doctrees/environment.pickle b/0.23/.doctrees/environment.pickle new file mode 100644 index 0000000000..bce074cc00 Binary files /dev/null and b/0.23/.doctrees/environment.pickle differ diff --git a/0.23/.doctrees/index.doctree b/0.23/.doctrees/index.doctree new file mode 100644 index 0000000000..f594f924ee Binary files /dev/null and b/0.23/.doctrees/index.doctree differ diff --git a/0.23/.doctrees/input_spec.doctree b/0.23/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..5b44b223b2 Binary files /dev/null and b/0.23/.doctrees/input_spec.doctree differ diff --git a/0.23/.doctrees/output_spec.doctree b/0.23/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..e09f4bacea Binary files /dev/null and b/0.23/.doctrees/output_spec.doctree differ diff --git a/0.23/.doctrees/state.doctree b/0.23/.doctrees/state.doctree new file mode 100644 index 0000000000..92d8a4fada Binary files /dev/null and b/0.23/.doctrees/state.doctree differ diff --git a/0.23/.doctrees/user_guide.doctree b/0.23/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..2c66901168 Binary files /dev/null and b/0.23/.doctrees/user_guide.doctree differ diff --git a/0.23/.nojekyll b/0.23/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/0.23/_images/nd_spl_1.png b/0.23/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/0.23/_images/nd_spl_1.png differ diff --git a/0.23/_images/nd_spl_3.png b/0.23/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/0.23/_images/nd_spl_3.png differ diff --git a/0.23/_images/nd_spl_3_comb1.png b/0.23/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/0.23/_images/nd_spl_3_comb1.png differ diff --git a/0.23/_images/nd_spl_3_comb3.png b/0.23/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/0.23/_images/nd_spl_3_comb3.png differ diff --git a/0.23/_images/nd_spl_4.png b/0.23/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/0.23/_images/nd_spl_4.png differ diff --git a/0.23/_sources/api.rst.txt b/0.23/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/0.23/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/0.23/_sources/api/pydra.engine.audit.rst.txt b/0.23/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.boutiques.rst.txt b/0.23/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/0.23/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.core.rst.txt b/0.23/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.environments.rst.txt b/0.23/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/0.23/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.graph.rst.txt b/0.23/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.helpers.rst.txt b/0.23/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.helpers_file.rst.txt b/0.23/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.helpers_state.rst.txt b/0.23/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.rst.txt b/0.23/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/0.23/_sources/api/pydra.engine.run_pickled.rst.txt b/0.23/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.specs.rst.txt b/0.23/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.state.rst.txt b/0.23/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/0.23/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.submitter.rst.txt b/0.23/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/0.23/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.task.rst.txt b/0.23/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/0.23/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.engine.workers.rst.txt b/0.23/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/0.23/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.mark.functions.rst.txt b/0.23/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/0.23/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.mark.rst.txt b/0.23/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/0.23/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/0.23/_sources/api/pydra.tasks.rst.txt b/0.23/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/0.23/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.utils.hash.rst.txt b/0.23/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/0.23/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.utils.messenger.rst.txt b/0.23/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/0.23/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.utils.misc.rst.txt b/0.23/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/0.23/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.utils.profiler.rst.txt b/0.23/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/0.23/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/api/pydra.utils.rst.txt b/0.23/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/0.23/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/0.23/_sources/api/pydra.utils.typing.rst.txt b/0.23/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/0.23/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/0.23/_sources/changes.rst.txt b/0.23/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/0.23/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/0.23/_sources/combiner.rst.txt b/0.23/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/0.23/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/0.23/_sources/components.rst.txt b/0.23/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/0.23/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/0.23/_sources/index.rst.txt b/0.23/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/0.23/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/0.23/_sources/input_spec.rst.txt b/0.23/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/0.23/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/0.23/_sources/output_spec.rst.txt b/0.23/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/0.23/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/0.23/_sources/state.rst.txt b/0.23/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/0.23/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/0.23/_sources/user_guide.rst.txt b/0.23/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/0.23/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/0.23/_static/_sphinx_javascript_frameworks_compat.js b/0.23/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/0.23/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/0.23/_static/banner.css b/0.23/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/0.23/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/0.23/_static/basic.css b/0.23/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/0.23/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/0.23/_static/css/badge_only.css b/0.23/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/0.23/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/0.23/_static/css/fonts/Roboto-Slab-Bold.woff b/0.23/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/0.23/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/0.23/_static/css/fonts/Roboto-Slab-Bold.woff2 b/0.23/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/0.23/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/0.23/_static/css/fonts/Roboto-Slab-Regular.woff b/0.23/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/0.23/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/0.23/_static/css/fonts/Roboto-Slab-Regular.woff2 b/0.23/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/0.23/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/0.23/_static/css/fonts/fontawesome-webfont.eot b/0.23/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/0.23/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/0.23/_static/css/fonts/fontawesome-webfont.svg b/0.23/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/0.23/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/0.23/_static/css/fonts/fontawesome-webfont.ttf b/0.23/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/0.23/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/0.23/_static/css/fonts/fontawesome-webfont.woff b/0.23/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/0.23/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/0.23/_static/css/fonts/fontawesome-webfont.woff2 b/0.23/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/0.23/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/0.23/_static/css/fonts/lato-bold-italic.woff b/0.23/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/0.23/_static/css/fonts/lato-bold-italic.woff differ diff --git a/0.23/_static/css/fonts/lato-bold-italic.woff2 b/0.23/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/0.23/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/0.23/_static/css/fonts/lato-bold.woff b/0.23/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/0.23/_static/css/fonts/lato-bold.woff differ diff --git a/0.23/_static/css/fonts/lato-bold.woff2 b/0.23/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/0.23/_static/css/fonts/lato-bold.woff2 differ diff --git a/0.23/_static/css/fonts/lato-normal-italic.woff b/0.23/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/0.23/_static/css/fonts/lato-normal-italic.woff differ diff --git a/0.23/_static/css/fonts/lato-normal-italic.woff2 b/0.23/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/0.23/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/0.23/_static/css/fonts/lato-normal.woff b/0.23/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/0.23/_static/css/fonts/lato-normal.woff differ diff --git a/0.23/_static/css/fonts/lato-normal.woff2 b/0.23/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/0.23/_static/css/fonts/lato-normal.woff2 differ diff --git a/0.23/_static/css/theme.css b/0.23/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/0.23/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/0.23/_static/doctools.js b/0.23/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/0.23/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/0.23/_static/documentation_options.js b/0.23/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/0.23/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/0.23/_static/file.png b/0.23/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/0.23/_static/file.png differ diff --git a/0.23/_static/jquery.js b/0.23/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/0.23/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.23/_static/js/html5shiv.min.js b/0.23/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/0.23/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/0.23/_static/js/theme.js b/0.23/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/0.23/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/0.23/_static/minus.png b/0.23/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/0.23/_static/minus.png differ diff --git a/0.23/_static/plus.png b/0.23/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/0.23/_static/plus.png differ diff --git a/0.23/_static/pygments.css b/0.23/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/0.23/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/0.23/_static/searchtools.js b/0.23/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/0.23/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/0.23/_static/sphinx_highlight.js b/0.23/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/0.23/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/0.23/api.html b/0.23/api.html new file mode 100644 index 0000000000..00bed7e02d --- /dev/null +++ b/0.23/api.html @@ -0,0 +1,1015 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.audit.html b/0.23/api/pydra.engine.audit.html new file mode 100644 index 0000000000..730ed26bf5 --- /dev/null +++ b/0.23/api/pydra.engine.audit.html @@ -0,0 +1,244 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.boutiques.html b/0.23/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..c9e4814cf1 --- /dev/null +++ b/0.23/api/pydra.engine.boutiques.html @@ -0,0 +1,182 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.core.html b/0.23/api/pydra.engine.core.html new file mode 100644 index 0000000000..2422c55ae6 --- /dev/null +++ b/0.23/api/pydra.engine.core.html @@ -0,0 +1,501 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.environments.html b/0.23/api/pydra.engine.environments.html new file mode 100644 index 0000000000..d5a828cfac --- /dev/null +++ b/0.23/api/pydra.engine.environments.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.graph.html b/0.23/api/pydra.engine.graph.html new file mode 100644 index 0000000000..7833ffce73 --- /dev/null +++ b/0.23/api/pydra.engine.graph.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.helpers.html b/0.23/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..bf920ede62 --- /dev/null +++ b/0.23/api/pydra.engine.helpers.html @@ -0,0 +1,446 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.helpers_file.html b/0.23/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..f73317586c --- /dev/null +++ b/0.23/api/pydra.engine.helpers_file.html @@ -0,0 +1,315 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.helpers_state.html b/0.23/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..250446e0be --- /dev/null +++ b/0.23/api/pydra.engine.helpers_state.html @@ -0,0 +1,319 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.html b/0.23/api/pydra.engine.html new file mode 100644 index 0000000000..e18eb824b2 --- /dev/null +++ b/0.23/api/pydra.engine.html @@ -0,0 +1,429 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.run_pickled.html b/0.23/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..c435f8450c --- /dev/null +++ b/0.23/api/pydra.engine.run_pickled.html @@ -0,0 +1,180 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.specs.html b/0.23/api/pydra.engine.specs.html new file mode 100644 index 0000000000..8e7f3075a2 --- /dev/null +++ b/0.23/api/pydra.engine.specs.html @@ -0,0 +1,650 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.state.html b/0.23/api/pydra.engine.state.html new file mode 100644 index 0000000000..154273538a --- /dev/null +++ b/0.23/api/pydra.engine.state.html @@ -0,0 +1,598 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.submitter.html b/0.23/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..8bf0c66951 --- /dev/null +++ b/0.23/api/pydra.engine.submitter.html @@ -0,0 +1,264 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.task.html b/0.23/api/pydra.engine.task.html new file mode 100644 index 0000000000..44139fd74b --- /dev/null +++ b/0.23/api/pydra.engine.task.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.engine.workers.html b/0.23/api/pydra.engine.workers.html new file mode 100644 index 0000000000..e98cee1f43 --- /dev/null +++ b/0.23/api/pydra.engine.workers.html @@ -0,0 +1,514 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.mark.functions.html b/0.23/api/pydra.mark.functions.html new file mode 100644 index 0000000000..990e51342b --- /dev/null +++ b/0.23/api/pydra.mark.functions.html @@ -0,0 +1,200 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.mark.html b/0.23/api/pydra.mark.html new file mode 100644 index 0000000000..3cdd8cb3e7 --- /dev/null +++ b/0.23/api/pydra.mark.html @@ -0,0 +1,206 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.tasks.html b/0.23/api/pydra.tasks.html new file mode 100644 index 0000000000..eab128c222 --- /dev/null +++ b/0.23/api/pydra.tasks.html @@ -0,0 +1,171 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.hash.html b/0.23/api/pydra.utils.hash.html new file mode 100644 index 0000000000..759172da74 --- /dev/null +++ b/0.23/api/pydra.utils.hash.html @@ -0,0 +1,271 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.html b/0.23/api/pydra.utils.html new file mode 100644 index 0000000000..f42291dd47 --- /dev/null +++ b/0.23/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.messenger.html b/0.23/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..326a2fa07a --- /dev/null +++ b/0.23/api/pydra.utils.messenger.html @@ -0,0 +1,375 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.misc.html b/0.23/api/pydra.utils.misc.html new file mode 100644 index 0000000000..a801eb269d --- /dev/null +++ b/0.23/api/pydra.utils.misc.html @@ -0,0 +1,191 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.profiler.html b/0.23/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..1f6309bad3 --- /dev/null +++ b/0.23/api/pydra.utils.profiler.html @@ -0,0 +1,247 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/api/pydra.utils.typing.html b/0.23/api/pydra.utils.typing.html new file mode 100644 index 0000000000..f253e91f95 --- /dev/null +++ b/0.23/api/pydra.utils.typing.html @@ -0,0 +1,462 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]]) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/changes.html b/0.23/changes.html new file mode 100644 index 0000000000..dc3acbf588 --- /dev/null +++ b/0.23/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/combiner.html b/0.23/combiner.html new file mode 100644 index 0000000000..6ff8a92f82 --- /dev/null +++ b/0.23/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/components.html b/0.23/components.html new file mode 100644 index 0000000000..f1b73c1d8a --- /dev/null +++ b/0.23/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/genindex.html b/0.23/genindex.html new file mode 100644 index 0000000000..ae75d613f3 --- /dev/null +++ b/0.23/genindex.html @@ -0,0 +1,1504 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/index.html b/0.23/index.html new file mode 100644 index 0000000000..76890376a1 --- /dev/null +++ b/0.23/index.html @@ -0,0 +1,246 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/input_spec.html b/0.23/input_spec.html new file mode 100644 index 0000000000..5046879d83 --- /dev/null +++ b/0.23/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/objects.inv b/0.23/objects.inv new file mode 100644 index 0000000000..acfff343b6 Binary files /dev/null and b/0.23/objects.inv differ diff --git a/0.23/output_spec.html b/0.23/output_spec.html new file mode 100644 index 0000000000..b13a524dc3 --- /dev/null +++ b/0.23/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/py-modindex.html b/0.23/py-modindex.html new file mode 100644 index 0000000000..ad8b1dfec8 --- /dev/null +++ b/0.23/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/search.html b/0.23/search.html new file mode 100644 index 0000000000..4ce7cd089a --- /dev/null +++ b/0.23/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/0.23/searchindex.js b/0.23/searchindex.js new file mode 100644 index 0000000000..9163eebf54 --- /dev/null +++ b/0.23/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": 4, "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "pars": [8, 11, 13], "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/0.23/state.html b/0.23/state.html new file mode 100644 index 0000000000..63919a8500 --- /dev/null +++ b/0.23/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for an old version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/0.23/user_guide.html b/0.23/user_guide.html new file mode 100644 index 0000000000..0affca536d --- /dev/null +++ b/0.23/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_images/nd_spl_1.png b/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/_images/nd_spl_1.png differ diff --git a/_images/nd_spl_3.png b/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/_images/nd_spl_3.png differ diff --git a/_images/nd_spl_3_comb1.png b/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/_images/nd_spl_3_comb1.png differ diff --git a/_images/nd_spl_3_comb3.png b/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/_images/nd_spl_3_comb3.png differ diff --git a/_images/nd_spl_4.png b/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/_images/nd_spl_4.png differ diff --git a/_sources/api.rst.txt b/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/_sources/api/pydra.engine.audit.rst.txt b/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.boutiques.rst.txt b/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.core.rst.txt b/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.environments.rst.txt b/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.graph.rst.txt b/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.helpers.rst.txt b/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.helpers_file.rst.txt b/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.helpers_state.rst.txt b/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.rst.txt b/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/_sources/api/pydra.engine.run_pickled.rst.txt b/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.specs.rst.txt b/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.state.rst.txt b/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.submitter.rst.txt b/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.task.rst.txt b/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.engine.workers.rst.txt b/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.mark.functions.rst.txt b/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.mark.rst.txt b/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/_sources/api/pydra.tasks.rst.txt b/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.utils.hash.rst.txt b/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.utils.messenger.rst.txt b/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.utils.misc.rst.txt b/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.utils.profiler.rst.txt b/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/pydra.utils.rst.txt b/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/_sources/api/pydra.utils.typing.rst.txt b/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/changes.rst.txt b/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/_sources/combiner.rst.txt b/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/_sources/components.rst.txt b/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/input_spec.rst.txt b/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/_sources/output_spec.rst.txt b/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/_sources/state.rst.txt b/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/_sources/user_guide.rst.txt b/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/banner.css b/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/api.html b/api.html new file mode 100644 index 0000000000..163cdcfece --- /dev/null +++ b/api.html @@ -0,0 +1,1013 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.audit.html b/api/pydra.engine.audit.html new file mode 100644 index 0000000000..62f332bf5c --- /dev/null +++ b/api/pydra.engine.audit.html @@ -0,0 +1,241 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.boutiques.html b/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..5b9cdcc4a3 --- /dev/null +++ b/api/pydra.engine.boutiques.html @@ -0,0 +1,179 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.core.html b/api/pydra.engine.core.html new file mode 100644 index 0000000000..6d0d8e8873 --- /dev/null +++ b/api/pydra.engine.core.html @@ -0,0 +1,498 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.environments.html b/api/pydra.engine.environments.html new file mode 100644 index 0000000000..13d74d5965 --- /dev/null +++ b/api/pydra.engine.environments.html @@ -0,0 +1,303 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.graph.html b/api/pydra.engine.graph.html new file mode 100644 index 0000000000..fdecd0f7ab --- /dev/null +++ b/api/pydra.engine.graph.html @@ -0,0 +1,348 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.helpers.html b/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..15f0a51bd4 --- /dev/null +++ b/api/pydra.engine.helpers.html @@ -0,0 +1,449 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.parse_format_string(fmtstr)
+

Parse a argstr format string and return all keywords used in it.

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.helpers_file.html b/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..667d3adb54 --- /dev/null +++ b/api/pydra.engine.helpers_file.html @@ -0,0 +1,312 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.helpers_state.html b/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..3393597116 --- /dev/null +++ b/api/pydra.engine.helpers_state.html @@ -0,0 +1,316 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.html b/api/pydra.engine.html new file mode 100644 index 0000000000..84821eac14 --- /dev/null +++ b/api/pydra.engine.html @@ -0,0 +1,426 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.run_pickled.html b/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..577a43efae --- /dev/null +++ b/api/pydra.engine.run_pickled.html @@ -0,0 +1,177 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.specs.html b/api/pydra.engine.specs.html new file mode 100644 index 0000000000..1ae21d7384 --- /dev/null +++ b/api/pydra.engine.specs.html @@ -0,0 +1,647 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.state.html b/api/pydra.engine.state.html new file mode 100644 index 0000000000..696e90bd8f --- /dev/null +++ b/api/pydra.engine.state.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.submitter.html b/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..5b75798cf1 --- /dev/null +++ b/api/pydra.engine.submitter.html @@ -0,0 +1,261 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.task.html b/api/pydra.engine.task.html new file mode 100644 index 0000000000..92d439cf3e --- /dev/null +++ b/api/pydra.engine.task.html @@ -0,0 +1,303 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.engine.workers.html b/api/pydra.engine.workers.html new file mode 100644 index 0000000000..7bb9fee574 --- /dev/null +++ b/api/pydra.engine.workers.html @@ -0,0 +1,511 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.mark.functions.html b/api/pydra.mark.functions.html new file mode 100644 index 0000000000..532ce8de0c --- /dev/null +++ b/api/pydra.mark.functions.html @@ -0,0 +1,197 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.mark.html b/api/pydra.mark.html new file mode 100644 index 0000000000..1b61991a48 --- /dev/null +++ b/api/pydra.mark.html @@ -0,0 +1,203 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.tasks.html b/api/pydra.tasks.html new file mode 100644 index 0000000000..ada02c2df7 --- /dev/null +++ b/api/pydra.tasks.html @@ -0,0 +1,168 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.hash.html b/api/pydra.utils.hash.html new file mode 100644 index 0000000000..7f225fc426 --- /dev/null +++ b/api/pydra.utils.hash.html @@ -0,0 +1,268 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.html b/api/pydra.utils.html new file mode 100644 index 0000000000..a3e0beb56a --- /dev/null +++ b/api/pydra.utils.html @@ -0,0 +1,179 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.messenger.html b/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..2c9f488be5 --- /dev/null +++ b/api/pydra.utils.messenger.html @@ -0,0 +1,372 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.misc.html b/api/pydra.utils.misc.html new file mode 100644 index 0000000000..614edf38a0 --- /dev/null +++ b/api/pydra.utils.misc.html @@ -0,0 +1,188 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.profiler.html b/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..4721571f27 --- /dev/null +++ b/api/pydra.utils.profiler.html @@ -0,0 +1,244 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/api/pydra.utils.typing.html b/api/pydra.utils.typing.html new file mode 100644 index 0000000000..ee0affde85 --- /dev/null +++ b/api/pydra.utils.typing.html @@ -0,0 +1,459 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]] | None) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/changes.html b/changes.html new file mode 100644 index 0000000000..3ec136ebd0 --- /dev/null +++ b/changes.html @@ -0,0 +1,322 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/.buildinfo b/ci_test-py3.11-windows/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/ci_test-py3.11-windows/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/ci_test-py3.11-windows/.doctrees/api.doctree b/ci_test-py3.11-windows/.doctrees/api.doctree new file mode 100644 index 0000000000..c6a30644ec Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.audit.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..d9f8c2c914 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.boutiques.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..7bc4739b53 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.core.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..d302e95193 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.core.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..4888347c16 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.graph.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..0d684e3768 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..85e5320722 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_file.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..09a28958b7 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_state.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..c20e61ff63 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.specs.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..68b0e2b5ff Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.state.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..cbc167ac5a Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.state.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.submitter.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..b0783991cf Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.task.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..87013c2cc5 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.task.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.engine.workers.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..08b6542399 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.mark.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..7d3b0013be Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.mark.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.mark.functions.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..56190ffeeb Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.tasks.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..aee2e1f615 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.tasks.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.utils.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..9b2dd710f4 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.utils.messenger.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..105dc113c6 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/api/pydra.utils.profiler.doctree b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..4ffaf2c95a Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/changes.doctree b/ci_test-py3.11-windows/.doctrees/changes.doctree new file mode 100644 index 0000000000..5444d54319 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/changes.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/combiner.doctree b/ci_test-py3.11-windows/.doctrees/combiner.doctree new file mode 100644 index 0000000000..a253ae771c Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/combiner.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/components.doctree b/ci_test-py3.11-windows/.doctrees/components.doctree new file mode 100644 index 0000000000..02345b3135 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/components.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/environment.pickle b/ci_test-py3.11-windows/.doctrees/environment.pickle new file mode 100644 index 0000000000..b52415fb1c Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/environment.pickle differ diff --git a/ci_test-py3.11-windows/.doctrees/index.doctree b/ci_test-py3.11-windows/.doctrees/index.doctree new file mode 100644 index 0000000000..07efd8cb1f Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/index.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/input_spec.doctree b/ci_test-py3.11-windows/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..22f38708ca Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/input_spec.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/output_spec.doctree b/ci_test-py3.11-windows/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..7db6ec3b3d Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/output_spec.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/state.doctree b/ci_test-py3.11-windows/.doctrees/state.doctree new file mode 100644 index 0000000000..190dc2d9a1 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/state.doctree differ diff --git a/ci_test-py3.11-windows/.doctrees/user_guide.doctree b/ci_test-py3.11-windows/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..dcad77a8e8 Binary files /dev/null and b/ci_test-py3.11-windows/.doctrees/user_guide.doctree differ diff --git a/ci_test-py3.11-windows/.nojekyll b/ci_test-py3.11-windows/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ci_test-py3.11-windows/_images/nd_spl_1.png b/ci_test-py3.11-windows/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/ci_test-py3.11-windows/_images/nd_spl_1.png differ diff --git a/ci_test-py3.11-windows/_images/nd_spl_3.png b/ci_test-py3.11-windows/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/ci_test-py3.11-windows/_images/nd_spl_3.png differ diff --git a/ci_test-py3.11-windows/_images/nd_spl_3_comb1.png b/ci_test-py3.11-windows/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/ci_test-py3.11-windows/_images/nd_spl_3_comb1.png differ diff --git a/ci_test-py3.11-windows/_images/nd_spl_3_comb3.png b/ci_test-py3.11-windows/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/ci_test-py3.11-windows/_images/nd_spl_3_comb3.png differ diff --git a/ci_test-py3.11-windows/_images/nd_spl_4.png b/ci_test-py3.11-windows/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/ci_test-py3.11-windows/_images/nd_spl_4.png differ diff --git a/ci_test-py3.11-windows/_sources/api.rst.txt b/ci_test-py3.11-windows/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.audit.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.boutiques.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.core.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.graph.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_file.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_state.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..7cafa8d6ad --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,26 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.specs.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.state.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.submitter.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.task.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.engine.workers.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.mark.functions.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.mark.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/ci_test-py3.11-windows/_sources/api/pydra.tasks.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.utils.messenger.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.utils.profiler.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/ci_test-py3.11-windows/_sources/api/pydra.utils.rst.txt b/ci_test-py3.11-windows/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..946fe9055d --- /dev/null +++ b/ci_test-py3.11-windows/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,16 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.messenger + pydra.utils.profiler diff --git a/ci_test-py3.11-windows/_sources/changes.rst.txt b/ci_test-py3.11-windows/_sources/changes.rst.txt new file mode 100644 index 0000000000..0fb4187e33 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messanger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/ci_test-py3.11-windows/_sources/combiner.rst.txt b/ci_test-py3.11-windows/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/ci_test-py3.11-windows/_sources/components.rst.txt b/ci_test-py3.11-windows/_sources/components.rst.txt new file mode 100644 index 0000000000..7872fec87c --- /dev/null +++ b/ci_test-py3.11-windows/_sources/components.rst.txt @@ -0,0 +1,187 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2(x=[1, 5]).split("x").combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. +The results are grouped back when returning the result from the *Task*. +While this example +illustrates mapping and grouping of results over a single parameter, *Pydra* +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/ci_test-py3.11-windows/_sources/index.rst.txt b/ci_test-py3.11-windows/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/ci_test-py3.11-windows/_sources/input_spec.rst.txt b/ci_test-py3.11-windows/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/ci_test-py3.11-windows/_sources/output_spec.rst.txt b/ci_test-py3.11-windows/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/ci_test-py3.11-windows/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/ci_test-py3.11-windows/_sources/state.rst.txt b/ci_test-py3.11-windows/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/ci_test-py3.11-windows/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/ci_test-py3.11-windows/_sources/user_guide.rst.txt b/ci_test-py3.11-windows/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/ci_test-py3.11-windows/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/ci_test-py3.11-windows/_static/_sphinx_javascript_frameworks_compat.js b/ci_test-py3.11-windows/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/ci_test-py3.11-windows/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/ci_test-py3.11-windows/_static/banner.css b/ci_test-py3.11-windows/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/ci_test-py3.11-windows/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/ci_test-py3.11-windows/_static/basic.css b/ci_test-py3.11-windows/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/ci_test-py3.11-windows/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/css/badge_only.css b/ci_test-py3.11-windows/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/ci_test-py3.11-windows/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff2 b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff2 b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.eot b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.svg b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.ttf b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff2 b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff b/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff2 b/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff b/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff2 b/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-bold.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff b/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff2 b/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff b/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff differ diff --git a/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff2 b/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/ci_test-py3.11-windows/_static/css/fonts/lato-normal.woff2 differ diff --git a/ci_test-py3.11-windows/_static/css/theme.css b/ci_test-py3.11-windows/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/ci_test-py3.11-windows/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/doctools.js b/ci_test-py3.11-windows/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/ci_test-py3.11-windows/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/ci_test-py3.11-windows/_static/documentation_options.js b/ci_test-py3.11-windows/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/ci_test-py3.11-windows/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/file.png b/ci_test-py3.11-windows/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/ci_test-py3.11-windows/_static/file.png differ diff --git a/ci_test-py3.11-windows/_static/jquery.js b/ci_test-py3.11-windows/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/ci_test-py3.11-windows/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/js/html5shiv.min.js b/ci_test-py3.11-windows/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/ci_test-py3.11-windows/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/js/theme.js b/ci_test-py3.11-windows/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/ci_test-py3.11-windows/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/ci_test-py3.11-windows/_static/minus.png b/ci_test-py3.11-windows/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/ci_test-py3.11-windows/_static/minus.png differ diff --git a/ci_test-py3.11-windows/_static/plus.png b/ci_test-py3.11-windows/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/ci_test-py3.11-windows/_static/plus.png differ diff --git a/ci_test-py3.11-windows/_static/pygments.css b/ci_test-py3.11-windows/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/ci_test-py3.11-windows/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/ci_test-py3.11-windows/_static/searchtools.js b/ci_test-py3.11-windows/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/ci_test-py3.11-windows/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/ci_test-py3.11-windows/_static/sphinx_highlight.js b/ci_test-py3.11-windows/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/ci_test-py3.11-windows/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/ci_test-py3.11-windows/api.html b/ci_test-py3.11-windows/api.html new file mode 100644 index 0000000000..fc70e248ce --- /dev/null +++ b/ci_test-py3.11-windows/api.html @@ -0,0 +1,677 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+pydra.check_latest_version()
+
+ +
+
+pydra.set_input_validator(flag=False)
+
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.audit.html b/ci_test-py3.11-windows/api/pydra.engine.audit.html new file mode 100644 index 0000000000..377fe4b12d --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.audit.html @@ -0,0 +1,243 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.boutiques.html b/ci_test-py3.11-windows/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..0196f743cf --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.boutiques.html @@ -0,0 +1,181 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.core.html b/ci_test-py3.11-windows/api/pydra.engine.core.html new file mode 100644 index 0000000000..c9109aeb73 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.core.html @@ -0,0 +1,458 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elemntary tasks and +Workflow instances inherit.

+
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner, overwrite=False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner – TODO

  • +
  • overwrite (bool) – TODO

  • +
+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Return type:
+

result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter, overwrite=False, cont_dim=None, **kwargs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • overwrite (bool) – TODO

  • +
  • cont_dim (dict) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.graph.html b/ci_test-py3.11-windows/api/pydra.engine.graph.html new file mode 100644 index 0000000000..a1cea1f1c3 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.graph.html @@ -0,0 +1,350 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other format, equires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.helpers.html b/ci_test-py3.11-windows/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..feddc98bd8 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.helpers.html @@ -0,0 +1,459 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.custom_validator(instance, attribute, value)
+

simple custom validation +take into account ty.Union, ty.List, ty.Dict (but only one level depth) +adding an additional validator, if allowe_values provided

+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.hash_function(obj)
+

Generate hash of object.

+
+ +
+
+pydra.engine.helpers.hash_value(value, tp=None, metadata=None, precalculated=None)
+

calculating hash or returning values recursively

+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+
+pydra.engine.helpers.task_hash(task)
+

Calculate the checksum of a task.

+

input hash, output hash, environment hash

+
+
Parameters:
+

task (TaskBase) – The input task.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.helpers_file.html b/ci_test-py3.11-windows/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..c949524e32 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.helpers_file.html @@ -0,0 +1,444 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+pydra.engine.helpers_file.copyfile(originalfile, newfile, copy=False, create_new=False, use_hardlink=True, copy_related_files=True)
+

Copy or link files.

+

If use_hardlink is True, and the file can be hard-linked, then a +link is created, instead of copying the file.

+

If a hard link is not created and copy is False, then a symbolic +link is created.

+
+

Copy options for existing files

+
    +
  • symlink

    +
    +
      +
    • to regular file originalfile (keep if symlinking)

    • +
    • to same dest as symlink originalfile (keep if symlinking)

    • +
    • to other file (unlink)

    • +
    +
    +
  • +
  • regular file

    +
    +
      +
    • hard link to originalfile (keep)

    • +
    • copy of file (same hash) (keep)

    • +
    • different file (diff hash) (unlink)

    • +
    +
    +
  • +
+
+
+

Copy options for new files

+
    +
  • use_hardlink & can_hardlink => hardlink

  • +
  • ~hardlink & ~copy & can_symlink => symlink

  • +
  • ~hardlink & ~symlink => copy

  • +
+
+
+
Parameters:
+
    +
  • originalfile (str) – full path to original file

  • +
  • newfile (str) – full path to new file

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for POSIX systems

  • +
  • use_hardlink (Bool) – specifies whether to hard-link files, when able +(Default=False), taking precedence over copy

  • +
  • copy_related_files (Bool) – specifies whether to also operate on related files, as defined in +related_filetype_sets

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.copyfile_input(inputs, output_dir)
+

Implement the base class method.

+
+ +
+
+pydra.engine.helpers_file.copyfiles(filelist, dest, copy=False, create_new=False)
+

Copy or symlink files in filelist to dest directory.

+
+
Parameters:
+
    +
  • filelist (list) – List of files to copy.

  • +
  • dest (path/files) – full path to destination. If it is a list of length greater +than 1, then it assumes that these are the names of the new +files.

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for posix systems

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.fname_presuffix(fname, prefix='', suffix='', newpath=None, use_ext=True)
+

Manipulate path and name of input filename.

+
+
Parameters:
+
    +
  • fname (str) – A filename (may or may not include path)

  • +
  • prefix (str) – Characters to prepend to the filename

  • +
  • suffix (str) – Characters to append to the filename

  • +
  • newpath (str) – Path to replace the path of the input fname

  • +
  • use_ext (bool) – If True (default), appends the extension of the original file +to the output name.

  • +
+
+
Returns:
+

path – Absolute path of the modified filename

+
+
Return type:
+

str

+
+
+

Examples

+
>>> import pytest, sys
+>>> if sys.platform.startswith('win'): pytest.skip()
+>>> from pydra.engine.helpers_file import fname_presuffix
+>>> fname = 'foo.nii.gz'
+>>> fname_presuffix(fname,'pre','post','/tmp')
+'/tmp/prefoopost.nii.gz'
+
+
+
+ +
+ +

Return a list of related files.

+

As defined in related_filetype_sets, for a filename +(e.g., Nifti-Pair, Analyze (SPM), and AFNI files).

+
+
Parameters:
+
    +
  • filename (str) – File name to find related filetypes of.

  • +
  • include_this_file (bool) – If true, output includes the input filename.

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.hash_dir(dirpath, crypto=<built-in function openssl_sha256>, ignore_hidden_files=False, ignore_hidden_dirs=False, raise_notfound=True, precalculated=None)
+

Compute hash of directory contents.

+

This function computes the hash of every file in directory dirpath and then +computes the hash of that list of hashes to return a single hash value. The +directory is traversed recursively.

+
+
Parameters:
+
    +
  • dirpath (str) – Path to directory.

  • +
  • crypto (:obj: function) – cryptographic hash functions

  • +
  • ignore_hidden_files (bool) – If True, ignore filenames that begin with ..

  • +
  • ignore_hidden_dirs (bool) – If True, ignore files in directories that begin with ..

  • +
  • raise_notfound (bool) – If True and dirpath does not exist, raise FileNotFound exception. If +False and dirpath does not exist, return None.

  • +
+
+
Returns:
+

hash – Hash of the directory contents.

+
+
Return type:
+

str

+
+
+
+ +
+
+pydra.engine.helpers_file.hash_file(afile, chunk_len=8192, crypto=<built-in function openssl_sha256>, raise_notfound=True, precalculated=None)
+

Compute hash of a file using ‘crypto’ module.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_existing_file(value)
+

checking if an object is an existing file

+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.on_cifs(fname)
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+
+ +
+
+pydra.engine.helpers_file.related_filetype_sets = [('.hdr', '.img', '.mat'), ('.nii', '.mat'), ('.BRIK', '.HEAD')]
+

List of neuroimaging file types that are to be interpreted together.

+
+ +
+
+pydra.engine.helpers_file.split_filename(fname)
+

Split a filename into parts: path, base filename and extension.

+
+
Parameters:
+

fname (str) – file or path name

+
+
Returns:
+

    +
  • pth (str) – base path from fname

  • +
  • fname (str) – filename from fname, without extension

  • +
  • ext (str) – file extension from fname

  • +
+

+
+
+

Examples

+
>>> pth, fname, ext = split_filename('/home/data/subject.nii.gz')
+>>> pth
+'/home/data'
+
+
+
>>> fname
+'subject'
+
+
+
>>> ext
+'.nii.gz'
+
+
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.helpers_state.html b/ci_test-py3.11-windows/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..89ab6cfdad --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.helpers_state.html @@ -0,0 +1,300 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter, name)
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.html b/ci_test-py3.11-windows/api/pydra.engine.html new file mode 100644 index 0000000000..9ea3be232b --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.html @@ -0,0 +1,414 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.specs.html b/ci_test-py3.11-windows/api/pydra.engine.specs.html new file mode 100644 index 0000000000..e786abd603 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.specs.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+

Compute a basic hash for any given set of fields.

+
+ +
+
+retrieve_values(wf, state_index=None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.ContainerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container: File | str | None, container_xargs: List[str] | None = None)
+

Bases: ShellSpec

+

Refine the generic command-line specification to container execution.

+
+
+container: File | str | None
+

The container.

+
+ +
+
+container_xargs: List[str] | None
+
+ +
+
+image: File | str
+

The image to be containerized.

+
+ +
+ +
+
+class pydra.engine.specs.Directory
+

Bases: object

+

An os.pathlike object, designating a folder.

+
+ +
+
+class pydra.engine.specs.DockerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'docker')
+

Bases: ContainerSpec

+

Particularize container specifications to the Docker engine.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.File
+

Bases: object

+

An os.pathlike object, designating a file.

+
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(node, attr_type)
+

Bases: object

+

Lazy fields implement promises.

+
+
+get_value(wf, state_index=None)
+

Return the value of a lazy field.

+
+ +
+ +
+
+class pydra.engine.specs.MultiInputFile
+

Bases: MultiInputObj

+

A ty.List[File] object, converter changes a single file path to a list

+
+ +
+
+class pydra.engine.specs.MultiInputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes a single values to a list

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.MultiOutputFile
+

Bases: MultiOutputObj

+

A ty.List[File] object, converter changes an 1-el list to the single value

+
+ +
+
+class pydra.engine.specs.MultiOutputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes an 1-el list to the single value

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: File | str, stderr: File | str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Collect additional outputs from shelltask output_spec.

+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: File | str
+

The process’ standard input.

+
+ +
+
+stdout: File | str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SingularitySpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'singularity')
+

Bases: ContainerSpec

+

Particularize container specifications to Singularity.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Tuple[Type] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Tuple[Type]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.attr_fields_dict(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.state.html b/ci_test-py3.11-windows/api/pydra.engine.state.html new file mode 100644 index 0000000000..1609747491 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.state.html @@ -0,0 +1,597 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.submitter.html b/ci_test-py3.11-windows/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..37f6296aa6 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.submitter.html @@ -0,0 +1,263 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.task.html b/ci_test-py3.11-windows/api/pydra.engine.task.html new file mode 100644 index 0000000000..bb36314dd6 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.task.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.ContainerTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Extend shell command task for containerized execution.

+
+
+bind_paths()
+

Get bound mount points

+
+
Returns:
+

mount points – mapping from local path to tuple of container path + mode

+
+
Return type:
+

dict

+
+
+
+ +
+
+binds(opt)
+

Specify mounts to bind from local filesystems to container and working directory.

+

Uses py:meth:bind_paths

+
+ +
+
+container_check(container_type)
+

Get container-specific CLI arguments.

+
+ +
+ +
+
+class pydra.engine.task.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.task.SingularityTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with Singularity.

+
+
+property container_args
+

Get container-specific CLI arguments.

+
+ +
+
+init = False
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.engine.workers.html b/ci_test-py3.11-windows/api/pydra.engine.workers.html new file mode 100644 index 0000000000..be758b5068 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.engine.workers.html @@ -0,0 +1,381 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.mark.functions.html b/ci_test-py3.11-windows/api/pydra.mark.functions.html new file mode 100644 index 0000000000..2ea588814c --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.mark.functions.html @@ -0,0 +1,196 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.mark.html b/ci_test-py3.11-windows/api/pydra.mark.html new file mode 100644 index 0000000000..97c599c7d0 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.mark.html @@ -0,0 +1,176 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.tasks.html b/ci_test-py3.11-windows/api/pydra.tasks.html new file mode 100644 index 0000000000..8e2f7e0931 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.tasks.html @@ -0,0 +1,169 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.utils.html b/ci_test-py3.11-windows/api/pydra.utils.html new file mode 100644 index 0000000000..e788bda2f3 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.utils.html @@ -0,0 +1,177 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.utils.messenger.html b/ci_test-py3.11-windows/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..bbcfd9acf6 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.utils.messenger.html @@ -0,0 +1,373 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/api/pydra.utils.profiler.html b/ci_test-py3.11-windows/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..0c542513a6 --- /dev/null +++ b/ci_test-py3.11-windows/api/pydra.utils.profiler.html @@ -0,0 +1,243 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequence to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/changes.html b/ci_test-py3.11-windows/changes.html new file mode 100644 index 0000000000..c37c718158 --- /dev/null +++ b/ci_test-py3.11-windows/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messanger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/combiner.html b/ci_test-py3.11-windows/combiner.html new file mode 100644 index 0000000000..feeb0c1fb1 --- /dev/null +++ b/ci_test-py3.11-windows/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/components.html b/ci_test-py3.11-windows/components.html new file mode 100644 index 0000000000..7d48f386f7 --- /dev/null +++ b/ci_test-py3.11-windows/components.html @@ -0,0 +1,337 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2(x=[1, 5]).split("x").combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. +The results are grouped back when returning the result from the Task. +While this example +illustrates mapping and grouping of results over a single parameter, Pydra +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/genindex.html b/ci_test-py3.11-windows/genindex.html new file mode 100644 index 0000000000..a11f112413 --- /dev/null +++ b/ci_test-py3.11-windows/genindex.html @@ -0,0 +1,1283 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/index.html b/ci_test-py3.11-windows/index.html new file mode 100644 index 0000000000..09f8232f20 --- /dev/null +++ b/ci_test-py3.11-windows/index.html @@ -0,0 +1,244 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/input_spec.html b/ci_test-py3.11-windows/input_spec.html new file mode 100644 index 0000000000..b5ab1f3694 --- /dev/null +++ b/ci_test-py3.11-windows/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/objects.inv b/ci_test-py3.11-windows/objects.inv new file mode 100644 index 0000000000..92761904eb Binary files /dev/null and b/ci_test-py3.11-windows/objects.inv differ diff --git a/ci_test-py3.11-windows/output_spec.html b/ci_test-py3.11-windows/output_spec.html new file mode 100644 index 0000000000..752c5107e8 --- /dev/null +++ b/ci_test-py3.11-windows/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/py-modindex.html b/ci_test-py3.11-windows/py-modindex.html new file mode 100644 index 0000000000..81159bdd79 --- /dev/null +++ b/ci_test-py3.11-windows/py-modindex.html @@ -0,0 +1,250 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.messenger +
    + pydra.utils.profiler +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/search.html b/ci_test-py3.11-windows/search.html new file mode 100644 index 0000000000..546a941258 --- /dev/null +++ b/ci_test-py3.11-windows/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/searchindex.js b/ci_test-py3.11-windows/searchindex.js new file mode 100644 index 0000000000..db10eeda5b --- /dev/null +++ b/ci_test-py3.11-windows/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.messenger", "api/pydra.utils.profiler", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.profiler.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.messenger module", "pydra.utils.profiler module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 6, 7, 8, 9, 11, 16, 18, 22, 23, 24, 25, 26], "pydra": [0, 20, 21, 22, 24, 26], "workflow": [0, 1, 4, 5, 6, 9, 11, 15, 20, 21, 23, 26, 27], "engin": [0, 19, 20, 26], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rewrit": 0, "nipyp": [0, 7, 19, 20, 23], "map": [0, 5, 10, 12, 22, 23, 26], "join": 0, "first": [0, 21], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 24, 25], "oper": [0, 7, 10, 26], "It": [0, 4, 10, 21, 22, 23], "form": [0, 6, 8, 10, 22, 25], "core": [0, 1, 11, 19, 20], "2": [0, 1, 6, 11, 15, 18, 22, 23, 24, 26], "0": [0, 1, 4, 6, 8, 11, 15, 18, 23], "ecosystem": [0, 23], "check_latest_vers": [0, 23], "set_input_valid": [0, 23, 24], "flag": [0, 1, 2, 4, 18, 20, 22, 24, 25], "fals": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 19, 24, 25], "packag": [0, 20, 22, 23], "auditflag": [0, 1, 4, 12, 18], "all": [0, 1, 4, 5, 7, 8, 9, 10, 11, 18, 20, 21, 22, 24, 26], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20], "prov": [0, 1, 18], "resourc": [0, 1, 2, 18, 19, 23], "dockertask": [0, 1, 12, 20, 22], "container_arg": [0, 1, 12, 20], "init": [0, 1, 12], "shellcommandtask": [0, 1, 3, 12, 20, 22, 24, 25], "cmdline": [0, 1, 12, 20], "command_arg": [0, 1, 12, 20], "input_spec": [0, 1, 4, 6, 7, 9, 12, 20, 22, 24, 25], "output_spec": [0, 1, 4, 6, 7, 9, 12, 24, 25], "submitt": [0, 1, 6, 20], "close": [0, 1, 6, 11, 13], "expand_runn": [0, 1, 11], "expand_workflow": [0, 1, 11], "submit_from_cal": [0, 1, 11], "add": [0, 1, 4, 5, 20, 22], "checksum": [0, 1, 4, 6, 20], "create_connect": [0, 1, 4], "create_dotfil": [0, 1, 4, 20], "graph_sort": [0, 1, 4], "node": [0, 1, 4, 5, 8, 9, 10, 12, 19, 20, 22, 23, 26], "set_output": [0, 1, 4, 22], "submodul": 0, "audit": [0, 1, 4, 12, 18, 20, 23], "modul": [0, 1, 14, 17, 23], "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "monitor": [0, 1, 2, 12, 18, 19], "start_audit": [0, 2], "boutiqu": [0, 1, 20], "boshtask": [0, 3, 20], "taskbas": [0, 1, 4, 6, 11, 12, 22], "audit_flag": [0, 1, 2, 4, 12], "cache_dir": [0, 1, 4, 12], "cache_loc": [0, 1, 4, 6, 12, 20], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 6, 8, 10, 20, 21, 22, 23, 24, 26], "cont_dim": [0, 1, 4, 8, 10, 12, 20], "done": [0, 4, 26], "error": [0, 1, 4, 6, 7, 8, 9, 11, 19, 20, 23, 24, 25], "generated_output_nam": [0, 4, 9], "get_input_el": [0, 4], "help": [0, 4, 22, 23], "output_dir": [0, 1, 4, 7, 9, 25], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 6, 7, 9, 10, 20, 21, 22, 23], "set_stat": [0, 4], "split": [0, 4, 7, 8, 10, 12, 21, 22, 26], "uid": [0, 4], "version": [0, 4, 24], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "graph": [0, 1, 4, 11, 18, 20, 22, 23, 26], "digraph": [0, 5], "add_edg": [0, 5], "add_edges_descript": [0, 1, 4, 5], "add_nod": [0, 5], "calculate_max_path": [0, 5], "copi": [0, 5, 6, 9, 12, 20, 24, 26], "create_dotfile_detail": [0, 5], "create_dotfile_nest": [0, 5], "create_dotfile_simpl": [0, 5], "edg": [0, 5], "edges_nam": [0, 5], "export_graph": [0, 5], "nodes_detail": [0, 5], "nodes_names_map": [0, 5], "remove_nod": [0, 5], "remove_nodes_connect": [0, 5], "remove_previous_connect": [0, 5], "remove_successors_nod": [0, 5], "sorted_nod": [0, 5], "sorted_nodes_nam": [0, 5], "sort": [0, 1, 4, 5, 6], "helper": [0, 1], "pydrafilelock": [0, 6], "argstr_format": [0, 6], "copyfile_workflow": [0, 6], "create_checksum": [0, 6], "custom_valid": [0, 6], "ensure_list": [0, 6, 7], "execut": [0, 1, 6, 9, 11, 12, 13, 19, 22, 23, 24, 25, 26], "gather_runtime_info": [0, 6], "get_available_cpu": [0, 6, 20], "get_open_loop": [0, 6], "hash_funct": [0, 6], "hash_valu": [0, 6], "load_and_run": [0, 6, 20], "load_and_run_async": [0, 6], "load_result": [0, 6], "load_task": [0, 6], "make_klass": [0, 6], "output_from_inputfield": [0, 6], "position_sort": [0, 6], "print_help": [0, 6], "read_and_displai": [0, 6], "read_and_display_async": [0, 6], "read_stream_and_displai": [0, 6], "record_error": [0, 6], "save": [0, 6], "task_hash": [0, 6], "helpers_fil": [0, 1], "copyfil": [0, 7, 24], "copyfile_input": [0, 7, 9], "fname_presuffix": [0, 7], "get_related_fil": [0, 7], "hash_dir": [0, 7, 20], "hash_fil": [0, 7], "is_contain": [0, 7], "is_existing_fil": [0, 7], "is_local_fil": [0, 7], "on_cif": [0, 7], "related_filetype_set": [0, 7], "split_filenam": [0, 7], "template_upd": [0, 7, 9], "template_update_singl": [0, 7], "helpers_st": [0, 1], "pydrastateerror": [0, 8, 20], "add_name_combin": [0, 8], "add_name_splitt": [0, 8], "combine_final_group": [0, 8], "converter_groups_to_input": [0, 8], "flatten": [0, 8], "input_shap": [0, 8], "inputs_types_to_dict": [0, 8], "iter_split": [0, 8], "map_split": [0, 8], "remove_inp_from_splitter_rpn": [0, 8], "rpn2splitter": [0, 8], "splits_group": [0, 8], "splitter2rpn": [0, 8], "spec": [0, 1, 4, 6, 7, 12, 20, 25, 27], "basespec": [0, 1, 4, 9, 12], "check_fields_input_spec": [0, 9], "check_metadata": [0, 9], "collect_additional_output": [0, 9], "hash": [0, 6, 7, 9, 12, 20, 22, 23], "retrieve_valu": [0, 9], "containerspec": [0, 9], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 23, 24, 25, 27], "container_xarg": [0, 9], "imag": [0, 9, 22], "directori": [0, 1, 2, 4, 6, 7, 9, 12, 20, 22, 24], "dockerspec": [0, 9], "file": [0, 4, 6, 9, 12, 18, 19, 20, 22, 23, 24, 25], "functionspec": [0, 9], "lazyfield": [0, 9], "get_valu": [0, 9], "multiinputfil": [0, 9], "multiinputobj": [0, 9, 24], "convert": [0, 8, 9, 20, 22, 24], "multioutputfil": [0, 9], "multioutputobj": [0, 9, 24], "get_output_field": [0, 9], "output": [0, 1, 2, 4, 5, 6, 7, 9, 10, 18, 20, 22, 23, 24, 26, 27], "runtim": [0, 6, 9], "cpu_peak_perc": [0, 9], "rss_peak_gb": [0, 9], "vms_peak_gb": [0, 9], "runtimespec": [0, 9], "network": [0, 9], "outdir": [0, 5, 9], "shelloutspec": [0, 9, 25], "return_cod": [0, 9], "stderr": [0, 9, 25], "stdout": [0, 9, 25], "shellspec": [0, 9, 22, 24], "arg": [0, 1, 3, 6, 9, 12, 22], "singularityspec": [0, 9], "specinfo": [0, 1, 4, 9, 12, 22, 24, 25], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 24, 25, 26], "field": [0, 1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 25, 26, 27], "name": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 22, 24, 25], "taskhook": [0, 9], "post_run": [0, 9], "post_run_task": [0, 9], "pre_run": [0, 9], "pre_run_task": [0, 9], "reset": [0, 9], "attr_field": [0, 9], "attr_fields_dict": [0, 9], "donoth": [0, 9], "path_to_str": [0, 9], "state": [0, 1, 4, 8, 11, 12, 18, 20, 23, 27], "splitter": [0, 4, 8, 10, 20, 21, 22, 27], "splitter_rpn_compact": [0, 10], "splitter_rpn": [0, 8, 10], "splitter_fin": [0, 10], "other_st": [0, 8, 10], "inner_input": [0, 8, 10], "states_ind": [0, 10], "states_v": [0, 10], "inputs_ind": [0, 10], "group_for_input": [0, 8, 10], "group_for_inputs_fin": [0, 10], "groups_stack_fin": [0, 10], "final_combined_ind_map": [0, 10], "combiner_valid": [0, 10], "current_combin": [0, 10], "current_combiner_al": [0, 10], "current_splitt": [0, 10], "current_splitter_rpn": [0, 10], "prepare_input": [0, 10], "prepare_st": [0, 10], "prepare_states_combined_ind": [0, 10], "prepare_states_ind": [0, 10], "prepare_states_v": [0, 10], "prev_state_combin": [0, 10], "prev_state_combiner_al": [0, 10], "prev_state_splitt": [0, 10], "prev_state_splitter_rpn": [0, 10], "prev_state_splitter_rpn_compact": [0, 10], "set_input_group": [0, 10], "splitter_rpn_fin": [0, 10], "splitter_valid": [0, 10], "update_connect": [0, 10], "get_runnable_task": [0, 11], "is_runn": [0, 11], "prepare_runnable_with_st": [0, 11], "task": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 13, 15, 20, 23, 24, 25, 26, 27], "containertask": [0, 1, 12, 22, 24], "bind_path": [0, 12], "bind": [0, 12, 20], "container_check": [0, 12], "functiontask": [0, 12, 15, 20, 22], "singularitytask": [0, 12, 20, 22], "split_cmd": [0, 12], "worker": [0, 1, 11, 20], "concurrentfutureswork": [0, 13], "exec_as_coro": [0, 13], "run_el": [0, 13], "daskwork": [0, 13], "exec_dask": [0, 13], "distributedwork": [0, 13], "fetch_finish": [0, 13], "max_job": [0, 13], "sgework": [0, 13], "check_for_results_fil": [0, 13], "get_output_by_task_pkl": [0, 13], "get_tasks_to_run": [0, 13], "submit_array_job": [0, 13], "serialwork": [0, 13], "exec_seri": [0, 13], "slurmwork": [0, 13], "mark": [0, 5, 22], "function": [0, 7, 8, 9, 14, 19, 20, 23, 24, 25, 27], "annot": [0, 15, 22], "util": [0, 1, 2], "messeng": [0, 1, 2, 4, 12, 17], "filemesseng": [0, 18], "send": [0, 1, 2, 11, 18], "printmesseng": [0, 18], "remoterestmesseng": [0, 18], "runtimehook": [0, 18], "resource_monitor_post_stop": [0, 18], "resource_monitor_pre_start": [0, 18], "task_execute_post_exit": [0, 18], "task_execute_pre_entri": [0, 18], "task_run_entri": [0, 18], "task_run_exit": [0, 18], "collect_messag": [0, 18], "gen_uuid": [0, 18], "make_messag": [0, 18], "now": [0, 18, 20, 22], "send_messag": [0, 18], "profil": [0, 17], "resourcemonitor": [0, 19], "fname": [0, 6, 7, 19], "run": [0, 1, 4, 5, 6, 7, 9, 10, 11, 13, 19, 20, 22, 23], "stop": [0, 19], "get_max_resources_us": [0, 19], "get_system_total_memory_gb": [0, 19], "log_nodes_cb": [0, 19], "valu": [1, 4, 6, 7, 8, 9, 10, 18, 19, 20, 21, 22, 23, 24, 25, 26], "qualnam": [1, 18], "type": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 25, 27], "start": [1, 2, 5, 18, 19, 24], "1": [1, 4, 6, 7, 8, 9, 11, 13, 18, 22, 23, 24, 26], "boundari": [1, 18], "3": [1, 6, 11, 18, 23, 26], "track": [1, 2, 9, 10, 12, 18, 19, 22, 23], "proven": [1, 2, 12, 18, 23], "do": [1, 11, 18, 25], "onli": [1, 4, 6, 7, 10, 11, 12, 18, 21, 24, 25, 26], "container_info": [1, 3, 12, 22], "kwarg": [1, 3, 4, 6, 9, 11, 12, 13, 18], "extend": [1, 12, 22, 23, 26], "shell": [1, 3, 9, 12, 23, 24, 25, 27], "command": [1, 3, 5, 6, 7, 9, 12, 23, 24, 25, 27], "container": [1, 9, 12], "docker": [1, 7, 9, 12, 22, 23], "properti": [1, 4, 5, 9, 10, 12, 19], "get": [1, 4, 5, 6, 8, 9, 10, 12, 18, 19, 20, 22, 26], "specif": [1, 4, 6, 9, 10, 12, 18, 19, 20, 21, 22, 23, 26, 27], "cli": [1, 12], "argument": [1, 12, 22, 24], "return": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 24, 25], "list": [1, 4, 5, 6, 7, 8, 9, 10, 12, 20, 21, 22, 24, 25, 26], "ha": [1, 4, 5, 7, 10, 11, 12, 21, 22, 23, 24, 25, 26], "wrap": [1, 12], "element": [1, 4, 10, 12, 20, 21, 22, 24, 25, 26], "actual": [1, 12], "line": [1, 6, 9, 12, 22, 23], "submit": [1, 12], "plugin": [1, 6, 11], "cf": [1, 11], "object": [1, 2, 4, 5, 6, 7, 9, 10, 11, 13, 18, 22, 24, 25], "backend": [1, 11], "previous": [1, 5, 11, 23], "loop": [1, 6, 11, 13, 23, 27], "async": [1, 6, 11, 13], "runnabl": [1, 5, 11, 13, 22, 26], "wait": [1, 11], "rerun": [1, 4, 6, 11, 12, 13, 20], "thi": [1, 4, 5, 6, 7, 8, 9, 11, 13, 19, 21, 22, 23, 24, 25, 26], "coroutin": [1, 6, 11, 13], "handl": [1, 2, 11, 20, 23], "expans": [1, 11], "remov": [1, 5, 7, 8, 10, 11, 20, 24, 25], "ani": [1, 4, 5, 9, 11, 19, 22, 23, 24, 25], "from": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 20, 21, 22, 23, 24, 25, 26], "If": [1, 2, 4, 6, 7, 11, 24, 25], "set": [1, 4, 6, 7, 9, 10, 11, 13, 19, 20, 21, 22, 23, 26], "default": [1, 7, 9, 11, 24, 25], "aggreg": [1, 11, 24], "them": [1, 5, 6, 11, 20], "true": [1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 18, 22, 24, 25], "complet": [1, 11, 22], "paramet": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 26], "instanc": [1, 4, 6, 11, 22], "bool": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 18, 22, 24, 25], "await": [1, 11, 13], "futur": [1, 11, 13, 20], "befor": [1, 4, 10, 11, 24], "wf": [1, 6, 9, 11, 20, 22], "expand": [1, 11, 20], "stateless": [1, 11, 26], "method": [1, 4, 5, 7, 11, 20, 21, 22, 26], "reach": [1, 11], "_run_task": [1, 11], "comput": [1, 4, 7, 9, 11, 23], "should": [1, 7, 8, 9, 10, 11, 22, 24, 25], "call": [1, 11, 19, 21, 22, 23, 24, 26], "onc": [1, 11], "per": [1, 11], "serv": [1, 11, 22], "bridg": [1, 11], "between": [1, 5, 10, 11, 22, 23, 24], "sync": [1, 11], "land": [1, 11], "There": [1, 11, 22, 24], "ar": [1, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 21, 22, 23, 24, 25, 26], "4": [1, 11, 18, 23], "potenti": [1, 11], "path": [1, 4, 5, 6, 7, 9, 11, 12, 18, 20, 24], "differ": [1, 7, 11, 22, 23, 25, 26], "than": [1, 7, 11, 22, 25], "without": [1, 4, 5, 7, 10, 11, 22], "python": [1, 6, 11, 12, 13, 20, 22, 23, 24, 26], "10": [1, 11], "minimum": [1, 11], "probabl": [1, 11], "refactor": [1, 11, 20], "us": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 20, 21, 22, 23, 24, 25, 26], "structur": [1, 4, 5, 9, 11], "pattern": [1, 11], "match": [1, 11], "str": [1, 4, 6, 7, 9, 10, 12, 18, 22, 24, 25], "messenger_arg": [1, 2, 4, 12], "propagate_rerun": [1, 4, 20], "A": [1, 2, 4, 5, 6, 7, 9, 10, 13, 18, 19, 22, 24, 25, 26], "composit": [1, 4], "ad": [1, 4, 5, 6, 8, 20, 22, 25, 27], "calcul": [1, 4, 5, 6, 10, 20], "uniqu": [1, 4, 6, 18], "creat": [1, 2, 4, 5, 6, 7, 8, 10, 16, 20, 22, 23, 24, 25, 26], "need": [1, 4, 5, 9, 10, 21, 26], "have": [1, 4, 6, 7, 8, 10, 22, 25, 26], "input": [1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 25, 27], "etc": [1, 4, 24], "detail": [1, 4, 5, 22], "connect": [1, 4, 5, 8, 10, 22], "particular": [1, 2, 4, 9], "exist": [1, 4, 22, 23, 24, 25], "self": [1, 2, 4, 5, 10], "descript": [1, 4, 5, 20, 24, 25], "simpl": [1, 4, 5, 6, 20, 22, 24], "export": [1, 4, 5], "dotfil": [1, 4, 5, 20], "option": [1, 2, 4, 10, 18, 22, 24, 26], "other": [1, 4, 5, 7, 8, 20, 22, 23, 24, 25, 26], "format": [1, 4, 5, 6, 18, 20], "represent": [1, 4, 10], "write": [1, 4, 6, 12, 18], "todo": [1, 4, 6, 9, 18], "keep": [2, 7, 9, 10, 19], "inform": [2, 6, 10, 18, 24, 25], "develop": [2, 23], "determin": [2, 10], "whether": [2, 4, 7, 13], "enabl": [2, 20, 23, 24], "obj": [2, 4, 5, 6, 7, 11, 18], "check": [2, 4, 5, 7, 9, 11, 20, 24], "boolean": 2, "AND": 2, "oudit_flag": 2, "messag": [2, 18, 23], "dict": [2, 4, 6, 7, 10, 12, 18, 24], "json": [2, 12, 18, 19, 23], "ld": [2, 18, 23], "sent": [2, 24, 25], "end": [2, 8, 19, 26], "odir": 2, "record": [2, 18, 19], "until": [2, 6, 13], "case": [2, 6], "insid": [2, 24], "o": [2, 6, 7, 9, 18, 20, 24], "pathlik": [2, 6, 9, 18], "descriptor": [3, 20], "basic": [4, 9, 21, 22], "process": [4, 6, 9, 10, 12, 18, 19, 20], "gener": [4, 6, 8, 9, 18, 22, 23], "step": 4, "which": [4, 5, 6, 7, 8, 10], "both": [4, 22], "elemntari": 4, "inherit": [4, 9, 22], "what": 4, "avail": [4, 6, 9, 10, 20], "locat": 4, "cach": [4, 6, 23], "sourc": [4, 23], "accept": [4, 19, 20], "checkpoint": 4, "restart": 4, "state_index": [4, 9], "replac": [4, 7], "recreat": 4, "overwrit": 4, "parameter": 4, "one": [4, 6, 8, 9, 13, 21, 22, 24, 26], "more": [4, 20, 22, 24, 26], "previou": [4, 8, 10, 21, 24], "been": [4, 23], "final": [4, 8, 10, 13, 21], "store": [4, 23], "rais": [4, 7, 20, 25], "an": [4, 6, 7, 9, 13, 20, 21, 22, 23, 24, 25, 26], "doesn": [4, 10, 24], "t": [4, 10, 20, 24], "depend": [4, 8, 10], "provid": [4, 6, 8, 9, 21, 22, 23, 24, 25, 26], "ind": [4, 6], "collect": [4, 6, 9, 16, 18, 23], "requir": [4, 8, 9, 20, 22, 23, 24, 25, 26], "returnhelp": 4, "print": [4, 6, 18], "filesystem": [4, 7, 12], "where": [4, 6, 21, 23, 26], "written": [4, 7, 21, 23], "": [4, 6, 8, 10, 13, 18, 20, 24, 25, 26, 27], "everyth": 4, "see": [4, 5, 25], "pickl": [4, 6, 20], "full": [4, 7, 10, 20, 21, 24], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 6, 9, 15, 18, 19, 24], "index": [4, 6, 23], "multipl": [4, 20, 21, 24, 26], "val": [4, 8], "togeth": [4, 7, 10, 21, 23, 24, 25], "indic": [4, 10, 20], "parametr": 4, "over": [4, 7, 10, 22, 23, 27], "dimens": [4, 8, 10], "assum": [4, 7, 8, 26], "so": [4, 19, 20, 22, 26], "most": [4, 22, 26], "outer": [4, 10, 21, 27], "dim": 4, "id": [4, 19], "number": [4, 6, 8, 10, 13, 20], "slurm": [4, 13, 20], "script": [4, 22], "lazi": [4, 9, 22], "look": [4, 6], "like": [4, 22], "data": [5, 6, 7, 9, 26], "support": [5, 6, 7, 20, 21, 22, 23, 24, 26], "direct": [5, 22, 23], "new_edg": 5, "new": [5, 6, 10, 19, 23, 25, 27], "new_edge_detail": 5, "fill": 5, "_nodes_detail": 5, "new_nod": 5, "insert": [5, 24], "maximum": [5, 13], "histori": 5, "predecessor": 5, "duplic": 5, "dictionari": [5, 8, 10, 18, 19, 24, 25], "same": [5, 7, 10, 21, 25, 26], "graph_det": 5, "nest": [5, 20, 22, 23, 27], "includ": [5, 7, 10, 22, 24, 25], "link": [5, 7, 18, 24], "pair": [5, 7, 8], "thei": [5, 6, 21, 26], "ext": [5, 7], "png": 5, "equir": 5, "dot": [5, 20], "current": [5, 6, 10, 20], "each": [5, 8, 10, 21, 22, 23, 24, 25, 26], "check_readi": 5, "re": [5, 10], "doe": [5, 7, 19, 24, 26], "remove_node_connect": 5, "_node_wip": 5, "when": [5, 7, 8, 9, 10, 18, 20, 21, 22, 26], "refer": 5, "readi": 5, "also": [5, 7, 9, 10, 20, 21, 24, 26], "prune": 5, "follow": [5, 6, 21, 22, 26], "presort": 5, "either": [5, 7], "administr": 6, "framework": [6, 23], "lockfil": 6, "wrapper": [6, 13], "filelock": 6, "softfilelock": 6, "make": [6, 21, 23], "work": [6, 12, 20, 22, 23, 26], "asyncio": [6, 13], "argstr": [6, 22, 24], "value_upd": 6, "field_nam": [6, 9], "updat": [6, 7, 9, 10, 15, 20], "wf_path": 6, "given": [6, 7, 9, 19], "string": [6, 7, 9, 12, 19, 24], "attribut": [6, 20, 22, 26], "custom": [6, 8, 20, 22, 24, 25], "valid": [6, 10, 20, 27], "take": [6, 7, 9, 21, 24, 25], "account": [6, 9], "ty": [6, 9], "union": [6, 24], "level": [6, 21], "depth": [6, 23], "addit": [6, 8, 9, 21, 22, 23, 24, 25, 26], "allowe_valu": 6, "tuple2list": 6, "whatev": 6, "exampl": [6, 7, 15, 21, 22, 24, 25, 26], "abc": 6, "b": [6, 10], "c": [6, 21, 23], "tupl": [6, 7, 9, 10, 12, 20, 24, 25, 26], "5": [6, 18, 19, 22, 23], "cmd": [6, 12], "strip": 6, "event": 6, "unless": [6, 24, 25], "alreadi": [6, 7, 20], "extract": [6, 22], "cpu": [6, 9, 20], "total": [6, 19], "system": [6, 7, 12, 13, 19, 20], "n_proc": [6, 13], "eventloop": 6, "tp": 6, "metadata": [6, 9, 22, 27], "precalcul": [6, 7], "recurs": [6, 7], "task_pkl": [6, 13], "load": [6, 20], "proper": [6, 20], "restor": 6, "identifi": [6, 18], "order": [6, 10, 21, 22, 24, 25, 26], "prioriti": 6, "names_onli": 6, "posit": [6, 22, 24], "convent": 6, "lowest": 6, "highest": 6, "unspecifi": 6, "neg": [6, 24], "d": 6, "e": [6, 7, 9, 10, 18, 21, 22, 24, 25, 26], "f": [6, 7], "visit": 6, "its": [6, 26], "interfac": [6, 10, 13, 20, 23], "hide_displai": 6, "captur": [6, 23], "standard": [6, 8, 9, 18], "displai": 6, "arriv": 6, "stream": 6, "read": [6, 7, 12, 20], "eof": 6, "discuss": 6, "stackoverflow": 6, "error_path": 6, "task_path": 6, "name_prefix": 6, "environ": [6, 12, 22], "port": 7, "after": [7, 10, 21, 22, 26], "part": [7, 10, 12, 23, 24, 25], "were": [7, 20, 23], "relat": [7, 10, 26], "py2": 7, "originalfil": 7, "newfil": 7, "create_new": 7, "use_hardlink": 7, "copy_related_fil": 7, "can": [7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26], "hard": [7, 24], "instead": [7, 20, 25], "symbol": 7, "symlink": 7, "regular": 7, "dest": 7, "unlink": 7, "diff": 7, "can_hardlink": 7, "hardlink": 7, "can_symlink": 7, "origin": [7, 8, 12, 23, 26], "specifi": [7, 8, 10, 12, 20, 21, 22, 24, 25], "posix": 7, "abl": 7, "preced": 7, "defin": [7, 22], "implement": [7, 9, 12, 13, 20, 23], "filelist": 7, "destin": 7, "length": [7, 8, 26], "greater": [7, 23], "filenam": [7, 19], "prefix": 7, "suffix": 7, "newpath": 7, "use_ext": 7, "manipul": [7, 23], "mai": [7, 21, 23], "charact": 7, "prepend": 7, "append": [7, 18], "extens": [7, 20, 24, 25], "absolut": 7, "modifi": 7, "import": [7, 10, 15, 21, 22], "pytest": 7, "sy": 7, "platform": 7, "startswith": 7, "win": 7, "skip": 7, "foo": 7, "nii": 7, "gz": 7, "pre": 7, "post": [7, 18], "tmp": 7, "prefoopost": 7, "include_this_fil": 7, "As": [7, 22, 24, 25], "g": [7, 9, 10, 22, 24, 25], "nifti": 7, "analyz": 7, "spm": [7, 23], "afni": [7, 23], "find": 7, "filetyp": 7, "dirpath": 7, "crypto": 7, "built": 7, "openssl_sha256": 7, "ignore_hidden_fil": 7, "ignore_hidden_dir": 7, "raise_notfound": 7, "content": 7, "everi": [7, 8, 10, 24], "singl": [7, 9, 10, 18, 20, 21, 22], "travers": 7, "cryptograph": 7, "ignor": 7, "begin": 7, "filenotfound": 7, "except": [7, 8, 20], "afil": 7, "chunk_len": 7, "8192": 7, "item": 7, "otherwis": [7, 19, 25], "cif": 7, "mount": [7, 12], "host": 7, "On": 7, "window": [7, 20], "through": [7, 26], "share": [7, 22, 23], "minshal": 7, "french": 7, "text": 7, "driver": 7, "expos": 7, "we": [7, 22, 24], "found": 7, "under": 7, "concurr": [7, 13, 20], "access": 7, "featur": [7, 22, 23, 26], "failur": [7, 20], "recent": 7, "lead": 7, "inconsist": 7, "behavior": 7, "filenotfounderror": 7, "disabl": [7, 24], "hdr": 7, "img": 7, "mat": 7, "brik": 7, "head": 7, "neuroimag": [7, 23], "interpret": 7, "pth": 7, "home": 7, "subject": 7, "state_ind": 7, "map_copyfil": 7, "templat": [7, 9, 16, 20, 22, 24, 25], "present": 7, "inputs_dict_st": 7, "spec_typ": 7, "inputs_dict": 7, "output_file_templ": [7, 22, 24, 25], "mostli": 8, "group": [8, 10, 22, 23, 27], "groups_stack": 8, "kei": [8, 10, 22, 23, 24, 26], "axi": [8, 10], "ax": [8, 10], "cur_depth": 8, "max_depth": 8, "inp": [8, 10], "shape": 8, "iter": 8, "split_it": 8, "prescrib": 8, "inputs_to_remov": 8, "due": [8, 10], "mutat": 8, "revers": [8, 24], "polish": 8, "notat": [8, 10], "recurr": 8, "algorithm": [8, 23], "perform": [8, 19, 26], "convers": [8, 24], "time": [8, 9, 23], "stack": [8, 10], "state_field": [8, 10], "translat": 8, "user": [8, 20, 21, 22, 23, 24, 25, 26], "impos": 8, "unwrap": [8, 10], "dataclass": [9, 20], "medatada": 9, "xor": [9, 24], "fulfil": 9, "mandatori": [9, 22, 24, 25], "point": [9, 12, 18, 22], "refin": 9, "design": [9, 23], "folder": 9, "invok": 9, "attr_typ": 9, "promis": 9, "chang": [9, 20, 24, 25], "classmethod": 9, "el": 9, "regard": 9, "float": [9, 15, 19, 22, 24], "repres": [9, 10, 21, 22, 23, 24, 26], "peak": 9, "consumpt": 9, "physic": 9, "ram": [9, 19], "virtual": 9, "memori": [9, 19, 20], "cwl": 9, "inlinejavascriptrequir": 9, "schemadefrequir": 9, "dockerrequir": 9, "softwarerequir": 9, "initialworkdirrequir": 9, "envvarrequir": 9, "shellcommandrequir": 9, "resourcerequir": 9, "inlinescriptrequir": 9, "shelltask": [9, 20], "exit": 9, "code": [9, 18, 20, 23], "pars": [9, 11], "singular": [9, 12, 20, 22, 23], "_noth": 9, "noth": [9, 20, 24, 25], "least": 9, "callabl": [9, 12, 25], "hook": [9, 18], "exclude_nam": 9, "reduc": [10, 22, 23, 26], "about": [10, 24, 25], "scalar": [10, 27], "rpn": 10, "compact": [10, 18], "_na": 10, "relev": 10, "could": [10, 24], "partial": [10, 23], "associ": [10, 23], "correct": 10, "propag": 10, "explicitli": 10, "had": 10, "prepar": 10, "merg": [10, 26], "inner": [10, 20, 21], "elements_to_remove_comb": 10, "hlpst": 10, "evalu": [10, 26], "prev": 10, "come": 10, "art": 10, "_nb": 10, "especi": 10, "address": [10, 23], "variabl": [10, 12, 20], "new_other_st": 10, "new_combin": 10, "within": [11, 21, 22], "neurodock": 12, "conda": 12, "env": 12, "niceman": 12, "config": 12, "intern": [12, 13, 19], "extern": [12, 23], "callback": [12, 19], "resum": 12, "dmtcp": 12, "local": [12, 24], "fragment": 12, "remot": [12, 18], "server": 12, "isol": 12, "bound": 12, "mode": [12, 20], "opt": 12, "py": [12, 13], "meth": 12, "container_typ": 12, "func": [12, 15], "separ": [12, 16, 20, 22, 24, 25], "respect": [12, 22], "quot": 12, "thereof": 12, "parallel": 13, "pool": 13, "dask": [13, 20], "distribut": [13, 20, 23], "experiment": [13, 20], "limit": [13, 20, 22], "test": [13, 20], "finish": 13, "submiss": 13, "attr": [13, 20, 24, 25], "pend": 13, "job": 13, "poll_delai": 13, "qsub_arg": 13, "write_output_fil": 13, "max_job_array_length": 13, "50": 13, "indirect_submit_host": 13, "max_thread": 13, "poll_for_result_fil": 13, "default_threads_per_task": 13, "polls_before_checking_evict": 13, "60": 13, "collect_jobs_delai": 13, "30": 13, "default_qsub_arg": 13, "max_mem_fre": 13, "jobid": 13, "threads_request": 13, "task_qsub_arg": 13, "mem_fre": 13, "api": [13, 20, 23], "sarg": 13, "tasks_to_run": 13, "error_fil": 13, "linearli": 13, "sbatch_arg": 13, "decor": [15, 22, 23], "appli": [15, 21], "def": [15, 22], "squar": [15, 26], "promot": 15, "namespac": [16, 20], "reserv": 16, "manag": [16, 20, 26], "To": 16, "pleas": 16, "fork": 16, "redirect": 18, "truncat": 18, "open": [18, 23], "abstract": 18, "rest": 18, "endpoint": 18, "statu": [18, 19], "request": 18, "intenum": 18, "allow": [18, 20, 21, 22, 23, 24], "6": [18, 23], "collected_path": 18, "message_path": 18, "ld_op": 18, "compil": 18, "place": 18, "pld": 18, "jsonld": 18, "context": 18, "build": [18, 23, 24, 25], "non": 18, "timestamp": 18, "nidm": 18, "log": [18, 19], "pid": 19, "interv": 19, "logdir": 19, "thread": 19, "certain": 19, "frequenc": 19, "mem_mb": 19, "num_thread": 19, "pyfunc": 19, "integ": [19, 24], "high": 19, "watermark": 19, "far": 19, "dure": 19, "mb": 19, "gb": 19, "statist": [19, 22], "pipelin": [19, 23], "being": [19, 23], "consid": [19, 24], "info": 19, "logger": 19, "fix": 20, "issu": 20, "guid": [20, 23], "docstr": 20, "messang": 20, "syntax": [20, 22, 24, 25, 26], "newer": 20, "padra": 20, "improv": [20, 22], "adapt": 20, "better": 20, "switch": 20, "pkg_resourc": 20, "declare_namespac": 20, "stdlib": 20, "pkgutil": 20, "extend_path": 20, "move": 20, "readm": 20, "rst": 20, "declar": [20, 22], "ensur": [20, 23], "edit": 20, "instal": 20, "conflict": 20, "mention": [20, 24, 25], "txt": 20, "tutori": 20, "repo": 20, "codecov": 20, "_connect": 20, "numpi": [20, 22], "arrai": 20, "to_job": 20, "kept": 20, "standalon": [20, 22, 23], "create_pyscript": 20, "simplifi": 20, "report": 20, "fli": 20, "make_class": 20, "properli": 20, "azur": 20, "ci": 20, "etelementri": 20, "verbos": 20, "reorgan": 20, "small": 20, "some": [20, 23], "osx": 20, "sto": 20, "travi": 20, "right": 20, "pass": [20, 21, 22, 23, 24, 25], "test_rerun": 20, "dimension": [20, 21], "how": [20, 22], "much": 20, "sphinx": 20, "document": 20, "contribut": 20, "md": 20, "empti": [20, 24], "fail": 20, "big": 20, "next": [20, 22, 26], "lzout": [20, 22], "all_": 20, "dataflow": [20, 21, 26, 27], "creation": 20, "notebook": 20, "concept": [20, 21, 22, 23, 26], "initi": 20, "In": [21, 22, 23, 24, 25, 26], "achiev": 21, "note": [21, 23], "sens": 21, "x": [21, 22, 26], "x_1": [21, 26], "x_2": [21, 26], "x_n": [21, 26], "mapsto": [21, 26], "out": [21, 22], "out_": 21, "comb": 21, "x_i": 21, "situat": 21, "variou": 21, "wai": [21, 26], "section": [21, 22, 24, 25, 26], "might": [21, 22, 23], "want": [21, 24, 25], "y": [21, 22, 26], "would": [21, 26], "two": [21, 22, 26], "y1": 21, "y2": 21, "y_m": [21, 26], "longmapsto": [21, 26], "y_1": [21, 26], "howev": [21, 24], "One": [21, 22, 26], "These": [21, 22, 23, 26], "mix": 21, "describ": [22, 24, 26], "thu": 22, "construct": [22, 23], "dual": 22, "sever": [22, 23, 24], "applic": [22, 23, 26], "librari": [22, 23], "interact": [22, 23], "termin": 22, "np": 22, "fft": 22, "ndarrai": 22, "fft_task": 22, "random": 22, "rand": 22, "512": 22, "anoth": [22, 23], "arbitrari": [22, 23, 26], "mean": [22, 25], "std": 22, "mean_dev": 22, "my_data": 22, "st": 22, "stdev": 22, "facilit": [22, 23], "downstream": 22, "pwd": 22, "l": 22, "my_dir": 22, "accommod": 22, "complex": [22, 24, 26], "fsl": [22, 23], "bet": [22, 24], "brain": 22, "tool": [22, 23], "input_fil": 22, "output_fil": 22, "m": [22, 24], "treat": [22, 24], "shown": 22, "even": 22, "out_fil": [22, 24], "bet_input_spec": [22, 24], "in_fil": [22, 24], "help_str": [22, 24, 25], "_br": [22, 24], "mask": [22, 24], "binari": [22, 24], "child": 22, "parent": [22, 24, 25], "softwar": [22, 23], "extrem": 22, "project": [22, 23], "encapsul": 22, "technologi": 22, "scientif": [22, 23], "reproduc": [22, 23], "behind": [22, 23], "directli": 22, "automat": 22, "equival": 22, "busybox": 22, "subclass": 22, "act": 22, "hashabl": 22, "unit": 22, "unlik": 22, "emb": 22, "acycl": [22, 23], "simpli": 22, "special": [22, 24, 26], "assign": 22, "rather": 22, "mult": 22, "mlt": 22, "lzin": 22, "add2": 22, "control": [22, 26], "heart": 22, "power": [22, 23], "formal": 22, "Its": 22, "recombin": [22, 23], "task_with_st": 22, "respons": 22, "back": 22, "while": [22, 23], "illustr": 22, "scalabl": 22, "lightweight": 23, "commun": 23, "purpos": 23, "domain": 23, "often": 23, "sophist": 23, "analys": 23, "encompass": 23, "larg": 23, "necessarili": 23, "author": 23, "program": 23, "common": 23, "practic": 23, "semi": 23, "manual": 23, "scientist": 23, "approach": 23, "conceptu": 23, "easi": 23, "consum": 23, "prone": 23, "difficult": 23, "consist": 23, "demand": 23, "organ": 23, "fulli": 23, "autom": 23, "wa": [23, 24, 25, 26], "motiv": 23, "second": [23, 26], "uniform": 23, "compon": [23, 27], "born": 23, "decad": 23, "ant": 23, "freesurf": 23, "flexibl": [23, 26], "made": 23, "ideal": 23, "basi": 23, "popular": 23, "preprocess": 23, "fmriprep": 23, "pac": 23, "meant": 23, "eas": 23, "mind": 23, "itself": 23, "goal": [23, 26], "well": 23, "reusabl": 23, "customiz": 23, "compos": 23, "encourag": 23, "similar": [23, 26], "model": 23, "global": 23, "reus": 23, "alongsid": 23, "integr": 23, "nativ": 23, "via": 23, "mechan": 23, "activ": 23, "releas": 23, "8": 23, "7": 23, "programm": 23, "subpackag": 23, "search": 23, "page": 23, "let": 24, "alwai": [24, 25], "you": [24, 25], "think": [24, 25], "usual": [24, 25], "top": [24, 25], "your": [24, 25], "cover": [24, 25], "customis": [24, 25], "three": [24, 25], "But": 24, "below": 24, "field1": 24, "field1_nam": 24, "ib": [24, 25], "field1_typ": 24, "shorter": 24, "abov": 24, "short": [24, 25], "sep": 24, "v": 24, "inp_field": 24, "nonneg": 24, "allowed_valu": 24, "mutual": 24, "exclus": 24, "possibl": [24, 25], "container_path": 24, "file1": [24, 25], "output_field_nam": [24, 25], "keep_extens": [24, 25], "readonli": 24, "flda": 24, "fldb": 24, "formatt": 24, "entir": [24, 25], "allowev_valu": 24, "out1": 25, "inp1": [25, 26], "inp2": [25, 26], "similarli": 25, "recogn": 25, "main": 26, "distinguish": 26, "typic": 26, "involv": 26, "signific": 26, "overhead": 26, "up": 26, "simplest": 26, "therefor": 26, "diagram": 26, "colour": 26, "whenev": 26, "complic": 26, "wise": 26, "parenthesi": 26, "y_2": 26, "y_n": 26, "bracket": 26, "schemat": 26, "inp3": 26, "pairwis": 26, "explain": 26}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "check_latest_version"], [1, 0, 0, "-", "engine"], [14, 0, 0, "-", "mark"], [0, 1, 1, "", "set_input_validator"], [16, 0, 0, "-", "tasks"], [17, 0, 0, "-", "utils"]], "pydra.engine": [[1, 2, 1, "", "AuditFlag"], [1, 2, 1, "", "DockerTask"], [1, 2, 1, "", "ShellCommandTask"], [1, 2, 1, "", "Submitter"], [1, 2, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "graph"], [6, 0, 0, "-", "helpers"], [7, 0, 0, "-", "helpers_file"], [8, 0, 0, "-", "helpers_state"], [9, 0, 0, "-", "specs"], [10, 0, 0, "-", "state"], [11, 0, 0, "-", "submitter"], [12, 0, 0, "-", "task"], [13, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 3, 1, "", "ALL"], [1, 3, 1, "", "NONE"], [1, 3, 1, "", "PROV"], [1, 3, 1, "", "RESOURCE"]], "pydra.engine.DockerTask": [[1, 4, 1, "", "container_args"], [1, 3, 1, "", "init"]], "pydra.engine.ShellCommandTask": [[1, 4, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 3, 1, "", "input_spec"], [1, 3, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 5, 1, "", "close"], [1, 5, 1, "", "expand_runnable"], [1, 5, 1, "", "expand_workflow"], [1, 5, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 5, 1, "", "add"], [1, 4, 1, "", "checksum"], [1, 5, 1, "", "create_connections"], [1, 5, 1, "", "create_dotfile"], [1, 4, 1, "", "graph_sorted"], [1, 4, 1, "", "nodes"], [1, 5, 1, "", "set_output"]], "pydra.engine.audit": [[2, 2, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 5, 1, "", "audit_check"], [2, 5, 1, "", "audit_message"], [2, 5, 1, "", "audit_task"], [2, 5, 1, "", "finalize_audit"], [2, 5, 1, "", "monitor"], [2, 5, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 2, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 2, 1, "", "TaskBase"], [4, 2, 1, "", "Workflow"], [4, 1, 1, "", "is_lazy"], [4, 1, 1, "", "is_task"], [4, 1, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 3, 1, "", "audit_flags"], [4, 4, 1, "", "cache_dir"], [4, 4, 1, "", "cache_locations"], [4, 4, 1, "", "can_resume"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "checksum_states"], [4, 5, 1, "", "combine"], [4, 4, 1, "", "cont_dim"], [4, 4, 1, "", "done"], [4, 4, 1, "", "errored"], [4, 4, 1, "", "generated_output_names"], [4, 5, 1, "", "get_input_el"], [4, 5, 1, "", "help"], [4, 4, 1, "", "output_dir"], [4, 4, 1, "", "output_names"], [4, 5, 1, "", "pickle_task"], [4, 5, 1, "", "result"], [4, 5, 1, "", "set_state"], [4, 5, 1, "", "split"], [4, 4, 1, "", "uid"], [4, 4, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 5, 1, "", "add"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "create_connections"], [4, 5, 1, "", "create_dotfile"], [4, 4, 1, "", "graph_sorted"], [4, 4, 1, "", "nodes"], [4, 5, 1, "", "set_output"]], "pydra.engine.graph": [[5, 2, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[5, 5, 1, "", "add_edges"], [5, 5, 1, "", "add_edges_description"], [5, 5, 1, "", "add_nodes"], [5, 5, 1, "", "calculate_max_paths"], [5, 5, 1, "", "copy"], [5, 5, 1, "", "create_dotfile_detailed"], [5, 5, 1, "", "create_dotfile_nested"], [5, 5, 1, "", "create_dotfile_simple"], [5, 4, 1, "", "edges"], [5, 4, 1, "", "edges_names"], [5, 5, 1, "", "export_graph"], [5, 4, 1, "", "nodes"], [5, 4, 1, "", "nodes_details"], [5, 4, 1, "", "nodes_names_map"], [5, 5, 1, "", "remove_nodes"], [5, 5, 1, "", "remove_nodes_connections"], [5, 5, 1, "", "remove_previous_connections"], [5, 5, 1, "", "remove_successors_nodes"], [5, 4, 1, "", "sorted_nodes"], [5, 4, 1, "", "sorted_nodes_names"], [5, 5, 1, "", "sorting"]], "pydra.engine.helpers": [[6, 2, 1, "", "PydraFileLock"], [6, 1, 1, "", "argstr_formatting"], [6, 1, 1, "", "copyfile_workflow"], [6, 1, 1, "", "create_checksum"], [6, 1, 1, "", "custom_validator"], [6, 1, 1, "", "ensure_list"], [6, 1, 1, "", "execute"], [6, 1, 1, "", "gather_runtime_info"], [6, 1, 1, "", "get_available_cpus"], [6, 1, 1, "", "get_open_loop"], [6, 1, 1, "", "hash_function"], [6, 1, 1, "", "hash_value"], [6, 1, 1, "", "load_and_run"], [6, 1, 1, "", "load_and_run_async"], [6, 1, 1, "", "load_result"], [6, 1, 1, "", "load_task"], [6, 1, 1, "", "make_klass"], [6, 1, 1, "", "output_from_inputfields"], [6, 1, 1, "", "position_sort"], [6, 1, 1, "", "print_help"], [6, 1, 1, "", "read_and_display"], [6, 1, 1, "", "read_and_display_async"], [6, 1, 1, "", "read_stream_and_display"], [6, 1, 1, "", "record_error"], [6, 1, 1, "", "save"], [6, 1, 1, "", "task_hash"]], "pydra.engine.helpers_file": [[7, 1, 1, "", "copyfile"], [7, 1, 1, "", "copyfile_input"], [7, 1, 1, "", "copyfiles"], [7, 1, 1, "", "ensure_list"], [7, 1, 1, "", "fname_presuffix"], [7, 1, 1, "", "get_related_files"], [7, 1, 1, "", "hash_dir"], [7, 1, 1, "", "hash_file"], [7, 1, 1, "", "is_container"], [7, 1, 1, "", "is_existing_file"], [7, 1, 1, "", "is_local_file"], [7, 1, 1, "", "on_cifs"], [7, 6, 1, "", "related_filetype_sets"], [7, 1, 1, "", "split_filename"], [7, 1, 1, "", "template_update"], [7, 1, 1, "", "template_update_single"]], "pydra.engine.helpers_state": [[8, 7, 1, "", "PydraStateError"], [8, 1, 1, "", "add_name_combiner"], [8, 1, 1, "", "add_name_splitter"], [8, 1, 1, "", "combine_final_groups"], [8, 1, 1, "", "converter_groups_to_input"], [8, 1, 1, "", "flatten"], [8, 1, 1, "", "input_shape"], [8, 1, 1, "", "inputs_types_to_dict"], [8, 1, 1, "", "iter_splits"], [8, 1, 1, "", "map_splits"], [8, 1, 1, "", "remove_inp_from_splitter_rpn"], [8, 1, 1, "", "rpn2splitter"], [8, 1, 1, "", "splits_groups"], [8, 1, 1, "", "splitter2rpn"]], "pydra.engine.specs": [[9, 2, 1, "", "BaseSpec"], [9, 2, 1, "", "ContainerSpec"], [9, 2, 1, "", "Directory"], [9, 2, 1, "", "DockerSpec"], [9, 2, 1, "", "File"], [9, 2, 1, "", "FunctionSpec"], [9, 2, 1, "", "LazyField"], [9, 2, 1, "", "MultiInputFile"], [9, 2, 1, "", "MultiInputObj"], [9, 2, 1, "", "MultiOutputFile"], [9, 2, 1, "", "MultiOutputObj"], [9, 2, 1, "", "Result"], [9, 2, 1, "", "Runtime"], [9, 2, 1, "", "RuntimeSpec"], [9, 2, 1, "", "ShellOutSpec"], [9, 2, 1, "", "ShellSpec"], [9, 2, 1, "", "SingularitySpec"], [9, 2, 1, "", "SpecInfo"], [9, 2, 1, "", "TaskHook"], [9, 1, 1, "", "attr_fields"], [9, 1, 1, "", "attr_fields_dict"], [9, 1, 1, "", "donothing"], [9, 1, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[9, 5, 1, "", "check_fields_input_spec"], [9, 5, 1, "", "check_metadata"], [9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "copyfile_input"], [9, 4, 1, "", "hash"], [9, 5, 1, "", "retrieve_values"], [9, 5, 1, "", "template_update"]], "pydra.engine.specs.ContainerSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "container_xargs"], [9, 3, 1, "", "image"]], "pydra.engine.specs.DockerSpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.FunctionSpec": [[9, 5, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[9, 5, 1, "", "get_value"]], "pydra.engine.specs.MultiInputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.MultiOutputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.Result": [[9, 3, 1, "", "errored"], [9, 5, 1, "", "get_output_field"], [9, 3, 1, "", "output"], [9, 3, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[9, 3, 1, "", "cpu_peak_percent"], [9, 3, 1, "", "rss_peak_gb"], [9, 3, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "network"], [9, 3, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "generated_output_names"], [9, 3, 1, "", "return_code"], [9, 3, 1, "", "stderr"], [9, 3, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[9, 3, 1, "", "args"], [9, 5, 1, "", "check_metadata"], [9, 3, 1, "", "executable"], [9, 5, 1, "", "retrieve_values"]], "pydra.engine.specs.SingularitySpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.SpecInfo": [[9, 3, 1, "", "bases"], [9, 3, 1, "", "fields"], [9, 3, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[9, 3, 1, "", "post_run"], [9, 3, 1, "", "post_run_task"], [9, 3, 1, "", "pre_run"], [9, 3, 1, "", "pre_run_task"], [9, 5, 1, "", "reset"]], "pydra.engine.state": [[10, 2, 1, "", "State"]], "pydra.engine.state.State": [[10, 4, 1, "id0", "combiner"], [10, 5, 1, "", "combiner_validation"], [10, 4, 1, "", "current_combiner"], [10, 4, 1, "", "current_combiner_all"], [10, 4, 1, "", "current_splitter"], [10, 4, 1, "", "current_splitter_rpn"], [10, 3, 1, "", "final_combined_ind_mapping"], [10, 3, 1, "", "group_for_inputs"], [10, 3, 1, "", "group_for_inputs_final"], [10, 3, 1, "", "groups_stack_final"], [10, 4, 1, "id1", "inner_inputs"], [10, 3, 1, "", "inputs_ind"], [10, 3, 1, "", "name"], [10, 4, 1, "id2", "other_states"], [10, 5, 1, "", "prepare_inputs"], [10, 5, 1, "", "prepare_states"], [10, 5, 1, "", "prepare_states_combined_ind"], [10, 5, 1, "", "prepare_states_ind"], [10, 5, 1, "", "prepare_states_val"], [10, 4, 1, "", "prev_state_combiner"], [10, 4, 1, "", "prev_state_combiner_all"], [10, 4, 1, "", "prev_state_splitter"], [10, 4, 1, "", "prev_state_splitter_rpn"], [10, 4, 1, "", "prev_state_splitter_rpn_compact"], [10, 5, 1, "", "set_input_groups"], [10, 5, 1, "", "splits"], [10, 4, 1, "id3", "splitter"], [10, 4, 1, "id4", "splitter_final"], [10, 4, 1, "id5", "splitter_rpn"], [10, 4, 1, "id6", "splitter_rpn_compact"], [10, 4, 1, "", "splitter_rpn_final"], [10, 5, 1, "", "splitter_validation"], [10, 3, 1, "", "states_ind"], [10, 3, 1, "", "states_val"], [10, 5, 1, "", "update_connections"]], "pydra.engine.submitter": [[11, 2, 1, "", "Submitter"], [11, 1, 1, "", "get_runnable_tasks"], [11, 1, 1, "", "is_runnable"], [11, 1, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[11, 5, 1, "", "close"], [11, 5, 1, "", "expand_runnable"], [11, 5, 1, "", "expand_workflow"], [11, 5, 1, "", "submit_from_call"]], "pydra.engine.task": [[12, 2, 1, "", "ContainerTask"], [12, 2, 1, "", "DockerTask"], [12, 2, 1, "", "FunctionTask"], [12, 2, 1, "", "ShellCommandTask"], [12, 2, 1, "", "SingularityTask"], [12, 1, 1, "", "split_cmd"]], "pydra.engine.task.ContainerTask": [[12, 5, 1, "", "bind_paths"], [12, 5, 1, "", "binds"], [12, 5, 1, "", "container_check"]], "pydra.engine.task.DockerTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.task.ShellCommandTask": [[12, 4, 1, "", "cmdline"], [12, 4, 1, "", "command_args"], [12, 3, 1, "", "input_spec"], [12, 3, 1, "", "output_spec"]], "pydra.engine.task.SingularityTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.workers": [[13, 2, 1, "", "ConcurrentFuturesWorker"], [13, 2, 1, "", "DaskWorker"], [13, 2, 1, "", "DistributedWorker"], [13, 2, 1, "", "SGEWorker"], [13, 2, 1, "", "SerialWorker"], [13, 2, 1, "", "SlurmWorker"], [13, 2, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_as_coro"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_dask"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[13, 5, 1, "", "fetch_finished"], [13, 3, 1, "", "max_jobs"]], "pydra.engine.workers.SGEWorker": [[13, 5, 1, "", "check_for_results_files"], [13, 5, 1, "", "get_output_by_task_pkl"], [13, 5, 1, "", "get_tasks_to_run"], [13, 5, 1, "", "run_el"], [13, 5, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_serial"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[13, 5, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.mark": [[15, 0, 0, "-", "functions"]], "pydra.mark.functions": [[15, 1, 1, "", "annotate"], [15, 1, 1, "", "task"]], "pydra.utils": [[18, 0, 0, "-", "messenger"], [19, 0, 0, "-", "profiler"]], "pydra.utils.messenger": [[18, 2, 1, "", "AuditFlag"], [18, 2, 1, "", "FileMessenger"], [18, 2, 1, "", "Messenger"], [18, 2, 1, "", "PrintMessenger"], [18, 2, 1, "", "RemoteRESTMessenger"], [18, 2, 1, "", "RuntimeHooks"], [18, 1, 1, "", "collect_messages"], [18, 1, 1, "", "gen_uuid"], [18, 1, 1, "", "make_message"], [18, 1, 1, "", "now"], [18, 1, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "NONE"], [18, 3, 1, "", "PROV"], [18, 3, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[18, 3, 1, "", "resource_monitor_post_stop"], [18, 3, 1, "", "resource_monitor_pre_start"], [18, 3, 1, "", "task_execute_post_exit"], [18, 3, 1, "", "task_execute_pre_entry"], [18, 3, 1, "", "task_run_entry"], [18, 3, 1, "", "task_run_exit"]], "pydra.utils.profiler": [[19, 2, 1, "", "ResourceMonitor"], [19, 1, 1, "", "get_max_resources_used"], [19, 1, 1, "", "get_system_total_memory_gb"], [19, 1, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[19, 4, 1, "", "fname"], [19, 5, 1, "", "run"], [19, 5, 1, "", "stop"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:property", "5": "py:method", "6": "py:data", "7": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "method", "Python method"], "6": ["py", "data", "Python data"], "7": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 23], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 23], "packag": [1, 14, 16, 17], "submodul": [1, 14, 17], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19], "boutiqu": 3, "core": 4, "graph": 5, "helper": 6, "helpers_fil": 7, "copi": 7, "option": 7, "exist": 7, "file": 7, "new": [7, 24], "helpers_st": 8, "spec": [9, 24], "state": [10, 22, 26], "submitt": 11, "task": [12, 16, 21, 22], "note": [12, 20], "worker": 13, "mark": [14, 15], "function": [15, 22], "util": [17, 18, 19], "messeng": 18, "profil": 19, "releas": 20, "0": 20, "8": 20, "7": 20, "6": 20, "2": 20, "1": 20, "5": 20, "4": 20, "3": 20, "group": 21, "": [21, 22, 23], "output": [21, 25], "dataflow": [22, 23], "compon": 22, "workflow": 22, "shell": 22, "command": 22, "contain": 22, "welcom": 23, "A": 23, "simpl": 23, "scalabl": 23, "semant": 23, "document": 23, "content": 23, "indic": 23, "tabl": 23, "input": [24, 26], "specif": [24, 25], "ad": 24, "field": 24, "type": [24, 26], "metadata": [24, 25], "valid": 24, "nest": 26, "loop": 26, "over": 26, "splitter": 26, "scalar": 26, "outer": 26, "user": 27, "guid": 27}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [14, "submodules"], [17, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.graph module": [[5, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[6, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[7, "module-pydra.engine.helpers_file"]], "Copy options for existing files": [[7, null]], "Copy options for new files": [[7, null]], "pydra.engine.helpers_state module": [[8, "module-pydra.engine.helpers_state"]], "pydra.engine.specs module": [[9, "module-pydra.engine.specs"]], "pydra.engine.state module": [[10, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[11, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[12, "module-pydra.engine.task"]], "Notes:": [[12, null]], "pydra.engine.workers module": [[13, "module-pydra.engine.workers"]], "pydra.mark package": [[14, "module-pydra.mark"]], "pydra.mark.functions module": [[15, "module-pydra.mark.functions"]], "pydra.tasks package": [[16, "module-pydra.tasks"]], "pydra.utils package": [[17, "module-pydra.utils"]], "pydra.utils.messenger module": [[18, "module-pydra.utils.messenger"]], "pydra.utils.profiler module": [[19, "module-pydra.utils.profiler"]], "Release Notes": [[20, "release-notes"]], "0.8.0": [[20, "id1"]], "0.7.0": [[20, "id2"]], "0.6.2": [[20, "id3"]], "0.6.1": [[20, "id4"]], "0.6": [[20, "id5"]], "0.5": [[20, "id6"]], "0.4": [[20, "id7"]], "0.3.1": [[20, "id8"]], "0.3": [[20, "id9"]], "0.2.2": [[20, "id10"]], "0.2.1": [[20, "id11"]], "0.2": [[20, "id12"]], "0.1": [[20, "id13"]], "0.0.1": [[20, "id14"]], "Grouping Task\u2019s Output": [[21, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[22, "dataflows-components-task-and-workflow"]], "Function Tasks": [[22, "function-tasks"]], "Shell Command Tasks": [[22, "shell-command-tasks"]], "Container Tasks": [[22, "container-tasks"]], "Workflows": [[22, "workflows"]], "Task\u2019s State": [[22, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[23, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[23, null]], "Indices and tables": [[23, "indices-and-tables"]], "Input Specification": [[24, "input-specification"]], "Adding a New Field to the Spec": [[24, "adding-a-new-field-to-the-spec"]], "Types": [[24, "types"]], "Metadata": [[24, "metadata"], [25, "metadata"]], "Validators": [[24, "validators"]], "Output Specification": [[25, "output-specification"]], "State and Nested Loops over Input": [[26, "state-and-nested-loops-over-input"]], "Types of Splitter": [[26, "types-of-splitter"]], "Scalar Splitter": [[26, "scalar-splitter"]], "Outer Splitter": [[26, "outer-splitter"]], "User Guide": [[27, "user-guide"]]}, "indexentries": {"check_latest_version() (in module pydra)": [[0, "pydra.check_latest_version"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.graph"], [6, "module-pydra.engine.helpers"], [7, "module-pydra.engine.helpers_file"], [8, "module-pydra.engine.helpers_state"], [9, "module-pydra.engine.specs"], [10, "module-pydra.engine.state"], [11, "module-pydra.engine.submitter"], [12, "module-pydra.engine.task"], [13, "module-pydra.engine.workers"], [14, "module-pydra.mark"], [15, "module-pydra.mark.functions"], [16, "module-pydra.tasks"], [17, "module-pydra.utils"], [18, "module-pydra.utils.messenger"], [19, "module-pydra.utils.profiler"]], "pydra": [[0, "module-pydra"]], "set_input_validator() (in module pydra)": [[0, "pydra.set_input_validator"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "dockertask (class in pydra.engine)": [[1, "pydra.engine.DockerTask"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "container_args (pydra.engine.dockertask property)": [[1, "pydra.engine.DockerTask.container_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "init (pydra.engine.dockertask attribute)": [[1, "pydra.engine.DockerTask.init"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "digraph (class in pydra.engine.graph)": [[5, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[5, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[6, "pydra.engine.helpers.PydraFileLock"]], "argstr_formatting() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.create_checksum"]], "custom_validator() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.custom_validator"]], "ensure_list() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.execute"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_open_loop"]], "hash_function() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_function"]], "hash_value() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_value"]], "load_and_run() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.output_from_inputfields"]], "position_sort() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[6, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.save"]], "task_hash() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.task_hash"]], "copyfile() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile"]], "copyfile_input() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile_input"]], "copyfiles() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfiles"]], "ensure_list() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.ensure_list"]], "fname_presuffix() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.fname_presuffix"]], "get_related_files() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.get_related_files"]], "hash_dir() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_dir"]], "hash_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_file"]], "is_container() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_container"]], "is_existing_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_existing_file"]], "is_local_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.on_cifs"]], "pydra.engine.helpers_file": [[7, "module-pydra.engine.helpers_file"]], "related_filetype_sets (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.related_filetype_sets"]], "split_filename() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.split_filename"]], "template_update() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[8, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[8, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splitter2rpn"]], "basespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.BaseSpec"]], "containerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ContainerSpec"]], "directory (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Directory"]], "dockerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.DockerSpec"]], "file (class in pydra.engine.specs)": [[9, "pydra.engine.specs.File"]], "functionspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyField"]], "multiinputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputFile"]], "multiinputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputObj"]], "multioutputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputFile"]], "multioutputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputObj"]], "result (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellSpec"]], "singularityspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SingularitySpec"]], "specinfo (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SpecInfo"]], "taskhook (class in pydra.engine.specs)": [[9, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields"]], "attr_fields_dict() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields_dict"]], "bases (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.bases"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[9, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container"]], "container (pydra.engine.specs.dockerspec attribute)": [[9, "pydra.engine.specs.DockerSpec.container"]], "container (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.container"]], "container (pydra.engine.specs.singularityspec attribute)": [[9, "pydra.engine.specs.SingularitySpec.container"]], "container_xargs (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container_xargs"]], "converter() (pydra.engine.specs.multiinputobj class method)": [[9, "pydra.engine.specs.MultiInputObj.converter"]], "converter() (pydra.engine.specs.multioutputobj class method)": [[9, "pydra.engine.specs.MultiOutputObj.converter"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.executable"]], "fields (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[9, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[9, "pydra.engine.specs.BaseSpec.hash"]], "image (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.image"]], "name (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[9, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[9, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.runtime"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.template_update"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[10, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[10, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[10, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[10, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[10, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[10, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[10, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[10, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[10, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[11, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[11, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.submit_from_call"]], "containertask (class in pydra.engine.task)": [[12, "pydra.engine.task.ContainerTask"]], "dockertask (class in pydra.engine.task)": [[12, "pydra.engine.task.DockerTask"]], "functiontask (class in pydra.engine.task)": [[12, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[12, "pydra.engine.task.ShellCommandTask"]], "singularitytask (class in pydra.engine.task)": [[12, "pydra.engine.task.SingularityTask"]], "bind_paths() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.bind_paths"]], "binds() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.binds"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.command_args"]], "container_args (pydra.engine.task.dockertask property)": [[12, "pydra.engine.task.DockerTask.container_args"]], "container_args (pydra.engine.task.singularitytask property)": [[12, "pydra.engine.task.SingularityTask.container_args"]], "container_check() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.container_check"]], "init (pydra.engine.task.dockertask attribute)": [[12, "pydra.engine.task.DockerTask.init"]], "init (pydra.engine.task.singularitytask attribute)": [[12, "pydra.engine.task.SingularityTask.init"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[12, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[12, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DistributedWorker"]], "sgeworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[13, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[13, "pydra.engine.workers.DistributedWorker.max_jobs"]], "pydra.engine.workers": [[13, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[13, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.submit_array_job"]], "pydra.mark": [[14, "module-pydra.mark"]], "annotate() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[15, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.task"]], "pydra.tasks": [[16, "module-pydra.tasks"]], "pydra.utils": [[17, "module-pydra.utils"]], "all (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[18, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[18, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[18, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[18, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[18, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "resourcemonitor (class in pydra.utils.profiler)": [[19, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[19, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[19, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.stop"]]}}) \ No newline at end of file diff --git a/ci_test-py3.11-windows/state.html b/ci_test-py3.11-windows/state.html new file mode 100644 index 0000000000..26556a317a --- /dev/null +++ b/ci_test-py3.11-windows/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/ci_test-py3.11-windows/user_guide.html b/ci_test-py3.11-windows/user_guide.html new file mode 100644 index 0000000000..2b45d15efa --- /dev/null +++ b/ci_test-py3.11-windows/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: ci/test-py3.11-windows + + + +
+ + + + \ No newline at end of file diff --git a/combiner.html b/combiner.html new file mode 100644 index 0000000000..fb13bb218f --- /dev/null +++ b/combiner.html @@ -0,0 +1,204 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/components.html b/components.html new file mode 100644 index 0000000000..ecf5ee11e5 --- /dev/null +++ b/components.html @@ -0,0 +1,335 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/debugging-hashing/.buildinfo b/debugging-hashing/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/debugging-hashing/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/debugging-hashing/.doctrees/api.doctree b/debugging-hashing/.doctrees/api.doctree new file mode 100644 index 0000000000..6b1e84e90c Binary files /dev/null and b/debugging-hashing/.doctrees/api.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.audit.doctree b/debugging-hashing/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..add2d3bf87 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.boutiques.doctree b/debugging-hashing/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..f94d1a8bb8 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.core.doctree b/debugging-hashing/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..7aca38494c Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.core.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.doctree b/debugging-hashing/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..9bba058edb Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.environments.doctree b/debugging-hashing/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..2b6c1a10ce Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.graph.doctree b/debugging-hashing/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..3aa9a292a1 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.helpers.doctree b/debugging-hashing/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..45dd985b02 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.helpers_file.doctree b/debugging-hashing/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..789e83103a Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.helpers_state.doctree b/debugging-hashing/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..240829b422 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.run_pickled.doctree b/debugging-hashing/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..abae54c8d6 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.specs.doctree b/debugging-hashing/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..7ddce24715 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.state.doctree b/debugging-hashing/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..4d19b6e4bf Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.state.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.submitter.doctree b/debugging-hashing/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..ca0e179bb5 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.task.doctree b/debugging-hashing/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..fe10aa4371 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.task.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.engine.workers.doctree b/debugging-hashing/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..7b681e635f Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.mark.doctree b/debugging-hashing/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..f6fb4d6a58 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.mark.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.mark.functions.doctree b/debugging-hashing/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..dc9b9dd680 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.tasks.doctree b/debugging-hashing/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..934d6a9e71 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.tasks.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.doctree b/debugging-hashing/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..133e955c7a Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.hash.doctree b/debugging-hashing/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..c3dc1e837c Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.messenger.doctree b/debugging-hashing/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..f868f87b8f Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.misc.doctree b/debugging-hashing/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..77a46294ab Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.profiler.doctree b/debugging-hashing/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..b19371c805 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/debugging-hashing/.doctrees/api/pydra.utils.typing.doctree b/debugging-hashing/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..bd5e8819c8 Binary files /dev/null and b/debugging-hashing/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/debugging-hashing/.doctrees/changes.doctree b/debugging-hashing/.doctrees/changes.doctree new file mode 100644 index 0000000000..abc1f1139c Binary files /dev/null and b/debugging-hashing/.doctrees/changes.doctree differ diff --git a/debugging-hashing/.doctrees/combiner.doctree b/debugging-hashing/.doctrees/combiner.doctree new file mode 100644 index 0000000000..0bb553ab09 Binary files /dev/null and b/debugging-hashing/.doctrees/combiner.doctree differ diff --git a/debugging-hashing/.doctrees/components.doctree b/debugging-hashing/.doctrees/components.doctree new file mode 100644 index 0000000000..2f5dd97b89 Binary files /dev/null and b/debugging-hashing/.doctrees/components.doctree differ diff --git a/debugging-hashing/.doctrees/environment.pickle b/debugging-hashing/.doctrees/environment.pickle new file mode 100644 index 0000000000..eadca149fc Binary files /dev/null and b/debugging-hashing/.doctrees/environment.pickle differ diff --git a/debugging-hashing/.doctrees/index.doctree b/debugging-hashing/.doctrees/index.doctree new file mode 100644 index 0000000000..355daf606d Binary files /dev/null and b/debugging-hashing/.doctrees/index.doctree differ diff --git a/debugging-hashing/.doctrees/input_spec.doctree b/debugging-hashing/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..8eb285b2f5 Binary files /dev/null and b/debugging-hashing/.doctrees/input_spec.doctree differ diff --git a/debugging-hashing/.doctrees/output_spec.doctree b/debugging-hashing/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..dd755b15f4 Binary files /dev/null and b/debugging-hashing/.doctrees/output_spec.doctree differ diff --git a/debugging-hashing/.doctrees/state.doctree b/debugging-hashing/.doctrees/state.doctree new file mode 100644 index 0000000000..deff9182ab Binary files /dev/null and b/debugging-hashing/.doctrees/state.doctree differ diff --git a/debugging-hashing/.doctrees/user_guide.doctree b/debugging-hashing/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..d05bc63bd0 Binary files /dev/null and b/debugging-hashing/.doctrees/user_guide.doctree differ diff --git a/debugging-hashing/.nojekyll b/debugging-hashing/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/debugging-hashing/_images/nd_spl_1.png b/debugging-hashing/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/debugging-hashing/_images/nd_spl_1.png differ diff --git a/debugging-hashing/_images/nd_spl_3.png b/debugging-hashing/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/debugging-hashing/_images/nd_spl_3.png differ diff --git a/debugging-hashing/_images/nd_spl_3_comb1.png b/debugging-hashing/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/debugging-hashing/_images/nd_spl_3_comb1.png differ diff --git a/debugging-hashing/_images/nd_spl_3_comb3.png b/debugging-hashing/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/debugging-hashing/_images/nd_spl_3_comb3.png differ diff --git a/debugging-hashing/_images/nd_spl_4.png b/debugging-hashing/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/debugging-hashing/_images/nd_spl_4.png differ diff --git a/debugging-hashing/_sources/api.rst.txt b/debugging-hashing/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/debugging-hashing/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/debugging-hashing/_sources/api/pydra.engine.audit.rst.txt b/debugging-hashing/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.boutiques.rst.txt b/debugging-hashing/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.core.rst.txt b/debugging-hashing/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.environments.rst.txt b/debugging-hashing/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.graph.rst.txt b/debugging-hashing/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.helpers.rst.txt b/debugging-hashing/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.helpers_file.rst.txt b/debugging-hashing/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.helpers_state.rst.txt b/debugging-hashing/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.rst.txt b/debugging-hashing/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/debugging-hashing/_sources/api/pydra.engine.run_pickled.rst.txt b/debugging-hashing/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.specs.rst.txt b/debugging-hashing/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.state.rst.txt b/debugging-hashing/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.submitter.rst.txt b/debugging-hashing/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.task.rst.txt b/debugging-hashing/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.engine.workers.rst.txt b/debugging-hashing/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.mark.functions.rst.txt b/debugging-hashing/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.mark.rst.txt b/debugging-hashing/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/debugging-hashing/_sources/api/pydra.tasks.rst.txt b/debugging-hashing/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.utils.hash.rst.txt b/debugging-hashing/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.utils.messenger.rst.txt b/debugging-hashing/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.utils.misc.rst.txt b/debugging-hashing/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.utils.profiler.rst.txt b/debugging-hashing/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/api/pydra.utils.rst.txt b/debugging-hashing/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/debugging-hashing/_sources/api/pydra.utils.typing.rst.txt b/debugging-hashing/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/debugging-hashing/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/debugging-hashing/_sources/changes.rst.txt b/debugging-hashing/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/debugging-hashing/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/debugging-hashing/_sources/combiner.rst.txt b/debugging-hashing/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/debugging-hashing/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/debugging-hashing/_sources/components.rst.txt b/debugging-hashing/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/debugging-hashing/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/debugging-hashing/_sources/index.rst.txt b/debugging-hashing/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/debugging-hashing/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/debugging-hashing/_sources/input_spec.rst.txt b/debugging-hashing/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/debugging-hashing/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/debugging-hashing/_sources/output_spec.rst.txt b/debugging-hashing/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/debugging-hashing/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/debugging-hashing/_sources/state.rst.txt b/debugging-hashing/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/debugging-hashing/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/debugging-hashing/_sources/user_guide.rst.txt b/debugging-hashing/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/debugging-hashing/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/debugging-hashing/_static/_sphinx_javascript_frameworks_compat.js b/debugging-hashing/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/debugging-hashing/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/debugging-hashing/_static/banner.css b/debugging-hashing/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/debugging-hashing/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/debugging-hashing/_static/basic.css b/debugging-hashing/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/debugging-hashing/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/debugging-hashing/_static/css/badge_only.css b/debugging-hashing/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/debugging-hashing/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff b/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff2 b/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff b/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff2 b/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/debugging-hashing/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/fontawesome-webfont.eot b/debugging-hashing/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/debugging-hashing/_static/css/fonts/fontawesome-webfont.svg b/debugging-hashing/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/debugging-hashing/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/debugging-hashing/_static/css/fonts/fontawesome-webfont.ttf b/debugging-hashing/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff b/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff2 b/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/lato-bold-italic.woff b/debugging-hashing/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-bold-italic.woff differ diff --git a/debugging-hashing/_static/css/fonts/lato-bold-italic.woff2 b/debugging-hashing/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/lato-bold.woff b/debugging-hashing/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-bold.woff differ diff --git a/debugging-hashing/_static/css/fonts/lato-bold.woff2 b/debugging-hashing/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-bold.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/lato-normal-italic.woff b/debugging-hashing/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-normal-italic.woff differ diff --git a/debugging-hashing/_static/css/fonts/lato-normal-italic.woff2 b/debugging-hashing/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/debugging-hashing/_static/css/fonts/lato-normal.woff b/debugging-hashing/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-normal.woff differ diff --git a/debugging-hashing/_static/css/fonts/lato-normal.woff2 b/debugging-hashing/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/debugging-hashing/_static/css/fonts/lato-normal.woff2 differ diff --git a/debugging-hashing/_static/css/theme.css b/debugging-hashing/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/debugging-hashing/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/debugging-hashing/_static/doctools.js b/debugging-hashing/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/debugging-hashing/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/debugging-hashing/_static/documentation_options.js b/debugging-hashing/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/debugging-hashing/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/debugging-hashing/_static/file.png b/debugging-hashing/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/debugging-hashing/_static/file.png differ diff --git a/debugging-hashing/_static/jquery.js b/debugging-hashing/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/debugging-hashing/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/debugging-hashing/_static/js/html5shiv.min.js b/debugging-hashing/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/debugging-hashing/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/debugging-hashing/_static/js/theme.js b/debugging-hashing/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/debugging-hashing/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/debugging-hashing/_static/minus.png b/debugging-hashing/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/debugging-hashing/_static/minus.png differ diff --git a/debugging-hashing/_static/plus.png b/debugging-hashing/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/debugging-hashing/_static/plus.png differ diff --git a/debugging-hashing/_static/pygments.css b/debugging-hashing/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/debugging-hashing/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/debugging-hashing/_static/searchtools.js b/debugging-hashing/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/debugging-hashing/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/debugging-hashing/_static/sphinx_highlight.js b/debugging-hashing/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/debugging-hashing/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/debugging-hashing/api.html b/debugging-hashing/api.html new file mode 100644 index 0000000000..3979fa7fb7 --- /dev/null +++ b/debugging-hashing/api.html @@ -0,0 +1,1015 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.audit.html b/debugging-hashing/api/pydra.engine.audit.html new file mode 100644 index 0000000000..ce8e13681c --- /dev/null +++ b/debugging-hashing/api/pydra.engine.audit.html @@ -0,0 +1,244 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.boutiques.html b/debugging-hashing/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..dc1bf14af1 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.boutiques.html @@ -0,0 +1,182 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.core.html b/debugging-hashing/api/pydra.engine.core.html new file mode 100644 index 0000000000..6e9e1f48c2 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.core.html @@ -0,0 +1,501 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.environments.html b/debugging-hashing/api/pydra.engine.environments.html new file mode 100644 index 0000000000..11fe60138e --- /dev/null +++ b/debugging-hashing/api/pydra.engine.environments.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.graph.html b/debugging-hashing/api/pydra.engine.graph.html new file mode 100644 index 0000000000..8d82982ad8 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.graph.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.helpers.html b/debugging-hashing/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..8ce333f73e --- /dev/null +++ b/debugging-hashing/api/pydra.engine.helpers.html @@ -0,0 +1,446 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.helpers_file.html b/debugging-hashing/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..2627990bad --- /dev/null +++ b/debugging-hashing/api/pydra.engine.helpers_file.html @@ -0,0 +1,315 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.helpers_state.html b/debugging-hashing/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..37ddff285c --- /dev/null +++ b/debugging-hashing/api/pydra.engine.helpers_state.html @@ -0,0 +1,319 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.html b/debugging-hashing/api/pydra.engine.html new file mode 100644 index 0000000000..14f4f97881 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.html @@ -0,0 +1,429 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.run_pickled.html b/debugging-hashing/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..09186e6509 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.run_pickled.html @@ -0,0 +1,180 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.specs.html b/debugging-hashing/api/pydra.engine.specs.html new file mode 100644 index 0000000000..02201efaa8 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.specs.html @@ -0,0 +1,650 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.state.html b/debugging-hashing/api/pydra.engine.state.html new file mode 100644 index 0000000000..c1a6903034 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.state.html @@ -0,0 +1,598 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.submitter.html b/debugging-hashing/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..a6e56095a3 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.submitter.html @@ -0,0 +1,264 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.task.html b/debugging-hashing/api/pydra.engine.task.html new file mode 100644 index 0000000000..a5bb28358b --- /dev/null +++ b/debugging-hashing/api/pydra.engine.task.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.engine.workers.html b/debugging-hashing/api/pydra.engine.workers.html new file mode 100644 index 0000000000..1ce029d468 --- /dev/null +++ b/debugging-hashing/api/pydra.engine.workers.html @@ -0,0 +1,514 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.mark.functions.html b/debugging-hashing/api/pydra.mark.functions.html new file mode 100644 index 0000000000..7fa11064c4 --- /dev/null +++ b/debugging-hashing/api/pydra.mark.functions.html @@ -0,0 +1,200 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.mark.html b/debugging-hashing/api/pydra.mark.html new file mode 100644 index 0000000000..fd3ae4cf51 --- /dev/null +++ b/debugging-hashing/api/pydra.mark.html @@ -0,0 +1,206 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.tasks.html b/debugging-hashing/api/pydra.tasks.html new file mode 100644 index 0000000000..ed3d8fe062 --- /dev/null +++ b/debugging-hashing/api/pydra.tasks.html @@ -0,0 +1,171 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.hash.html b/debugging-hashing/api/pydra.utils.hash.html new file mode 100644 index 0000000000..977618cd86 --- /dev/null +++ b/debugging-hashing/api/pydra.utils.hash.html @@ -0,0 +1,271 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.html b/debugging-hashing/api/pydra.utils.html new file mode 100644 index 0000000000..f490f5b048 --- /dev/null +++ b/debugging-hashing/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.messenger.html b/debugging-hashing/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..76c15425ef --- /dev/null +++ b/debugging-hashing/api/pydra.utils.messenger.html @@ -0,0 +1,375 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.misc.html b/debugging-hashing/api/pydra.utils.misc.html new file mode 100644 index 0000000000..bdbaabe4e8 --- /dev/null +++ b/debugging-hashing/api/pydra.utils.misc.html @@ -0,0 +1,191 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.profiler.html b/debugging-hashing/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..b57b90ddfd --- /dev/null +++ b/debugging-hashing/api/pydra.utils.profiler.html @@ -0,0 +1,247 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/api/pydra.utils.typing.html b/debugging-hashing/api/pydra.utils.typing.html new file mode 100644 index 0000000000..3e5d6fe1d4 --- /dev/null +++ b/debugging-hashing/api/pydra.utils.typing.html @@ -0,0 +1,462 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]]) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/changes.html b/debugging-hashing/changes.html new file mode 100644 index 0000000000..0fbabab4a2 --- /dev/null +++ b/debugging-hashing/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/combiner.html b/debugging-hashing/combiner.html new file mode 100644 index 0000000000..c2dcabab22 --- /dev/null +++ b/debugging-hashing/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/components.html b/debugging-hashing/components.html new file mode 100644 index 0000000000..65dfaf3c76 --- /dev/null +++ b/debugging-hashing/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/genindex.html b/debugging-hashing/genindex.html new file mode 100644 index 0000000000..566a0a7115 --- /dev/null +++ b/debugging-hashing/genindex.html @@ -0,0 +1,1504 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/index.html b/debugging-hashing/index.html new file mode 100644 index 0000000000..4cd565ef95 --- /dev/null +++ b/debugging-hashing/index.html @@ -0,0 +1,246 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/input_spec.html b/debugging-hashing/input_spec.html new file mode 100644 index 0000000000..9d2bcb9d33 --- /dev/null +++ b/debugging-hashing/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/objects.inv b/debugging-hashing/objects.inv new file mode 100644 index 0000000000..acfff343b6 Binary files /dev/null and b/debugging-hashing/objects.inv differ diff --git a/debugging-hashing/output_spec.html b/debugging-hashing/output_spec.html new file mode 100644 index 0000000000..8441d63ac8 --- /dev/null +++ b/debugging-hashing/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/py-modindex.html b/debugging-hashing/py-modindex.html new file mode 100644 index 0000000000..45c8e8726f --- /dev/null +++ b/debugging-hashing/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/search.html b/debugging-hashing/search.html new file mode 100644 index 0000000000..7dd283bf6f --- /dev/null +++ b/debugging-hashing/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/debugging-hashing/searchindex.js b/debugging-hashing/searchindex.js new file mode 100644 index 0000000000..9163eebf54 --- /dev/null +++ b/debugging-hashing/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": 4, "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "pars": [8, 11, 13], "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/debugging-hashing/state.html b/debugging-hashing/state.html new file mode 100644 index 0000000000..5e1c0bab58 --- /dev/null +++ b/debugging-hashing/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/debugging-hashing/user_guide.html b/debugging-hashing/user_guide.html new file mode 100644 index 0000000000..85697eedc8 --- /dev/null +++ b/debugging-hashing/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: debugging-hashing + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/.buildinfo b/effigies_input-spec-suggestions/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/effigies_input-spec-suggestions/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/effigies_input-spec-suggestions/.doctrees/api.doctree b/effigies_input-spec-suggestions/.doctrees/api.doctree new file mode 100644 index 0000000000..8d50c994ff Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.audit.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..03d2af0573 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.boutiques.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..58604fbe18 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.core.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..6ff377005a Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.core.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..c5d2d8468e Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.graph.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..63721a9c36 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..92c7be7a3d Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_file.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..4a608de843 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_state.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..d180af6acb Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.specs.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..d79cc0e7e7 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.state.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..66a4757ff4 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.state.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.submitter.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..2aaed95498 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.task.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..558972996c Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.task.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.workers.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..7c37643c4e Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..4ed814a29f Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.functions.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..d3b0e8744e Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.tasks.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..ee1b3d62ba Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.tasks.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..0d02960a0a Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.messenger.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..a0120cdaa1 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.profiler.doctree b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..75d9fa05fd Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/changes.doctree b/effigies_input-spec-suggestions/.doctrees/changes.doctree new file mode 100644 index 0000000000..36580b97b0 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/changes.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/combiner.doctree b/effigies_input-spec-suggestions/.doctrees/combiner.doctree new file mode 100644 index 0000000000..51aea336ef Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/combiner.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/components.doctree b/effigies_input-spec-suggestions/.doctrees/components.doctree new file mode 100644 index 0000000000..2f62fbe599 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/components.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/environment.pickle b/effigies_input-spec-suggestions/.doctrees/environment.pickle new file mode 100644 index 0000000000..df97a38dc2 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/environment.pickle differ diff --git a/effigies_input-spec-suggestions/.doctrees/index.doctree b/effigies_input-spec-suggestions/.doctrees/index.doctree new file mode 100644 index 0000000000..6199701ff9 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/index.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/input_spec.doctree b/effigies_input-spec-suggestions/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..e4a4a1b523 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/input_spec.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/output_spec.doctree b/effigies_input-spec-suggestions/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..654f01775f Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/output_spec.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/state.doctree b/effigies_input-spec-suggestions/.doctrees/state.doctree new file mode 100644 index 0000000000..24b0e5742a Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/state.doctree differ diff --git a/effigies_input-spec-suggestions/.doctrees/user_guide.doctree b/effigies_input-spec-suggestions/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..f3b748aa34 Binary files /dev/null and b/effigies_input-spec-suggestions/.doctrees/user_guide.doctree differ diff --git a/effigies_input-spec-suggestions/.nojekyll b/effigies_input-spec-suggestions/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/effigies_input-spec-suggestions/_images/nd_spl_1.png b/effigies_input-spec-suggestions/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/effigies_input-spec-suggestions/_images/nd_spl_1.png differ diff --git a/effigies_input-spec-suggestions/_images/nd_spl_3.png b/effigies_input-spec-suggestions/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/effigies_input-spec-suggestions/_images/nd_spl_3.png differ diff --git a/effigies_input-spec-suggestions/_images/nd_spl_3_comb1.png b/effigies_input-spec-suggestions/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/effigies_input-spec-suggestions/_images/nd_spl_3_comb1.png differ diff --git a/effigies_input-spec-suggestions/_images/nd_spl_3_comb3.png b/effigies_input-spec-suggestions/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/effigies_input-spec-suggestions/_images/nd_spl_3_comb3.png differ diff --git a/effigies_input-spec-suggestions/_images/nd_spl_4.png b/effigies_input-spec-suggestions/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/effigies_input-spec-suggestions/_images/nd_spl_4.png differ diff --git a/effigies_input-spec-suggestions/_sources/api.rst.txt b/effigies_input-spec-suggestions/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.audit.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.boutiques.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.core.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.graph.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_file.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_state.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..7cafa8d6ad --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,26 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.specs.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.state.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.submitter.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.task.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.engine.workers.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.mark.functions.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.mark.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.tasks.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.utils.messenger.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.utils.profiler.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/effigies_input-spec-suggestions/_sources/api/pydra.utils.rst.txt b/effigies_input-spec-suggestions/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..946fe9055d --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,16 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.messenger + pydra.utils.profiler diff --git a/effigies_input-spec-suggestions/_sources/changes.rst.txt b/effigies_input-spec-suggestions/_sources/changes.rst.txt new file mode 100644 index 0000000000..0fb4187e33 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messanger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/effigies_input-spec-suggestions/_sources/combiner.rst.txt b/effigies_input-spec-suggestions/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/effigies_input-spec-suggestions/_sources/components.rst.txt b/effigies_input-spec-suggestions/_sources/components.rst.txt new file mode 100644 index 0000000000..7872fec87c --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/components.rst.txt @@ -0,0 +1,187 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2(x=[1, 5]).split("x").combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. +The results are grouped back when returning the result from the *Task*. +While this example +illustrates mapping and grouping of results over a single parameter, *Pydra* +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/effigies_input-spec-suggestions/_sources/index.rst.txt b/effigies_input-spec-suggestions/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/effigies_input-spec-suggestions/_sources/input_spec.rst.txt b/effigies_input-spec-suggestions/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/effigies_input-spec-suggestions/_sources/output_spec.rst.txt b/effigies_input-spec-suggestions/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/effigies_input-spec-suggestions/_sources/state.rst.txt b/effigies_input-spec-suggestions/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/effigies_input-spec-suggestions/_sources/user_guide.rst.txt b/effigies_input-spec-suggestions/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/effigies_input-spec-suggestions/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/effigies_input-spec-suggestions/_static/_sphinx_javascript_frameworks_compat.js b/effigies_input-spec-suggestions/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/effigies_input-spec-suggestions/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/effigies_input-spec-suggestions/_static/banner.css b/effigies_input-spec-suggestions/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/effigies_input-spec-suggestions/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/effigies_input-spec-suggestions/_static/basic.css b/effigies_input-spec-suggestions/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/effigies_input-spec-suggestions/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/css/badge_only.css b/effigies_input-spec-suggestions/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.eot b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.svg b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.ttf b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-bold.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff differ diff --git a/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff2 b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/css/fonts/lato-normal.woff2 differ diff --git a/effigies_input-spec-suggestions/_static/css/theme.css b/effigies_input-spec-suggestions/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/doctools.js b/effigies_input-spec-suggestions/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/effigies_input-spec-suggestions/_static/documentation_options.js b/effigies_input-spec-suggestions/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/file.png b/effigies_input-spec-suggestions/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/effigies_input-spec-suggestions/_static/file.png differ diff --git a/effigies_input-spec-suggestions/_static/jquery.js b/effigies_input-spec-suggestions/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/js/html5shiv.min.js b/effigies_input-spec-suggestions/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/effigies_input-spec-suggestions/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/js/theme.js b/effigies_input-spec-suggestions/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/effigies_input-spec-suggestions/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/effigies_input-spec-suggestions/_static/minus.png b/effigies_input-spec-suggestions/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/effigies_input-spec-suggestions/_static/minus.png differ diff --git a/effigies_input-spec-suggestions/_static/plus.png b/effigies_input-spec-suggestions/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/effigies_input-spec-suggestions/_static/plus.png differ diff --git a/effigies_input-spec-suggestions/_static/pygments.css b/effigies_input-spec-suggestions/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/effigies_input-spec-suggestions/_static/searchtools.js b/effigies_input-spec-suggestions/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/effigies_input-spec-suggestions/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/effigies_input-spec-suggestions/_static/sphinx_highlight.js b/effigies_input-spec-suggestions/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/effigies_input-spec-suggestions/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/effigies_input-spec-suggestions/api.html b/effigies_input-spec-suggestions/api.html new file mode 100644 index 0000000000..a5cc76ac6c --- /dev/null +++ b/effigies_input-spec-suggestions/api.html @@ -0,0 +1,677 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+pydra.check_latest_version()
+
+ +
+
+pydra.set_input_validator(flag=False)
+
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.audit.html b/effigies_input-spec-suggestions/api/pydra.engine.audit.html new file mode 100644 index 0000000000..ae0a6ae734 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.audit.html @@ -0,0 +1,243 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.boutiques.html b/effigies_input-spec-suggestions/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..8f192fc5f0 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.boutiques.html @@ -0,0 +1,181 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.core.html b/effigies_input-spec-suggestions/api/pydra.engine.core.html new file mode 100644 index 0000000000..bffd62dd42 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.core.html @@ -0,0 +1,458 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elemntary tasks and +Workflow instances inherit.

+
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner, overwrite=False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner – TODO

  • +
  • overwrite (bool) – TODO

  • +
+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Return type:
+

result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter, overwrite=False, cont_dim=None, **kwargs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • overwrite (bool) – TODO

  • +
  • cont_dim (dict) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.graph.html b/effigies_input-spec-suggestions/api/pydra.engine.graph.html new file mode 100644 index 0000000000..64ce6761c6 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.graph.html @@ -0,0 +1,350 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other format, equires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.helpers.html b/effigies_input-spec-suggestions/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..6f754c2081 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.helpers.html @@ -0,0 +1,459 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.custom_validator(instance, attribute, value)
+

simple custom validation +take into account ty.Union, ty.List, ty.Dict (but only one level depth) +adding an additional validator, if allowe_values provided

+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.hash_function(obj)
+

Generate hash of object.

+
+ +
+
+pydra.engine.helpers.hash_value(value, tp=None, metadata=None, precalculated=None)
+

calculating hash or returning values recursively

+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+
+pydra.engine.helpers.task_hash(task)
+

Calculate the checksum of a task.

+

input hash, output hash, environment hash

+
+
Parameters:
+

task (TaskBase) – The input task.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.helpers_file.html b/effigies_input-spec-suggestions/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..8aa00cb967 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.helpers_file.html @@ -0,0 +1,444 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+pydra.engine.helpers_file.copyfile(originalfile, newfile, copy=False, create_new=False, use_hardlink=True, copy_related_files=True)
+

Copy or link files.

+

If use_hardlink is True, and the file can be hard-linked, then a +link is created, instead of copying the file.

+

If a hard link is not created and copy is False, then a symbolic +link is created.

+
+

Copy options for existing files

+
    +
  • symlink

    +
    +
      +
    • to regular file originalfile (keep if symlinking)

    • +
    • to same dest as symlink originalfile (keep if symlinking)

    • +
    • to other file (unlink)

    • +
    +
    +
  • +
  • regular file

    +
    +
      +
    • hard link to originalfile (keep)

    • +
    • copy of file (same hash) (keep)

    • +
    • different file (diff hash) (unlink)

    • +
    +
    +
  • +
+
+
+

Copy options for new files

+
    +
  • use_hardlink & can_hardlink => hardlink

  • +
  • ~hardlink & ~copy & can_symlink => symlink

  • +
  • ~hardlink & ~symlink => copy

  • +
+
+
+
Parameters:
+
    +
  • originalfile (str) – full path to original file

  • +
  • newfile (str) – full path to new file

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for POSIX systems

  • +
  • use_hardlink (Bool) – specifies whether to hard-link files, when able +(Default=False), taking precedence over copy

  • +
  • copy_related_files (Bool) – specifies whether to also operate on related files, as defined in +related_filetype_sets

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.copyfile_input(inputs, output_dir)
+

Implement the base class method.

+
+ +
+
+pydra.engine.helpers_file.copyfiles(filelist, dest, copy=False, create_new=False)
+

Copy or symlink files in filelist to dest directory.

+
+
Parameters:
+
    +
  • filelist (list) – List of files to copy.

  • +
  • dest (path/files) – full path to destination. If it is a list of length greater +than 1, then it assumes that these are the names of the new +files.

  • +
  • copy (Bool) – specifies whether to copy or symlink files +(default=False) but only for posix systems

  • +
+
+
Return type:
+

None

+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.fname_presuffix(fname, prefix='', suffix='', newpath=None, use_ext=True)
+

Manipulate path and name of input filename.

+
+
Parameters:
+
    +
  • fname (str) – A filename (may or may not include path)

  • +
  • prefix (str) – Characters to prepend to the filename

  • +
  • suffix (str) – Characters to append to the filename

  • +
  • newpath (str) – Path to replace the path of the input fname

  • +
  • use_ext (bool) – If True (default), appends the extension of the original file +to the output name.

  • +
+
+
Returns:
+

path – Absolute path of the modified filename

+
+
Return type:
+

str

+
+
+

Examples

+
>>> import pytest, sys
+>>> if sys.platform.startswith('win'): pytest.skip()
+>>> from pydra.engine.helpers_file import fname_presuffix
+>>> fname = 'foo.nii.gz'
+>>> fname_presuffix(fname,'pre','post','/tmp')
+'/tmp/prefoopost.nii.gz'
+
+
+
+ +
+ +

Return a list of related files.

+

As defined in related_filetype_sets, for a filename +(e.g., Nifti-Pair, Analyze (SPM), and AFNI files).

+
+
Parameters:
+
    +
  • filename (str) – File name to find related filetypes of.

  • +
  • include_this_file (bool) – If true, output includes the input filename.

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.hash_dir(dirpath, crypto=<built-in function openssl_sha256>, ignore_hidden_files=False, ignore_hidden_dirs=False, raise_notfound=True, precalculated=None)
+

Compute hash of directory contents.

+

This function computes the hash of every file in directory dirpath and then +computes the hash of that list of hashes to return a single hash value. The +directory is traversed recursively.

+
+
Parameters:
+
    +
  • dirpath (str) – Path to directory.

  • +
  • crypto (:obj: function) – cryptographic hash functions

  • +
  • ignore_hidden_files (bool) – If True, ignore filenames that begin with ..

  • +
  • ignore_hidden_dirs (bool) – If True, ignore files in directories that begin with ..

  • +
  • raise_notfound (bool) – If True and dirpath does not exist, raise FileNotFound exception. If +False and dirpath does not exist, return None.

  • +
+
+
Returns:
+

hash – Hash of the directory contents.

+
+
Return type:
+

str

+
+
+
+ +
+
+pydra.engine.helpers_file.hash_file(afile, chunk_len=8192, crypto=<built-in function openssl_sha256>, raise_notfound=True, precalculated=None)
+

Compute hash of a file using ‘crypto’ module.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_existing_file(value)
+

checking if an object is an existing file

+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.on_cifs(fname)
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+
+ +
+
+pydra.engine.helpers_file.related_filetype_sets = [('.hdr', '.img', '.mat'), ('.nii', '.mat'), ('.BRIK', '.HEAD')]
+

List of neuroimaging file types that are to be interpreted together.

+
+ +
+
+pydra.engine.helpers_file.split_filename(fname)
+

Split a filename into parts: path, base filename and extension.

+
+
Parameters:
+

fname (str) – file or path name

+
+
Returns:
+

    +
  • pth (str) – base path from fname

  • +
  • fname (str) – filename from fname, without extension

  • +
  • ext (str) – file extension from fname

  • +
+

+
+
+

Examples

+
>>> pth, fname, ext = split_filename('/home/data/subject.nii.gz')
+>>> pth
+'/home/data'
+
+
+
>>> fname
+'subject'
+
+
+
>>> ext
+'.nii.gz'
+
+
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.helpers_state.html b/effigies_input-spec-suggestions/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..c9f8e56741 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.helpers_state.html @@ -0,0 +1,300 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter, name)
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.html b/effigies_input-spec-suggestions/api/pydra.engine.html new file mode 100644 index 0000000000..b97886c2bc --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.html @@ -0,0 +1,414 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections)
+

Write outputs.

+
+
Parameters:
+

connections – TODO

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.specs.html b/effigies_input-spec-suggestions/api/pydra.engine.specs.html new file mode 100644 index 0000000000..28c008053b --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.specs.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+

Compute a basic hash for any given set of fields.

+
+ +
+
+retrieve_values(wf, state_index=None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.ContainerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container: File | str | None, container_xargs: List[str] | None = None)
+

Bases: ShellSpec

+

Refine the generic command-line specification to container execution.

+
+
+container: File | str | None
+

The container.

+
+ +
+
+container_xargs: List[str] | None
+
+ +
+
+image: File | str
+

The image to be containerized.

+
+ +
+ +
+
+class pydra.engine.specs.Directory
+

Bases: object

+

An os.pathlike object, designating a folder.

+
+ +
+
+class pydra.engine.specs.DockerSpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'docker')
+

Bases: ContainerSpec

+

Particularize container specifications to the Docker engine.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.File
+

Bases: object

+

An os.pathlike object, designating a file.

+
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(node, attr_type)
+

Bases: object

+

Lazy fields implement promises.

+
+
+get_value(wf, state_index=None)
+

Return the value of a lazy field.

+
+ +
+ +
+
+class pydra.engine.specs.MultiInputFile
+

Bases: MultiInputObj

+

A ty.List[File] object, converter changes a single file path to a list

+
+ +
+
+class pydra.engine.specs.MultiInputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes a single values to a list

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.MultiOutputFile
+

Bases: MultiOutputObj

+

A ty.List[File] object, converter changes an 1-el list to the single value

+
+ +
+
+class pydra.engine.specs.MultiOutputObj
+

Bases: object

+

A ty.List[ty.Any] object, converter changes an 1-el list to the single value

+
+
+classmethod converter(value)
+
+ +
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: File | str, stderr: File | str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Collect additional outputs from shelltask output_spec.

+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: File | str
+

The process’ standard input.

+
+ +
+
+stdout: File | str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SingularitySpec(*, executable: str | List[str], args: str | List[str] | None = None, image: File | str, container_xargs: List[str] | None = None, container: str = 'singularity')
+

Bases: ContainerSpec

+

Particularize container specifications to Singularity.

+
+
+container: str
+

The container.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.attr_fields_dict(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.state.html b/effigies_input-spec-suggestions/api/pydra.engine.state.html new file mode 100644 index 0000000000..333359e836 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.state.html @@ -0,0 +1,597 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.submitter.html b/effigies_input-spec-suggestions/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..821e8e791e --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.submitter.html @@ -0,0 +1,263 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin='cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.task.html b/effigies_input-spec-suggestions/api/pydra.engine.task.html new file mode 100644 index 0000000000..a45e3fc627 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.task.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.ContainerTask(container_info=None, *args, **kwargs)
+

Bases: ShellCommandTask

+

Extend shell command task for containerized execution.

+
+
+bind_paths()
+

Get bound mount points

+
+
Returns:
+

mount points – mapping from local path to tuple of container path + mode

+
+
Return type:
+

dict

+
+
+
+ +
+
+binds(opt)
+

Specify mounts to bind from local filesystems to container and working directory.

+

Uses py:meth:bind_paths

+
+ +
+
+container_check(container_type)
+

Get container-specific CLI arguments.

+
+ +
+ +
+
+class pydra.engine.task.DockerTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with the Docker Engine.

+
+
+property container_args
+

Get container-specific CLI arguments, returns a list if the task has a state

+
+ +
+
+init = False
+
+ +
+ +
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(container_info=None, *args, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+property command_args
+

Get command line arguments

+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.task.SingularityTask(container_info=None, *args, **kwargs)
+

Bases: ContainerTask

+

Extend shell command task for containerized execution with Singularity.

+
+
+property container_args
+

Get container-specific CLI arguments.

+
+ +
+
+init = False
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.engine.workers.html b/effigies_input-spec-suggestions/api/pydra.engine.workers.html new file mode 100644 index 0000000000..cba715a11a --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.engine.workers.html @@ -0,0 +1,381 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.mark.functions.html b/effigies_input-spec-suggestions/api/pydra.mark.functions.html new file mode 100644 index 0000000000..9ab338f0ce --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.mark.functions.html @@ -0,0 +1,196 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.mark.html b/effigies_input-spec-suggestions/api/pydra.mark.html new file mode 100644 index 0000000000..621776c97d --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.mark.html @@ -0,0 +1,176 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.tasks.html b/effigies_input-spec-suggestions/api/pydra.tasks.html new file mode 100644 index 0000000000..5c1ceae63c --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.tasks.html @@ -0,0 +1,169 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.utils.html b/effigies_input-spec-suggestions/api/pydra.utils.html new file mode 100644 index 0000000000..12bd361f1f --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.utils.html @@ -0,0 +1,177 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.utils.messenger.html b/effigies_input-spec-suggestions/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..d0dbfa1ec7 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.utils.messenger.html @@ -0,0 +1,373 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/api/pydra.utils.profiler.html b/effigies_input-spec-suggestions/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..43ee548973 --- /dev/null +++ b/effigies_input-spec-suggestions/api/pydra.utils.profiler.html @@ -0,0 +1,243 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequence to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/changes.html b/effigies_input-spec-suggestions/changes.html new file mode 100644 index 0000000000..1d817ceeeb --- /dev/null +++ b/effigies_input-spec-suggestions/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messanger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/combiner.html b/effigies_input-spec-suggestions/combiner.html new file mode 100644 index 0000000000..d00a231307 --- /dev/null +++ b/effigies_input-spec-suggestions/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/components.html b/effigies_input-spec-suggestions/components.html new file mode 100644 index 0000000000..3e6ea265dd --- /dev/null +++ b/effigies_input-spec-suggestions/components.html @@ -0,0 +1,337 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2(x=[1, 5]).split("x").combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. +The results are grouped back when returning the result from the Task. +While this example +illustrates mapping and grouping of results over a single parameter, Pydra +extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/genindex.html b/effigies_input-spec-suggestions/genindex.html new file mode 100644 index 0000000000..fa1d0d0d53 --- /dev/null +++ b/effigies_input-spec-suggestions/genindex.html @@ -0,0 +1,1283 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/index.html b/effigies_input-spec-suggestions/index.html new file mode 100644 index 0000000000..a74ffabda9 --- /dev/null +++ b/effigies_input-spec-suggestions/index.html @@ -0,0 +1,244 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/input_spec.html b/effigies_input-spec-suggestions/input_spec.html new file mode 100644 index 0000000000..53a1c31f77 --- /dev/null +++ b/effigies_input-spec-suggestions/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/objects.inv b/effigies_input-spec-suggestions/objects.inv new file mode 100644 index 0000000000..92761904eb Binary files /dev/null and b/effigies_input-spec-suggestions/objects.inv differ diff --git a/effigies_input-spec-suggestions/output_spec.html b/effigies_input-spec-suggestions/output_spec.html new file mode 100644 index 0000000000..e1b718171c --- /dev/null +++ b/effigies_input-spec-suggestions/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/py-modindex.html b/effigies_input-spec-suggestions/py-modindex.html new file mode 100644 index 0000000000..9b28750ce6 --- /dev/null +++ b/effigies_input-spec-suggestions/py-modindex.html @@ -0,0 +1,250 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.messenger +
    + pydra.utils.profiler +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/search.html b/effigies_input-spec-suggestions/search.html new file mode 100644 index 0000000000..0fbce2ac83 --- /dev/null +++ b/effigies_input-spec-suggestions/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/searchindex.js b/effigies_input-spec-suggestions/searchindex.js new file mode 100644 index 0000000000..29ef27e7fd --- /dev/null +++ b/effigies_input-spec-suggestions/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.messenger", "api/pydra.utils.profiler", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.profiler.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.messenger module", "pydra.utils.profiler module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 6, 7, 8, 9, 11, 16, 18, 22, 23, 24, 25, 26], "pydra": [0, 20, 21, 22, 24, 26], "workflow": [0, 1, 4, 5, 6, 9, 11, 15, 20, 21, 23, 26, 27], "engin": [0, 19, 20, 26], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26], "rewrit": 0, "nipyp": [0, 7, 19, 20, 23], "map": [0, 5, 10, 12, 22, 23, 26], "join": 0, "first": [0, 21], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 24, 25], "oper": [0, 7, 10, 26], "It": [0, 4, 10, 21, 22, 23], "form": [0, 6, 8, 10, 22, 25], "core": [0, 1, 11, 19, 20], "2": [0, 1, 6, 11, 15, 18, 22, 23, 24, 26], "0": [0, 1, 4, 6, 8, 11, 15, 18, 23], "ecosystem": [0, 23], "check_latest_vers": [0, 23], "set_input_valid": [0, 23, 24], "flag": [0, 1, 2, 4, 18, 20, 22, 24, 25], "fals": [0, 1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 19, 24, 25], "packag": [0, 20, 22, 23], "auditflag": [0, 1, 4, 12, 18], "all": [0, 1, 4, 5, 7, 8, 9, 10, 11, 18, 20, 21, 22, 24, 26], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20], "prov": [0, 1, 18], "resourc": [0, 1, 2, 18, 19, 23], "dockertask": [0, 1, 12, 20, 22], "container_arg": [0, 1, 12, 20], "init": [0, 1, 12], "shellcommandtask": [0, 1, 3, 12, 20, 22, 24, 25], "cmdline": [0, 1, 12, 20], "command_arg": [0, 1, 12, 20], "input_spec": [0, 1, 4, 6, 7, 9, 12, 20, 22, 24, 25], "output_spec": [0, 1, 4, 6, 7, 9, 12, 24, 25], "submitt": [0, 1, 6, 20], "close": [0, 1, 6, 11, 13], "expand_runn": [0, 1, 11], "expand_workflow": [0, 1, 11], "submit_from_cal": [0, 1, 11], "add": [0, 1, 4, 5, 20, 22], "checksum": [0, 1, 4, 6, 20], "create_connect": [0, 1, 4], "create_dotfil": [0, 1, 4, 20], "graph_sort": [0, 1, 4], "node": [0, 1, 4, 5, 8, 9, 10, 12, 19, 20, 22, 23, 26], "set_output": [0, 1, 4, 22], "submodul": 0, "audit": [0, 1, 4, 12, 18, 20, 23], "modul": [0, 1, 14, 17, 23], "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "monitor": [0, 1, 2, 12, 18, 19], "start_audit": [0, 2], "boutiqu": [0, 1, 20], "boshtask": [0, 3, 20], "taskbas": [0, 1, 4, 6, 11, 12, 22], "audit_flag": [0, 1, 2, 4, 12], "cache_dir": [0, 1, 4, 12], "cache_loc": [0, 1, 4, 6, 12, 20], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 6, 8, 10, 20, 21, 22, 23, 24, 26], "cont_dim": [0, 1, 4, 8, 10, 12, 20], "done": [0, 4, 26], "error": [0, 1, 4, 6, 7, 8, 9, 11, 19, 20, 23, 24, 25], "generated_output_nam": [0, 4, 9], "get_input_el": [0, 4], "help": [0, 4, 22, 23], "output_dir": [0, 1, 4, 7, 9, 25], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 6, 7, 9, 10, 20, 21, 22, 23], "set_stat": [0, 4], "split": [0, 4, 7, 8, 10, 12, 21, 22, 26], "uid": [0, 4], "version": [0, 4, 24], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "graph": [0, 1, 4, 11, 18, 20, 22, 23, 26], "digraph": [0, 5], "add_edg": [0, 5], "add_edges_descript": [0, 1, 4, 5], "add_nod": [0, 5], "calculate_max_path": [0, 5], "copi": [0, 5, 6, 9, 12, 20, 24, 26], "create_dotfile_detail": [0, 5], "create_dotfile_nest": [0, 5], "create_dotfile_simpl": [0, 5], "edg": [0, 5], "edges_nam": [0, 5], "export_graph": [0, 5], "nodes_detail": [0, 5], "nodes_names_map": [0, 5], "remove_nod": [0, 5], "remove_nodes_connect": [0, 5], "remove_previous_connect": [0, 5], "remove_successors_nod": [0, 5], "sorted_nod": [0, 5], "sorted_nodes_nam": [0, 5], "sort": [0, 1, 4, 5, 6], "helper": [0, 1], "pydrafilelock": [0, 6], "argstr_format": [0, 6], "copyfile_workflow": [0, 6], "create_checksum": [0, 6], "custom_valid": [0, 6], "ensure_list": [0, 6, 7], "execut": [0, 1, 6, 9, 11, 12, 13, 19, 22, 23, 24, 25, 26], "gather_runtime_info": [0, 6], "get_available_cpu": [0, 6, 20], "get_open_loop": [0, 6], "hash_funct": [0, 6], "hash_valu": [0, 6], "load_and_run": [0, 6, 20], "load_and_run_async": [0, 6], "load_result": [0, 6], "load_task": [0, 6], "make_klass": [0, 6], "output_from_inputfield": [0, 6], "position_sort": [0, 6], "print_help": [0, 6], "read_and_displai": [0, 6], "read_and_display_async": [0, 6], "read_stream_and_displai": [0, 6], "record_error": [0, 6], "save": [0, 6], "task_hash": [0, 6], "helpers_fil": [0, 1], "copyfil": [0, 7, 24], "copyfile_input": [0, 7, 9], "fname_presuffix": [0, 7], "get_related_fil": [0, 7], "hash_dir": [0, 7, 20], "hash_fil": [0, 7], "is_contain": [0, 7], "is_existing_fil": [0, 7], "is_local_fil": [0, 7], "on_cif": [0, 7], "related_filetype_set": [0, 7], "split_filenam": [0, 7], "template_upd": [0, 7, 9], "template_update_singl": [0, 7], "helpers_st": [0, 1], "pydrastateerror": [0, 8, 20], "add_name_combin": [0, 8], "add_name_splitt": [0, 8], "combine_final_group": [0, 8], "converter_groups_to_input": [0, 8], "flatten": [0, 8], "input_shap": [0, 8], "inputs_types_to_dict": [0, 8], "iter_split": [0, 8], "map_split": [0, 8], "remove_inp_from_splitter_rpn": [0, 8], "rpn2splitter": [0, 8], "splits_group": [0, 8], "splitter2rpn": [0, 8], "spec": [0, 1, 4, 6, 7, 12, 20, 25, 27], "basespec": [0, 1, 4, 9, 12], "check_fields_input_spec": [0, 9], "check_metadata": [0, 9], "collect_additional_output": [0, 9], "hash": [0, 6, 7, 9, 12, 20, 22, 23], "retrieve_valu": [0, 9], "containerspec": [0, 9], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 23, 24, 25, 27], "container_xarg": [0, 9], "imag": [0, 9, 22], "directori": [0, 1, 2, 4, 6, 7, 9, 12, 20, 22, 24], "dockerspec": [0, 9], "file": [0, 4, 6, 9, 12, 18, 19, 20, 22, 23, 24, 25], "functionspec": [0, 9], "lazyfield": [0, 9], "get_valu": [0, 9], "multiinputfil": [0, 9], "multiinputobj": [0, 9, 24], "convert": [0, 8, 9, 20, 22, 24], "multioutputfil": [0, 9], "multioutputobj": [0, 9, 24], "get_output_field": [0, 9], "output": [0, 1, 2, 4, 5, 6, 7, 9, 10, 18, 20, 22, 23, 24, 26, 27], "runtim": [0, 6, 9], "cpu_peak_perc": [0, 9], "rss_peak_gb": [0, 9], "vms_peak_gb": [0, 9], "runtimespec": [0, 9], "network": [0, 9], "outdir": [0, 5, 9], "shelloutspec": [0, 9, 25], "return_cod": [0, 9], "stderr": [0, 9, 25], "stdout": [0, 9, 25], "shellspec": [0, 9, 22, 24], "arg": [0, 1, 3, 6, 9, 12, 22], "singularityspec": [0, 9], "specinfo": [0, 1, 4, 9, 12, 22, 24, 25], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 24, 25, 26], "field": [0, 1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 25, 26, 27], "name": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 22, 24, 25], "taskhook": [0, 9], "post_run": [0, 9], "post_run_task": [0, 9], "pre_run": [0, 9], "pre_run_task": [0, 9], "reset": [0, 9], "attr_field": [0, 9], "attr_fields_dict": [0, 9], "donoth": [0, 9], "path_to_str": [0, 9], "state": [0, 1, 4, 8, 11, 12, 18, 20, 23, 27], "splitter": [0, 4, 8, 10, 20, 21, 22, 27], "splitter_rpn_compact": [0, 10], "splitter_rpn": [0, 8, 10], "splitter_fin": [0, 10], "other_st": [0, 8, 10], "inner_input": [0, 8, 10], "states_ind": [0, 10], "states_v": [0, 10], "inputs_ind": [0, 10], "group_for_input": [0, 8, 10], "group_for_inputs_fin": [0, 10], "groups_stack_fin": [0, 10], "final_combined_ind_map": [0, 10], "combiner_valid": [0, 10], "current_combin": [0, 10], "current_combiner_al": [0, 10], "current_splitt": [0, 10], "current_splitter_rpn": [0, 10], "prepare_input": [0, 10], "prepare_st": [0, 10], "prepare_states_combined_ind": [0, 10], "prepare_states_ind": [0, 10], "prepare_states_v": [0, 10], "prev_state_combin": [0, 10], "prev_state_combiner_al": [0, 10], "prev_state_splitt": [0, 10], "prev_state_splitter_rpn": [0, 10], "prev_state_splitter_rpn_compact": [0, 10], "set_input_group": [0, 10], "splitter_rpn_fin": [0, 10], "splitter_valid": [0, 10], "update_connect": [0, 10], "get_runnable_task": [0, 11], "is_runn": [0, 11], "prepare_runnable_with_st": [0, 11], "task": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 13, 15, 20, 23, 24, 25, 26, 27], "containertask": [0, 1, 12, 22, 24], "bind_path": [0, 12], "bind": [0, 12, 20], "container_check": [0, 12], "functiontask": [0, 12, 15, 20, 22], "singularitytask": [0, 12, 20, 22], "split_cmd": [0, 12], "worker": [0, 1, 11, 20], "concurrentfutureswork": [0, 13], "exec_as_coro": [0, 13], "run_el": [0, 13], "daskwork": [0, 13], "exec_dask": [0, 13], "distributedwork": [0, 13], "fetch_finish": [0, 13], "max_job": [0, 13], "sgework": [0, 13], "check_for_results_fil": [0, 13], "get_output_by_task_pkl": [0, 13], "get_tasks_to_run": [0, 13], "submit_array_job": [0, 13], "serialwork": [0, 13], "exec_seri": [0, 13], "slurmwork": [0, 13], "mark": [0, 5, 22], "function": [0, 7, 8, 9, 14, 19, 20, 23, 24, 25, 27], "annot": [0, 15, 22], "util": [0, 1, 2], "messeng": [0, 1, 2, 4, 12, 17], "filemesseng": [0, 18], "send": [0, 1, 2, 11, 18], "printmesseng": [0, 18], "remoterestmesseng": [0, 18], "runtimehook": [0, 18], "resource_monitor_post_stop": [0, 18], "resource_monitor_pre_start": [0, 18], "task_execute_post_exit": [0, 18], "task_execute_pre_entri": [0, 18], "task_run_entri": [0, 18], "task_run_exit": [0, 18], "collect_messag": [0, 18], "gen_uuid": [0, 18], "make_messag": [0, 18], "now": [0, 18, 20, 22], "send_messag": [0, 18], "profil": [0, 17], "resourcemonitor": [0, 19], "fname": [0, 6, 7, 19], "run": [0, 1, 4, 5, 6, 7, 9, 10, 11, 13, 19, 20, 22, 23], "stop": [0, 19], "get_max_resources_us": [0, 19], "get_system_total_memory_gb": [0, 19], "log_nodes_cb": [0, 19], "valu": [1, 4, 6, 7, 8, 9, 10, 18, 19, 20, 21, 22, 23, 24, 25, 26], "qualnam": [1, 18], "type": [1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 20, 22, 25, 27], "start": [1, 2, 5, 18, 19, 24], "1": [1, 4, 6, 7, 8, 9, 11, 13, 18, 22, 23, 24, 26], "boundari": [1, 18], "3": [1, 6, 11, 18, 23, 26], "track": [1, 2, 9, 10, 12, 18, 19, 22, 23], "proven": [1, 2, 12, 18, 23], "do": [1, 11, 18, 25], "onli": [1, 4, 6, 7, 10, 11, 12, 18, 21, 24, 25, 26], "container_info": [1, 3, 12, 22], "kwarg": [1, 3, 4, 6, 9, 11, 12, 13, 18], "extend": [1, 12, 22, 23, 26], "shell": [1, 3, 9, 12, 23, 24, 25, 27], "command": [1, 3, 5, 6, 7, 9, 12, 23, 24, 25, 27], "container": [1, 9, 12], "docker": [1, 7, 9, 12, 22, 23], "properti": [1, 4, 5, 9, 10, 12, 19], "get": [1, 4, 5, 6, 8, 9, 10, 12, 18, 19, 20, 22, 26], "specif": [1, 4, 6, 9, 10, 12, 18, 19, 20, 21, 22, 23, 26, 27], "cli": [1, 12], "argument": [1, 12, 22, 24], "return": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 24, 25], "list": [1, 4, 5, 6, 7, 8, 9, 10, 12, 20, 21, 22, 24, 25, 26], "ha": [1, 4, 5, 7, 10, 11, 12, 21, 22, 23, 24, 25, 26], "wrap": [1, 12], "element": [1, 4, 10, 12, 20, 21, 22, 24, 25, 26], "actual": [1, 12], "line": [1, 6, 9, 12, 22, 23], "submit": [1, 12], "plugin": [1, 6, 11], "cf": [1, 11], "object": [1, 2, 4, 5, 6, 7, 9, 10, 11, 13, 18, 22, 24, 25], "backend": [1, 11], "previous": [1, 5, 11, 23], "loop": [1, 6, 11, 13, 23, 27], "async": [1, 6, 11, 13], "runnabl": [1, 5, 11, 13, 22, 26], "wait": [1, 11], "rerun": [1, 4, 6, 11, 12, 13, 20], "thi": [1, 4, 5, 6, 7, 8, 9, 11, 13, 19, 21, 22, 23, 24, 25, 26], "coroutin": [1, 6, 11, 13], "handl": [1, 2, 11, 20, 23], "expans": [1, 11], "remov": [1, 5, 7, 8, 10, 11, 20, 24, 25], "ani": [1, 4, 5, 9, 11, 19, 22, 23, 24, 25], "from": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 20, 21, 22, 23, 24, 25, 26], "If": [1, 2, 4, 6, 7, 11, 24, 25], "set": [1, 4, 6, 7, 9, 10, 11, 13, 19, 20, 21, 22, 23, 26], "default": [1, 7, 9, 11, 24, 25], "aggreg": [1, 11, 24], "them": [1, 5, 6, 11, 20], "true": [1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 18, 22, 24, 25], "complet": [1, 11, 22], "paramet": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 22, 23, 26], "instanc": [1, 4, 6, 11, 22], "bool": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 18, 22, 24, 25], "await": [1, 11, 13], "futur": [1, 11, 13, 20], "befor": [1, 4, 10, 11, 24], "wf": [1, 6, 9, 11, 20, 22], "expand": [1, 11, 20], "stateless": [1, 11, 26], "method": [1, 4, 5, 7, 11, 20, 21, 22, 26], "reach": [1, 11], "_run_task": [1, 11], "comput": [1, 4, 7, 9, 11, 23], "should": [1, 7, 8, 9, 10, 11, 22, 24, 25], "call": [1, 11, 19, 21, 22, 23, 24, 26], "onc": [1, 11], "per": [1, 11], "serv": [1, 11, 22], "bridg": [1, 11], "between": [1, 5, 10, 11, 22, 23, 24], "sync": [1, 11], "land": [1, 11], "There": [1, 11, 22, 24], "ar": [1, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 21, 22, 23, 24, 25, 26], "4": [1, 11, 18, 23], "potenti": [1, 11], "path": [1, 4, 5, 6, 7, 9, 11, 12, 18, 20, 24], "differ": [1, 7, 11, 22, 23, 25, 26], "than": [1, 7, 11, 22, 25], "without": [1, 4, 5, 7, 10, 11, 22], "python": [1, 6, 11, 12, 13, 20, 22, 23, 24, 26], "10": [1, 11], "minimum": [1, 11], "probabl": [1, 11], "refactor": [1, 11, 20], "us": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 20, 21, 22, 23, 24, 25, 26], "structur": [1, 4, 5, 9, 11], "pattern": [1, 11], "match": [1, 11], "str": [1, 4, 6, 7, 9, 10, 12, 18, 22, 24, 25], "messenger_arg": [1, 2, 4, 12], "propagate_rerun": [1, 4, 20], "A": [1, 2, 4, 5, 6, 7, 9, 10, 13, 18, 19, 22, 24, 25, 26], "composit": [1, 4], "ad": [1, 4, 5, 6, 8, 20, 22, 25, 27], "calcul": [1, 4, 5, 6, 10, 20], "uniqu": [1, 4, 6, 18], "creat": [1, 2, 4, 5, 6, 7, 8, 10, 16, 20, 22, 23, 24, 25, 26], "need": [1, 4, 5, 9, 10, 21, 26], "have": [1, 4, 6, 7, 8, 10, 22, 25, 26], "input": [1, 4, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 25, 27], "etc": [1, 4, 24], "detail": [1, 4, 5, 22], "connect": [1, 4, 5, 8, 10, 22], "particular": [1, 2, 4, 9], "exist": [1, 4, 22, 23, 24, 25], "self": [1, 2, 4, 5, 10], "descript": [1, 4, 5, 20, 24, 25], "simpl": [1, 4, 5, 6, 20, 22, 24], "export": [1, 4, 5], "dotfil": [1, 4, 5, 20], "option": [1, 2, 4, 10, 18, 22, 24, 26], "other": [1, 4, 5, 7, 8, 20, 22, 23, 24, 25, 26], "format": [1, 4, 5, 6, 18, 20], "represent": [1, 4, 10], "write": [1, 4, 6, 12, 18], "todo": [1, 4, 6, 9, 18], "keep": [2, 7, 9, 10, 19], "inform": [2, 6, 10, 18, 24, 25], "develop": [2, 23], "determin": [2, 10], "whether": [2, 4, 7, 13], "enabl": [2, 20, 23, 24], "obj": [2, 4, 5, 6, 7, 11, 18], "check": [2, 4, 5, 7, 9, 11, 20, 24], "boolean": 2, "AND": 2, "oudit_flag": 2, "messag": [2, 18, 23], "dict": [2, 4, 6, 7, 10, 12, 18, 24], "json": [2, 12, 18, 19, 23], "ld": [2, 18, 23], "sent": [2, 24, 25], "end": [2, 8, 19, 26], "odir": 2, "record": [2, 18, 19], "until": [2, 6, 13], "case": [2, 6], "insid": [2, 24], "o": [2, 6, 7, 9, 18, 20, 24], "pathlik": [2, 6, 9, 18], "descriptor": [3, 20], "basic": [4, 9, 21, 22], "process": [4, 6, 9, 10, 12, 18, 19, 20], "gener": [4, 6, 8, 9, 18, 22, 23], "step": 4, "which": [4, 5, 6, 7, 8, 10], "both": [4, 22], "elemntari": 4, "inherit": [4, 9, 22], "what": 4, "avail": [4, 6, 9, 10, 20], "locat": 4, "cach": [4, 6, 23], "sourc": [4, 23], "accept": [4, 19, 20], "checkpoint": 4, "restart": 4, "state_index": [4, 9], "replac": [4, 7], "recreat": 4, "overwrit": 4, "parameter": 4, "one": [4, 6, 8, 9, 13, 21, 22, 24, 26], "more": [4, 20, 22, 24, 26], "previou": [4, 8, 10, 21, 24], "been": [4, 23], "final": [4, 8, 10, 13, 21], "store": [4, 23], "rais": [4, 7, 20, 25], "an": [4, 6, 7, 9, 13, 20, 21, 22, 23, 24, 25, 26], "doesn": [4, 10, 24], "t": [4, 10, 20, 24], "depend": [4, 8, 10], "provid": [4, 6, 8, 9, 21, 22, 23, 24, 25, 26], "ind": [4, 6], "collect": [4, 6, 9, 16, 18, 23], "requir": [4, 8, 9, 20, 22, 23, 24, 25, 26], "returnhelp": 4, "print": [4, 6, 18], "filesystem": [4, 7, 12], "where": [4, 6, 21, 23, 26], "written": [4, 7, 21, 23], "": [4, 6, 8, 10, 13, 18, 20, 24, 25, 26, 27], "everyth": 4, "see": [4, 5, 25], "pickl": [4, 6, 20], "full": [4, 7, 10, 20, 21, 24], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 6, 9, 15, 18, 19, 24], "index": [4, 6, 23], "multipl": [4, 20, 21, 24, 26], "val": [4, 8], "togeth": [4, 7, 10, 21, 23, 24, 25], "indic": [4, 10, 20], "parametr": 4, "over": [4, 7, 10, 22, 23, 27], "dimens": [4, 8, 10], "assum": [4, 7, 8, 26], "so": [4, 19, 20, 22, 26], "most": [4, 22, 26], "outer": [4, 10, 21, 27], "dim": 4, "id": [4, 19], "number": [4, 6, 8, 10, 13, 20], "slurm": [4, 13, 20], "script": [4, 22], "lazi": [4, 9, 22], "look": [4, 6], "like": [4, 22], "data": [5, 6, 7, 9, 26], "support": [5, 6, 7, 20, 21, 22, 23, 24, 26], "direct": [5, 22, 23], "new_edg": 5, "new": [5, 6, 10, 19, 23, 25, 27], "new_edge_detail": 5, "fill": 5, "_nodes_detail": 5, "new_nod": 5, "insert": [5, 24], "maximum": [5, 13], "histori": 5, "predecessor": 5, "duplic": 5, "dictionari": [5, 8, 10, 18, 19, 24, 25], "same": [5, 7, 10, 21, 25, 26], "graph_det": 5, "nest": [5, 20, 22, 23, 27], "includ": [5, 7, 10, 22, 24, 25], "link": [5, 7, 18, 24], "pair": [5, 7, 8], "thei": [5, 6, 21, 26], "ext": [5, 7], "png": 5, "equir": 5, "dot": [5, 20], "current": [5, 6, 10, 20], "each": [5, 8, 10, 21, 22, 23, 24, 25, 26], "check_readi": 5, "re": [5, 10], "doe": [5, 7, 19, 24, 26], "remove_node_connect": 5, "_node_wip": 5, "when": [5, 7, 8, 9, 10, 18, 20, 21, 22, 26], "refer": 5, "readi": 5, "also": [5, 7, 9, 10, 20, 21, 24, 26], "prune": 5, "follow": [5, 6, 21, 22, 26], "presort": 5, "either": [5, 7], "administr": 6, "framework": [6, 23], "lockfil": 6, "wrapper": [6, 13], "filelock": 6, "softfilelock": 6, "make": [6, 21, 23], "work": [6, 12, 20, 22, 23, 26], "asyncio": [6, 13], "argstr": [6, 22, 24], "value_upd": 6, "field_nam": [6, 9], "updat": [6, 7, 9, 10, 15, 20], "wf_path": 6, "given": [6, 7, 9, 19], "string": [6, 7, 9, 12, 19, 24], "attribut": [6, 20, 22, 26], "custom": [6, 8, 20, 22, 24, 25], "valid": [6, 10, 20, 27], "take": [6, 7, 9, 21, 24, 25], "account": [6, 9], "ty": [6, 9], "union": [6, 24], "level": [6, 21], "depth": [6, 23], "addit": [6, 8, 9, 21, 22, 23, 24, 25, 26], "allowe_valu": 6, "tuple2list": 6, "whatev": 6, "exampl": [6, 7, 15, 21, 22, 24, 25, 26], "abc": 6, "b": [6, 10], "c": [6, 21, 23], "tupl": [6, 7, 9, 10, 12, 20, 24, 25, 26], "5": [6, 18, 19, 22, 23], "cmd": [6, 12], "strip": 6, "event": 6, "unless": [6, 24, 25], "alreadi": [6, 7, 20], "extract": [6, 22], "cpu": [6, 9, 20], "total": [6, 19], "system": [6, 7, 12, 13, 19, 20], "n_proc": [6, 13], "eventloop": 6, "tp": 6, "metadata": [6, 9, 22, 27], "precalcul": [6, 7], "recurs": [6, 7], "task_pkl": [6, 13], "load": [6, 20], "proper": [6, 20], "restor": 6, "identifi": [6, 18], "order": [6, 10, 21, 22, 24, 25, 26], "prioriti": 6, "names_onli": 6, "posit": [6, 22, 24], "convent": 6, "lowest": 6, "highest": 6, "unspecifi": 6, "neg": [6, 24], "d": 6, "e": [6, 7, 9, 10, 18, 21, 22, 24, 25, 26], "f": [6, 7], "visit": 6, "its": [6, 26], "interfac": [6, 10, 13, 20, 23], "hide_displai": 6, "captur": [6, 23], "standard": [6, 8, 9, 18], "displai": 6, "arriv": 6, "stream": 6, "read": [6, 7, 12, 20], "eof": 6, "discuss": 6, "stackoverflow": 6, "error_path": 6, "task_path": 6, "name_prefix": 6, "environ": [6, 12, 22], "port": 7, "after": [7, 10, 21, 22, 26], "part": [7, 10, 12, 23, 24, 25], "were": [7, 20, 23], "relat": [7, 10, 26], "py2": 7, "originalfil": 7, "newfil": 7, "create_new": 7, "use_hardlink": 7, "copy_related_fil": 7, "can": [7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26], "hard": [7, 24], "instead": [7, 20, 25], "symbol": 7, "symlink": 7, "regular": 7, "dest": 7, "unlink": 7, "diff": 7, "can_hardlink": 7, "hardlink": 7, "can_symlink": 7, "origin": [7, 8, 12, 23, 26], "specifi": [7, 8, 10, 12, 20, 21, 22, 24, 25], "posix": 7, "abl": 7, "preced": 7, "defin": [7, 22], "implement": [7, 9, 12, 13, 20, 23], "filelist": 7, "destin": 7, "length": [7, 8, 26], "greater": [7, 23], "filenam": [7, 19], "prefix": 7, "suffix": 7, "newpath": 7, "use_ext": 7, "manipul": [7, 23], "mai": [7, 21, 23], "charact": 7, "prepend": 7, "append": [7, 18], "extens": [7, 20, 24, 25], "absolut": 7, "modifi": 7, "import": [7, 10, 15, 21, 22], "pytest": 7, "sy": 7, "platform": 7, "startswith": 7, "win": 7, "skip": 7, "foo": 7, "nii": 7, "gz": 7, "pre": 7, "post": [7, 18], "tmp": 7, "prefoopost": 7, "include_this_fil": 7, "As": [7, 22, 24, 25], "g": [7, 9, 10, 22, 24, 25], "nifti": 7, "analyz": 7, "spm": [7, 23], "afni": [7, 23], "find": 7, "filetyp": 7, "dirpath": 7, "crypto": 7, "built": 7, "openssl_sha256": 7, "ignore_hidden_fil": 7, "ignore_hidden_dir": 7, "raise_notfound": 7, "content": 7, "everi": [7, 8, 10, 24], "singl": [7, 9, 10, 18, 20, 21, 22], "travers": 7, "cryptograph": 7, "ignor": 7, "begin": 7, "filenotfound": 7, "except": [7, 8, 20], "afil": 7, "chunk_len": 7, "8192": 7, "item": 7, "otherwis": [7, 19, 25], "cif": 7, "mount": [7, 12], "host": 7, "On": 7, "window": [7, 20], "through": [7, 26], "share": [7, 22, 23], "minshal": 7, "french": 7, "text": 7, "driver": 7, "expos": 7, "we": [7, 22, 24], "found": 7, "under": 7, "concurr": [7, 13, 20], "access": 7, "featur": [7, 22, 23, 26], "failur": [7, 20], "recent": 7, "lead": 7, "inconsist": 7, "behavior": 7, "filenotfounderror": 7, "disabl": [7, 24], "hdr": 7, "img": 7, "mat": 7, "brik": 7, "head": 7, "neuroimag": [7, 23], "interpret": 7, "pth": 7, "home": 7, "subject": 7, "state_ind": 7, "map_copyfil": 7, "templat": [7, 9, 16, 20, 22, 24, 25], "present": 7, "inputs_dict_st": 7, "spec_typ": 7, "inputs_dict": 7, "output_file_templ": [7, 22, 24, 25], "mostli": 8, "group": [8, 10, 22, 23, 27], "groups_stack": 8, "kei": [8, 10, 22, 23, 24, 26], "axi": [8, 10], "ax": [8, 10], "cur_depth": 8, "max_depth": 8, "inp": [8, 10], "shape": 8, "iter": 8, "split_it": 8, "prescrib": 8, "inputs_to_remov": 8, "due": [8, 10], "mutat": 8, "revers": [8, 24], "polish": 8, "notat": [8, 10], "recurr": 8, "algorithm": [8, 23], "perform": [8, 19, 26], "convers": [8, 24], "time": [8, 9, 23], "stack": [8, 10], "state_field": [8, 10], "translat": 8, "user": [8, 20, 21, 22, 23, 24, 25, 26], "impos": 8, "unwrap": [8, 10], "dataclass": [9, 20], "medatada": 9, "xor": [9, 24], "fulfil": 9, "mandatori": [9, 22, 24, 25], "point": [9, 12, 18, 22], "refin": 9, "design": [9, 23], "folder": 9, "invok": 9, "attr_typ": 9, "promis": 9, "chang": [9, 20, 24, 25], "classmethod": 9, "el": 9, "regard": 9, "float": [9, 15, 19, 22, 24], "repres": [9, 10, 21, 22, 23, 24, 26], "peak": 9, "consumpt": 9, "physic": 9, "ram": [9, 19], "virtual": 9, "memori": [9, 19, 20], "cwl": 9, "inlinejavascriptrequir": 9, "schemadefrequir": 9, "dockerrequir": 9, "softwarerequir": 9, "initialworkdirrequir": 9, "envvarrequir": 9, "shellcommandrequir": 9, "resourcerequir": 9, "inlinescriptrequir": 9, "shelltask": [9, 20], "exit": 9, "code": [9, 18, 20, 23], "pars": [9, 11], "singular": [9, 12, 20, 22, 23], "_noth": 9, "noth": [9, 20, 24, 25], "sequenc": 9, "least": 9, "callabl": [9, 12, 25], "hook": [9, 18], "exclude_nam": 9, "reduc": [10, 22, 23, 26], "about": [10, 24, 25], "scalar": [10, 27], "rpn": 10, "compact": [10, 18], "_na": 10, "relev": 10, "could": [10, 24], "partial": [10, 23], "associ": [10, 23], "correct": 10, "propag": 10, "explicitli": 10, "had": 10, "prepar": 10, "merg": [10, 26], "inner": [10, 20, 21], "elements_to_remove_comb": 10, "hlpst": 10, "evalu": [10, 26], "prev": 10, "come": 10, "art": 10, "_nb": 10, "especi": 10, "address": [10, 23], "variabl": [10, 12, 20], "new_other_st": 10, "new_combin": 10, "within": [11, 21, 22], "neurodock": 12, "conda": 12, "env": 12, "niceman": 12, "config": 12, "intern": [12, 13, 19], "extern": [12, 23], "callback": [12, 19], "resum": 12, "dmtcp": 12, "local": [12, 24], "fragment": 12, "remot": [12, 18], "server": 12, "isol": 12, "bound": 12, "mode": [12, 20], "opt": 12, "py": [12, 13], "meth": 12, "container_typ": 12, "func": [12, 15], "separ": [12, 16, 20, 22, 24, 25], "respect": [12, 22], "quot": 12, "thereof": 12, "parallel": 13, "pool": 13, "dask": [13, 20], "distribut": [13, 20, 23], "experiment": [13, 20], "limit": [13, 20, 22], "test": [13, 20], "finish": 13, "submiss": 13, "attr": [13, 20, 24, 25], "pend": 13, "job": 13, "poll_delai": 13, "qsub_arg": 13, "write_output_fil": 13, "max_job_array_length": 13, "50": 13, "indirect_submit_host": 13, "max_thread": 13, "poll_for_result_fil": 13, "default_threads_per_task": 13, "polls_before_checking_evict": 13, "60": 13, "collect_jobs_delai": 13, "30": 13, "default_qsub_arg": 13, "max_mem_fre": 13, "jobid": 13, "threads_request": 13, "task_qsub_arg": 13, "mem_fre": 13, "api": [13, 20, 23], "sarg": 13, "tasks_to_run": 13, "error_fil": 13, "linearli": 13, "sbatch_arg": 13, "decor": [15, 22, 23], "appli": [15, 21], "def": [15, 22], "squar": [15, 26], "promot": 15, "namespac": [16, 20], "reserv": 16, "manag": [16, 20, 26], "To": 16, "pleas": 16, "fork": 16, "redirect": 18, "truncat": 18, "open": [18, 23], "abstract": 18, "rest": 18, "endpoint": 18, "statu": [18, 19], "request": 18, "intenum": 18, "allow": [18, 20, 21, 22, 23, 24], "6": [18, 23], "collected_path": 18, "message_path": 18, "ld_op": 18, "compil": 18, "place": 18, "pld": 18, "jsonld": 18, "context": 18, "build": [18, 23, 24, 25], "non": 18, "timestamp": 18, "nidm": 18, "log": [18, 19], "pid": 19, "interv": 19, "logdir": 19, "thread": 19, "certain": 19, "frequenc": 19, "mem_mb": 19, "num_thread": 19, "pyfunc": 19, "integ": [19, 24], "high": 19, "watermark": 19, "far": 19, "dure": 19, "mb": 19, "gb": 19, "statist": [19, 22], "pipelin": [19, 23], "being": [19, 23], "consid": [19, 24], "info": 19, "logger": 19, "fix": 20, "issu": 20, "guid": [20, 23], "docstr": 20, "messang": 20, "syntax": [20, 22, 24, 25, 26], "newer": 20, "padra": 20, "improv": [20, 22], "adapt": 20, "better": 20, "switch": 20, "pkg_resourc": 20, "declare_namespac": 20, "stdlib": 20, "pkgutil": 20, "extend_path": 20, "move": 20, "readm": 20, "rst": 20, "declar": [20, 22], "ensur": [20, 23], "edit": 20, "instal": 20, "conflict": 20, "mention": [20, 24, 25], "txt": 20, "tutori": 20, "repo": 20, "codecov": 20, "_connect": 20, "numpi": [20, 22], "arrai": 20, "to_job": 20, "kept": 20, "standalon": [20, 22, 23], "create_pyscript": 20, "simplifi": 20, "report": 20, "fli": 20, "make_class": 20, "properli": 20, "azur": 20, "ci": 20, "etelementri": 20, "verbos": 20, "reorgan": 20, "small": 20, "some": [20, 23], "osx": 20, "sto": 20, "travi": 20, "right": 20, "pass": [20, 21, 22, 23, 24, 25], "test_rerun": 20, "dimension": [20, 21], "how": [20, 22], "much": 20, "sphinx": 20, "document": 20, "contribut": 20, "md": 20, "empti": [20, 24], "fail": 20, "big": 20, "next": [20, 22, 26], "lzout": [20, 22], "all_": 20, "dataflow": [20, 21, 26, 27], "creation": 20, "notebook": 20, "concept": [20, 21, 22, 23, 26], "initi": 20, "In": [21, 22, 23, 24, 25, 26], "achiev": 21, "note": [21, 23], "sens": 21, "x": [21, 22, 26], "x_1": [21, 26], "x_2": [21, 26], "x_n": [21, 26], "mapsto": [21, 26], "out": [21, 22], "out_": 21, "comb": 21, "x_i": 21, "situat": 21, "variou": 21, "wai": [21, 26], "section": [21, 22, 24, 25, 26], "might": [21, 22, 23], "want": [21, 24, 25], "y": [21, 22, 26], "would": [21, 26], "two": [21, 22, 26], "y1": 21, "y2": 21, "y_m": [21, 26], "longmapsto": [21, 26], "y_1": [21, 26], "howev": [21, 24], "One": [21, 22, 26], "These": [21, 22, 23, 26], "mix": 21, "describ": [22, 24, 26], "thu": 22, "construct": [22, 23], "dual": 22, "sever": [22, 23, 24], "applic": [22, 23, 26], "librari": [22, 23], "interact": [22, 23], "termin": 22, "np": 22, "fft": 22, "ndarrai": 22, "fft_task": 22, "random": 22, "rand": 22, "512": 22, "anoth": [22, 23], "arbitrari": [22, 23, 26], "mean": [22, 25], "std": 22, "mean_dev": 22, "my_data": 22, "st": 22, "stdev": 22, "facilit": [22, 23], "downstream": 22, "pwd": 22, "l": 22, "my_dir": 22, "accommod": 22, "complex": [22, 24, 26], "fsl": [22, 23], "bet": [22, 24], "brain": 22, "tool": [22, 23], "input_fil": 22, "output_fil": 22, "m": [22, 24], "treat": [22, 24], "shown": 22, "even": 22, "out_fil": [22, 24], "bet_input_spec": [22, 24], "in_fil": [22, 24], "help_str": [22, 24, 25], "_br": [22, 24], "mask": [22, 24], "binari": [22, 24], "child": 22, "parent": [22, 24, 25], "softwar": [22, 23], "extrem": 22, "project": [22, 23], "encapsul": 22, "technologi": 22, "scientif": [22, 23], "reproduc": [22, 23], "behind": [22, 23], "directli": 22, "automat": 22, "equival": 22, "busybox": 22, "subclass": 22, "act": 22, "hashabl": 22, "unit": 22, "unlik": 22, "emb": 22, "acycl": [22, 23], "simpli": 22, "special": [22, 24, 26], "assign": 22, "rather": 22, "mult": 22, "mlt": 22, "lzin": 22, "add2": 22, "control": [22, 26], "heart": 22, "power": [22, 23], "formal": 22, "Its": 22, "recombin": [22, 23], "task_with_st": 22, "respons": 22, "back": 22, "while": [22, 23], "illustr": 22, "scalabl": 22, "lightweight": 23, "commun": 23, "purpos": 23, "domain": 23, "often": 23, "sophist": 23, "analys": 23, "encompass": 23, "larg": 23, "necessarili": 23, "author": 23, "program": 23, "common": 23, "practic": 23, "semi": 23, "manual": 23, "scientist": 23, "approach": 23, "conceptu": 23, "easi": 23, "consum": 23, "prone": 23, "difficult": 23, "consist": 23, "demand": 23, "organ": 23, "fulli": 23, "autom": 23, "wa": [23, 24, 25, 26], "motiv": 23, "second": [23, 26], "uniform": 23, "compon": [23, 27], "born": 23, "decad": 23, "ant": 23, "freesurf": 23, "flexibl": [23, 26], "made": 23, "ideal": 23, "basi": 23, "popular": 23, "preprocess": 23, "fmriprep": 23, "pac": 23, "meant": 23, "eas": 23, "mind": 23, "itself": 23, "goal": [23, 26], "well": 23, "reusabl": 23, "customiz": 23, "compos": 23, "encourag": 23, "similar": [23, 26], "model": 23, "global": 23, "reus": 23, "alongsid": 23, "integr": 23, "nativ": 23, "via": 23, "mechan": 23, "activ": 23, "releas": 23, "8": 23, "7": 23, "programm": 23, "subpackag": 23, "search": 23, "page": 23, "let": 24, "alwai": [24, 25], "you": [24, 25], "think": [24, 25], "usual": [24, 25], "top": [24, 25], "your": [24, 25], "cover": [24, 25], "customis": [24, 25], "three": [24, 25], "But": 24, "below": 24, "field1": 24, "field1_nam": 24, "ib": [24, 25], "field1_typ": 24, "shorter": 24, "abov": 24, "short": [24, 25], "sep": 24, "v": 24, "inp_field": 24, "nonneg": 24, "allowed_valu": 24, "mutual": 24, "exclus": 24, "possibl": [24, 25], "container_path": 24, "file1": [24, 25], "output_field_nam": [24, 25], "keep_extens": [24, 25], "readonli": 24, "flda": 24, "fldb": 24, "formatt": 24, "entir": [24, 25], "allowev_valu": 24, "out1": 25, "inp1": [25, 26], "inp2": [25, 26], "similarli": 25, "recogn": 25, "main": 26, "distinguish": 26, "typic": 26, "involv": 26, "signific": 26, "overhead": 26, "up": 26, "simplest": 26, "therefor": 26, "diagram": 26, "colour": 26, "whenev": 26, "complic": 26, "wise": 26, "parenthesi": 26, "y_2": 26, "y_n": 26, "bracket": 26, "schemat": 26, "inp3": 26, "pairwis": 26, "explain": 26}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "check_latest_version"], [1, 0, 0, "-", "engine"], [14, 0, 0, "-", "mark"], [0, 1, 1, "", "set_input_validator"], [16, 0, 0, "-", "tasks"], [17, 0, 0, "-", "utils"]], "pydra.engine": [[1, 2, 1, "", "AuditFlag"], [1, 2, 1, "", "DockerTask"], [1, 2, 1, "", "ShellCommandTask"], [1, 2, 1, "", "Submitter"], [1, 2, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "graph"], [6, 0, 0, "-", "helpers"], [7, 0, 0, "-", "helpers_file"], [8, 0, 0, "-", "helpers_state"], [9, 0, 0, "-", "specs"], [10, 0, 0, "-", "state"], [11, 0, 0, "-", "submitter"], [12, 0, 0, "-", "task"], [13, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 3, 1, "", "ALL"], [1, 3, 1, "", "NONE"], [1, 3, 1, "", "PROV"], [1, 3, 1, "", "RESOURCE"]], "pydra.engine.DockerTask": [[1, 4, 1, "", "container_args"], [1, 3, 1, "", "init"]], "pydra.engine.ShellCommandTask": [[1, 4, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 3, 1, "", "input_spec"], [1, 3, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 5, 1, "", "close"], [1, 5, 1, "", "expand_runnable"], [1, 5, 1, "", "expand_workflow"], [1, 5, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 5, 1, "", "add"], [1, 4, 1, "", "checksum"], [1, 5, 1, "", "create_connections"], [1, 5, 1, "", "create_dotfile"], [1, 4, 1, "", "graph_sorted"], [1, 4, 1, "", "nodes"], [1, 5, 1, "", "set_output"]], "pydra.engine.audit": [[2, 2, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 5, 1, "", "audit_check"], [2, 5, 1, "", "audit_message"], [2, 5, 1, "", "audit_task"], [2, 5, 1, "", "finalize_audit"], [2, 5, 1, "", "monitor"], [2, 5, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 2, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 2, 1, "", "TaskBase"], [4, 2, 1, "", "Workflow"], [4, 1, 1, "", "is_lazy"], [4, 1, 1, "", "is_task"], [4, 1, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 3, 1, "", "audit_flags"], [4, 4, 1, "", "cache_dir"], [4, 4, 1, "", "cache_locations"], [4, 4, 1, "", "can_resume"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "checksum_states"], [4, 5, 1, "", "combine"], [4, 4, 1, "", "cont_dim"], [4, 4, 1, "", "done"], [4, 4, 1, "", "errored"], [4, 4, 1, "", "generated_output_names"], [4, 5, 1, "", "get_input_el"], [4, 5, 1, "", "help"], [4, 4, 1, "", "output_dir"], [4, 4, 1, "", "output_names"], [4, 5, 1, "", "pickle_task"], [4, 5, 1, "", "result"], [4, 5, 1, "", "set_state"], [4, 5, 1, "", "split"], [4, 4, 1, "", "uid"], [4, 4, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 5, 1, "", "add"], [4, 4, 1, "", "checksum"], [4, 5, 1, "", "create_connections"], [4, 5, 1, "", "create_dotfile"], [4, 4, 1, "", "graph_sorted"], [4, 4, 1, "", "nodes"], [4, 5, 1, "", "set_output"]], "pydra.engine.graph": [[5, 2, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[5, 5, 1, "", "add_edges"], [5, 5, 1, "", "add_edges_description"], [5, 5, 1, "", "add_nodes"], [5, 5, 1, "", "calculate_max_paths"], [5, 5, 1, "", "copy"], [5, 5, 1, "", "create_dotfile_detailed"], [5, 5, 1, "", "create_dotfile_nested"], [5, 5, 1, "", "create_dotfile_simple"], [5, 4, 1, "", "edges"], [5, 4, 1, "", "edges_names"], [5, 5, 1, "", "export_graph"], [5, 4, 1, "", "nodes"], [5, 4, 1, "", "nodes_details"], [5, 4, 1, "", "nodes_names_map"], [5, 5, 1, "", "remove_nodes"], [5, 5, 1, "", "remove_nodes_connections"], [5, 5, 1, "", "remove_previous_connections"], [5, 5, 1, "", "remove_successors_nodes"], [5, 4, 1, "", "sorted_nodes"], [5, 4, 1, "", "sorted_nodes_names"], [5, 5, 1, "", "sorting"]], "pydra.engine.helpers": [[6, 2, 1, "", "PydraFileLock"], [6, 1, 1, "", "argstr_formatting"], [6, 1, 1, "", "copyfile_workflow"], [6, 1, 1, "", "create_checksum"], [6, 1, 1, "", "custom_validator"], [6, 1, 1, "", "ensure_list"], [6, 1, 1, "", "execute"], [6, 1, 1, "", "gather_runtime_info"], [6, 1, 1, "", "get_available_cpus"], [6, 1, 1, "", "get_open_loop"], [6, 1, 1, "", "hash_function"], [6, 1, 1, "", "hash_value"], [6, 1, 1, "", "load_and_run"], [6, 1, 1, "", "load_and_run_async"], [6, 1, 1, "", "load_result"], [6, 1, 1, "", "load_task"], [6, 1, 1, "", "make_klass"], [6, 1, 1, "", "output_from_inputfields"], [6, 1, 1, "", "position_sort"], [6, 1, 1, "", "print_help"], [6, 1, 1, "", "read_and_display"], [6, 1, 1, "", "read_and_display_async"], [6, 1, 1, "", "read_stream_and_display"], [6, 1, 1, "", "record_error"], [6, 1, 1, "", "save"], [6, 1, 1, "", "task_hash"]], "pydra.engine.helpers_file": [[7, 1, 1, "", "copyfile"], [7, 1, 1, "", "copyfile_input"], [7, 1, 1, "", "copyfiles"], [7, 1, 1, "", "ensure_list"], [7, 1, 1, "", "fname_presuffix"], [7, 1, 1, "", "get_related_files"], [7, 1, 1, "", "hash_dir"], [7, 1, 1, "", "hash_file"], [7, 1, 1, "", "is_container"], [7, 1, 1, "", "is_existing_file"], [7, 1, 1, "", "is_local_file"], [7, 1, 1, "", "on_cifs"], [7, 6, 1, "", "related_filetype_sets"], [7, 1, 1, "", "split_filename"], [7, 1, 1, "", "template_update"], [7, 1, 1, "", "template_update_single"]], "pydra.engine.helpers_state": [[8, 7, 1, "", "PydraStateError"], [8, 1, 1, "", "add_name_combiner"], [8, 1, 1, "", "add_name_splitter"], [8, 1, 1, "", "combine_final_groups"], [8, 1, 1, "", "converter_groups_to_input"], [8, 1, 1, "", "flatten"], [8, 1, 1, "", "input_shape"], [8, 1, 1, "", "inputs_types_to_dict"], [8, 1, 1, "", "iter_splits"], [8, 1, 1, "", "map_splits"], [8, 1, 1, "", "remove_inp_from_splitter_rpn"], [8, 1, 1, "", "rpn2splitter"], [8, 1, 1, "", "splits_groups"], [8, 1, 1, "", "splitter2rpn"]], "pydra.engine.specs": [[9, 2, 1, "", "BaseSpec"], [9, 2, 1, "", "ContainerSpec"], [9, 2, 1, "", "Directory"], [9, 2, 1, "", "DockerSpec"], [9, 2, 1, "", "File"], [9, 2, 1, "", "FunctionSpec"], [9, 2, 1, "", "LazyField"], [9, 2, 1, "", "MultiInputFile"], [9, 2, 1, "", "MultiInputObj"], [9, 2, 1, "", "MultiOutputFile"], [9, 2, 1, "", "MultiOutputObj"], [9, 2, 1, "", "Result"], [9, 2, 1, "", "Runtime"], [9, 2, 1, "", "RuntimeSpec"], [9, 2, 1, "", "ShellOutSpec"], [9, 2, 1, "", "ShellSpec"], [9, 2, 1, "", "SingularitySpec"], [9, 2, 1, "", "SpecInfo"], [9, 2, 1, "", "TaskHook"], [9, 1, 1, "", "attr_fields"], [9, 1, 1, "", "attr_fields_dict"], [9, 1, 1, "", "donothing"], [9, 1, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[9, 5, 1, "", "check_fields_input_spec"], [9, 5, 1, "", "check_metadata"], [9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "copyfile_input"], [9, 4, 1, "", "hash"], [9, 5, 1, "", "retrieve_values"], [9, 5, 1, "", "template_update"]], "pydra.engine.specs.ContainerSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "container_xargs"], [9, 3, 1, "", "image"]], "pydra.engine.specs.DockerSpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.FunctionSpec": [[9, 5, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[9, 5, 1, "", "get_value"]], "pydra.engine.specs.MultiInputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.MultiOutputObj": [[9, 5, 1, "", "converter"]], "pydra.engine.specs.Result": [[9, 3, 1, "", "errored"], [9, 5, 1, "", "get_output_field"], [9, 3, 1, "", "output"], [9, 3, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[9, 3, 1, "", "cpu_peak_percent"], [9, 3, 1, "", "rss_peak_gb"], [9, 3, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[9, 3, 1, "", "container"], [9, 3, 1, "", "network"], [9, 3, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[9, 5, 1, "", "collect_additional_outputs"], [9, 5, 1, "", "generated_output_names"], [9, 3, 1, "", "return_code"], [9, 3, 1, "", "stderr"], [9, 3, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[9, 3, 1, "", "args"], [9, 5, 1, "", "check_metadata"], [9, 3, 1, "", "executable"], [9, 5, 1, "", "retrieve_values"]], "pydra.engine.specs.SingularitySpec": [[9, 3, 1, "", "container"]], "pydra.engine.specs.SpecInfo": [[9, 3, 1, "", "bases"], [9, 3, 1, "", "fields"], [9, 3, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[9, 3, 1, "", "post_run"], [9, 3, 1, "", "post_run_task"], [9, 3, 1, "", "pre_run"], [9, 3, 1, "", "pre_run_task"], [9, 5, 1, "", "reset"]], "pydra.engine.state": [[10, 2, 1, "", "State"]], "pydra.engine.state.State": [[10, 4, 1, "id0", "combiner"], [10, 5, 1, "", "combiner_validation"], [10, 4, 1, "", "current_combiner"], [10, 4, 1, "", "current_combiner_all"], [10, 4, 1, "", "current_splitter"], [10, 4, 1, "", "current_splitter_rpn"], [10, 3, 1, "", "final_combined_ind_mapping"], [10, 3, 1, "", "group_for_inputs"], [10, 3, 1, "", "group_for_inputs_final"], [10, 3, 1, "", "groups_stack_final"], [10, 4, 1, "id1", "inner_inputs"], [10, 3, 1, "", "inputs_ind"], [10, 3, 1, "", "name"], [10, 4, 1, "id2", "other_states"], [10, 5, 1, "", "prepare_inputs"], [10, 5, 1, "", "prepare_states"], [10, 5, 1, "", "prepare_states_combined_ind"], [10, 5, 1, "", "prepare_states_ind"], [10, 5, 1, "", "prepare_states_val"], [10, 4, 1, "", "prev_state_combiner"], [10, 4, 1, "", "prev_state_combiner_all"], [10, 4, 1, "", "prev_state_splitter"], [10, 4, 1, "", "prev_state_splitter_rpn"], [10, 4, 1, "", "prev_state_splitter_rpn_compact"], [10, 5, 1, "", "set_input_groups"], [10, 5, 1, "", "splits"], [10, 4, 1, "id3", "splitter"], [10, 4, 1, "id4", "splitter_final"], [10, 4, 1, "id5", "splitter_rpn"], [10, 4, 1, "id6", "splitter_rpn_compact"], [10, 4, 1, "", "splitter_rpn_final"], [10, 5, 1, "", "splitter_validation"], [10, 3, 1, "", "states_ind"], [10, 3, 1, "", "states_val"], [10, 5, 1, "", "update_connections"]], "pydra.engine.submitter": [[11, 2, 1, "", "Submitter"], [11, 1, 1, "", "get_runnable_tasks"], [11, 1, 1, "", "is_runnable"], [11, 1, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[11, 5, 1, "", "close"], [11, 5, 1, "", "expand_runnable"], [11, 5, 1, "", "expand_workflow"], [11, 5, 1, "", "submit_from_call"]], "pydra.engine.task": [[12, 2, 1, "", "ContainerTask"], [12, 2, 1, "", "DockerTask"], [12, 2, 1, "", "FunctionTask"], [12, 2, 1, "", "ShellCommandTask"], [12, 2, 1, "", "SingularityTask"], [12, 1, 1, "", "split_cmd"]], "pydra.engine.task.ContainerTask": [[12, 5, 1, "", "bind_paths"], [12, 5, 1, "", "binds"], [12, 5, 1, "", "container_check"]], "pydra.engine.task.DockerTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.task.ShellCommandTask": [[12, 4, 1, "", "cmdline"], [12, 4, 1, "", "command_args"], [12, 3, 1, "", "input_spec"], [12, 3, 1, "", "output_spec"]], "pydra.engine.task.SingularityTask": [[12, 4, 1, "", "container_args"], [12, 3, 1, "", "init"]], "pydra.engine.workers": [[13, 2, 1, "", "ConcurrentFuturesWorker"], [13, 2, 1, "", "DaskWorker"], [13, 2, 1, "", "DistributedWorker"], [13, 2, 1, "", "SGEWorker"], [13, 2, 1, "", "SerialWorker"], [13, 2, 1, "", "SlurmWorker"], [13, 2, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_as_coro"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_dask"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[13, 5, 1, "", "fetch_finished"], [13, 3, 1, "", "max_jobs"]], "pydra.engine.workers.SGEWorker": [[13, 5, 1, "", "check_for_results_files"], [13, 5, 1, "", "get_output_by_task_pkl"], [13, 5, 1, "", "get_tasks_to_run"], [13, 5, 1, "", "run_el"], [13, 5, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "exec_serial"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[13, 5, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[13, 5, 1, "", "close"], [13, 5, 1, "", "fetch_finished"], [13, 5, 1, "", "run_el"]], "pydra.mark": [[15, 0, 0, "-", "functions"]], "pydra.mark.functions": [[15, 1, 1, "", "annotate"], [15, 1, 1, "", "task"]], "pydra.utils": [[18, 0, 0, "-", "messenger"], [19, 0, 0, "-", "profiler"]], "pydra.utils.messenger": [[18, 2, 1, "", "AuditFlag"], [18, 2, 1, "", "FileMessenger"], [18, 2, 1, "", "Messenger"], [18, 2, 1, "", "PrintMessenger"], [18, 2, 1, "", "RemoteRESTMessenger"], [18, 2, 1, "", "RuntimeHooks"], [18, 1, 1, "", "collect_messages"], [18, 1, 1, "", "gen_uuid"], [18, 1, 1, "", "make_message"], [18, 1, 1, "", "now"], [18, 1, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[18, 3, 1, "", "ALL"], [18, 3, 1, "", "NONE"], [18, 3, 1, "", "PROV"], [18, 3, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[18, 5, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[18, 3, 1, "", "resource_monitor_post_stop"], [18, 3, 1, "", "resource_monitor_pre_start"], [18, 3, 1, "", "task_execute_post_exit"], [18, 3, 1, "", "task_execute_pre_entry"], [18, 3, 1, "", "task_run_entry"], [18, 3, 1, "", "task_run_exit"]], "pydra.utils.profiler": [[19, 2, 1, "", "ResourceMonitor"], [19, 1, 1, "", "get_max_resources_used"], [19, 1, 1, "", "get_system_total_memory_gb"], [19, 1, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[19, 4, 1, "", "fname"], [19, 5, 1, "", "run"], [19, 5, 1, "", "stop"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:attribute", "4": "py:property", "5": "py:method", "6": "py:data", "7": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "method", "Python method"], "6": ["py", "data", "Python data"], "7": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 23], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 23], "packag": [1, 14, 16, 17], "submodul": [1, 14, 17], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19], "boutiqu": 3, "core": 4, "graph": 5, "helper": 6, "helpers_fil": 7, "copi": 7, "option": 7, "exist": 7, "file": 7, "new": [7, 24], "helpers_st": 8, "spec": [9, 24], "state": [10, 22, 26], "submitt": 11, "task": [12, 16, 21, 22], "note": [12, 20], "worker": 13, "mark": [14, 15], "function": [15, 22], "util": [17, 18, 19], "messeng": 18, "profil": 19, "releas": 20, "0": 20, "8": 20, "7": 20, "6": 20, "2": 20, "1": 20, "5": 20, "4": 20, "3": 20, "group": 21, "": [21, 22, 23], "output": [21, 25], "dataflow": [22, 23], "compon": 22, "workflow": 22, "shell": 22, "command": 22, "contain": 22, "welcom": 23, "A": 23, "simpl": 23, "scalabl": 23, "semant": 23, "document": 23, "content": 23, "indic": 23, "tabl": 23, "input": [24, 26], "specif": [24, 25], "ad": 24, "field": 24, "type": [24, 26], "metadata": [24, 25], "valid": 24, "nest": 26, "loop": 26, "over": 26, "splitter": 26, "scalar": 26, "outer": 26, "user": 27, "guid": 27}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [14, "submodules"], [17, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.graph module": [[5, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[6, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[7, "module-pydra.engine.helpers_file"]], "Copy options for existing files": [[7, null]], "Copy options for new files": [[7, null]], "pydra.engine.helpers_state module": [[8, "module-pydra.engine.helpers_state"]], "pydra.engine.specs module": [[9, "module-pydra.engine.specs"]], "pydra.engine.state module": [[10, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[11, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[12, "module-pydra.engine.task"]], "Notes:": [[12, null]], "pydra.engine.workers module": [[13, "module-pydra.engine.workers"]], "pydra.mark package": [[14, "module-pydra.mark"]], "pydra.mark.functions module": [[15, "module-pydra.mark.functions"]], "pydra.tasks package": [[16, "module-pydra.tasks"]], "pydra.utils package": [[17, "module-pydra.utils"]], "pydra.utils.messenger module": [[18, "module-pydra.utils.messenger"]], "pydra.utils.profiler module": [[19, "module-pydra.utils.profiler"]], "Release Notes": [[20, "release-notes"]], "0.8.0": [[20, "id1"]], "0.7.0": [[20, "id2"]], "0.6.2": [[20, "id3"]], "0.6.1": [[20, "id4"]], "0.6": [[20, "id5"]], "0.5": [[20, "id6"]], "0.4": [[20, "id7"]], "0.3.1": [[20, "id8"]], "0.3": [[20, "id9"]], "0.2.2": [[20, "id10"]], "0.2.1": [[20, "id11"]], "0.2": [[20, "id12"]], "0.1": [[20, "id13"]], "0.0.1": [[20, "id14"]], "Grouping Task\u2019s Output": [[21, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[22, "dataflows-components-task-and-workflow"]], "Function Tasks": [[22, "function-tasks"]], "Shell Command Tasks": [[22, "shell-command-tasks"]], "Container Tasks": [[22, "container-tasks"]], "Workflows": [[22, "workflows"]], "Task\u2019s State": [[22, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[23, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[23, null]], "Indices and tables": [[23, "indices-and-tables"]], "Input Specification": [[24, "input-specification"]], "Adding a New Field to the Spec": [[24, "adding-a-new-field-to-the-spec"]], "Types": [[24, "types"]], "Metadata": [[24, "metadata"], [25, "metadata"]], "Validators": [[24, "validators"]], "Output Specification": [[25, "output-specification"]], "State and Nested Loops over Input": [[26, "state-and-nested-loops-over-input"]], "Types of Splitter": [[26, "types-of-splitter"]], "Scalar Splitter": [[26, "scalar-splitter"]], "Outer Splitter": [[26, "outer-splitter"]], "User Guide": [[27, "user-guide"]]}, "indexentries": {"check_latest_version() (in module pydra)": [[0, "pydra.check_latest_version"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.graph"], [6, "module-pydra.engine.helpers"], [7, "module-pydra.engine.helpers_file"], [8, "module-pydra.engine.helpers_state"], [9, "module-pydra.engine.specs"], [10, "module-pydra.engine.state"], [11, "module-pydra.engine.submitter"], [12, "module-pydra.engine.task"], [13, "module-pydra.engine.workers"], [14, "module-pydra.mark"], [15, "module-pydra.mark.functions"], [16, "module-pydra.tasks"], [17, "module-pydra.utils"], [18, "module-pydra.utils.messenger"], [19, "module-pydra.utils.profiler"]], "pydra": [[0, "module-pydra"]], "set_input_validator() (in module pydra)": [[0, "pydra.set_input_validator"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "dockertask (class in pydra.engine)": [[1, "pydra.engine.DockerTask"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "container_args (pydra.engine.dockertask property)": [[1, "pydra.engine.DockerTask.container_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "init (pydra.engine.dockertask attribute)": [[1, "pydra.engine.DockerTask.init"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "digraph (class in pydra.engine.graph)": [[5, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[5, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[5, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[5, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[6, "pydra.engine.helpers.PydraFileLock"]], "argstr_formatting() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.create_checksum"]], "custom_validator() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.custom_validator"]], "ensure_list() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.execute"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.get_open_loop"]], "hash_function() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_function"]], "hash_value() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.hash_value"]], "load_and_run() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.output_from_inputfields"]], "position_sort() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[6, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.save"]], "task_hash() (in module pydra.engine.helpers)": [[6, "pydra.engine.helpers.task_hash"]], "copyfile() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile"]], "copyfile_input() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfile_input"]], "copyfiles() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.copyfiles"]], "ensure_list() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.ensure_list"]], "fname_presuffix() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.fname_presuffix"]], "get_related_files() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.get_related_files"]], "hash_dir() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_dir"]], "hash_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.hash_file"]], "is_container() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_container"]], "is_existing_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_existing_file"]], "is_local_file() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.on_cifs"]], "pydra.engine.helpers_file": [[7, "module-pydra.engine.helpers_file"]], "related_filetype_sets (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.related_filetype_sets"]], "split_filename() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.split_filename"]], "template_update() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[7, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[8, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[8, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[8, "pydra.engine.helpers_state.splitter2rpn"]], "basespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.BaseSpec"]], "containerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ContainerSpec"]], "directory (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Directory"]], "dockerspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.DockerSpec"]], "file (class in pydra.engine.specs)": [[9, "pydra.engine.specs.File"]], "functionspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[9, "pydra.engine.specs.LazyField"]], "multiinputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputFile"]], "multiinputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiInputObj"]], "multioutputfile (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputFile"]], "multioutputobj (class in pydra.engine.specs)": [[9, "pydra.engine.specs.MultiOutputObj"]], "result (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[9, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.ShellSpec"]], "singularityspec (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SingularitySpec"]], "specinfo (class in pydra.engine.specs)": [[9, "pydra.engine.specs.SpecInfo"]], "taskhook (class in pydra.engine.specs)": [[9, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields"]], "attr_fields_dict() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.attr_fields_dict"]], "bases (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.bases"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[9, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container"]], "container (pydra.engine.specs.dockerspec attribute)": [[9, "pydra.engine.specs.DockerSpec.container"]], "container (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.container"]], "container (pydra.engine.specs.singularityspec attribute)": [[9, "pydra.engine.specs.SingularitySpec.container"]], "container_xargs (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.container_xargs"]], "converter() (pydra.engine.specs.multiinputobj class method)": [[9, "pydra.engine.specs.MultiInputObj.converter"]], "converter() (pydra.engine.specs.multioutputobj class method)": [[9, "pydra.engine.specs.MultiOutputObj.converter"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[9, "pydra.engine.specs.ShellSpec.executable"]], "fields (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[9, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[9, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyfield method)": [[9, "pydra.engine.specs.LazyField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[9, "pydra.engine.specs.BaseSpec.hash"]], "image (pydra.engine.specs.containerspec attribute)": [[9, "pydra.engine.specs.ContainerSpec.image"]], "name (pydra.engine.specs.specinfo attribute)": [[9, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[9, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[9, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[9, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[9, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[9, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[9, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[9, "pydra.engine.specs.Result.runtime"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[9, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[9, "pydra.engine.specs.BaseSpec.template_update"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[9, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[10, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[10, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[10, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[10, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[10, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[10, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[10, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[10, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[10, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[10, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[10, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[10, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[11, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[11, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[11, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[11, "pydra.engine.submitter.Submitter.submit_from_call"]], "containertask (class in pydra.engine.task)": [[12, "pydra.engine.task.ContainerTask"]], "dockertask (class in pydra.engine.task)": [[12, "pydra.engine.task.DockerTask"]], "functiontask (class in pydra.engine.task)": [[12, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[12, "pydra.engine.task.ShellCommandTask"]], "singularitytask (class in pydra.engine.task)": [[12, "pydra.engine.task.SingularityTask"]], "bind_paths() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.bind_paths"]], "binds() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.binds"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args (pydra.engine.task.shellcommandtask property)": [[12, "pydra.engine.task.ShellCommandTask.command_args"]], "container_args (pydra.engine.task.dockertask property)": [[12, "pydra.engine.task.DockerTask.container_args"]], "container_args (pydra.engine.task.singularitytask property)": [[12, "pydra.engine.task.SingularityTask.container_args"]], "container_check() (pydra.engine.task.containertask method)": [[12, "pydra.engine.task.ContainerTask.container_check"]], "init (pydra.engine.task.dockertask attribute)": [[12, "pydra.engine.task.DockerTask.init"]], "init (pydra.engine.task.singularitytask attribute)": [[12, "pydra.engine.task.SingularityTask.init"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[12, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[12, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[12, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.DistributedWorker"]], "sgeworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[13, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[13, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[13, "pydra.engine.workers.DistributedWorker.max_jobs"]], "pydra.engine.workers": [[13, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[13, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[13, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[13, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[13, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[13, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[13, "pydra.engine.workers.SGEWorker.submit_array_job"]], "pydra.mark": [[14, "module-pydra.mark"]], "annotate() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[15, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[15, "pydra.mark.functions.task"]], "pydra.tasks": [[16, "module-pydra.tasks"]], "pydra.utils": [[17, "module-pydra.utils"]], "all (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[18, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[18, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[18, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[18, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[18, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[18, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[18, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[18, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[18, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "resourcemonitor (class in pydra.utils.profiler)": [[19, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[19, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[19, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[19, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[19, "pydra.utils.profiler.ResourceMonitor.stop"]]}}) \ No newline at end of file diff --git a/effigies_input-spec-suggestions/state.html b/effigies_input-spec-suggestions/state.html new file mode 100644 index 0000000000..4f7376dd8e --- /dev/null +++ b/effigies_input-spec-suggestions/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/effigies_input-spec-suggestions/user_guide.html b/effigies_input-spec-suggestions/user_guide.html new file mode 100644 index 0000000000..c9a179fc1f --- /dev/null +++ b/effigies_input-spec-suggestions/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: effigies/input-spec-suggestions + + + +
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000000..65de2de184 --- /dev/null +++ b/genindex.html @@ -0,0 +1,1506 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000..428a84de6d --- /dev/null +++ b/index.html @@ -0,0 +1,243 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + +
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/input_spec.html b/input_spec.html new file mode 100644 index 0000000000..c6da42bff4 --- /dev/null +++ b/input_spec.html @@ -0,0 +1,307 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/.buildinfo b/master/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/master/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/master/.doctrees/api.doctree b/master/.doctrees/api.doctree new file mode 100644 index 0000000000..2f2996714e Binary files /dev/null and b/master/.doctrees/api.doctree differ diff --git a/master/.doctrees/api/pydra.engine.audit.doctree b/master/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..685d6f4793 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/master/.doctrees/api/pydra.engine.boutiques.doctree b/master/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..ab197a9b6a Binary files /dev/null and b/master/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/master/.doctrees/api/pydra.engine.core.doctree b/master/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..47c3456391 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.core.doctree differ diff --git a/master/.doctrees/api/pydra.engine.doctree b/master/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..75f66868c5 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.doctree differ diff --git a/master/.doctrees/api/pydra.engine.environments.doctree b/master/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..28731edf29 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/master/.doctrees/api/pydra.engine.graph.doctree b/master/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..fd47e0880a Binary files /dev/null and b/master/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/master/.doctrees/api/pydra.engine.helpers.doctree b/master/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..bcb50fb167 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/master/.doctrees/api/pydra.engine.helpers_file.doctree b/master/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..177b91e7c2 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/master/.doctrees/api/pydra.engine.helpers_state.doctree b/master/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..702d7a93e1 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/master/.doctrees/api/pydra.engine.run_pickled.doctree b/master/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..89aafb0625 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/master/.doctrees/api/pydra.engine.specs.doctree b/master/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..684e9f3782 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/master/.doctrees/api/pydra.engine.state.doctree b/master/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..a1bc41c346 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.state.doctree differ diff --git a/master/.doctrees/api/pydra.engine.submitter.doctree b/master/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..d70c0c666a Binary files /dev/null and b/master/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/master/.doctrees/api/pydra.engine.task.doctree b/master/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..15b6440ef9 Binary files /dev/null and b/master/.doctrees/api/pydra.engine.task.doctree differ diff --git a/master/.doctrees/api/pydra.engine.workers.doctree b/master/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..e5d6b2441c Binary files /dev/null and b/master/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/master/.doctrees/api/pydra.mark.doctree b/master/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..f6e98c24bc Binary files /dev/null and b/master/.doctrees/api/pydra.mark.doctree differ diff --git a/master/.doctrees/api/pydra.mark.functions.doctree b/master/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..2eca72d53e Binary files /dev/null and b/master/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/master/.doctrees/api/pydra.tasks.doctree b/master/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..a58ba63490 Binary files /dev/null and b/master/.doctrees/api/pydra.tasks.doctree differ diff --git a/master/.doctrees/api/pydra.utils.doctree b/master/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..b4e5b631fe Binary files /dev/null and b/master/.doctrees/api/pydra.utils.doctree differ diff --git a/master/.doctrees/api/pydra.utils.hash.doctree b/master/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..51f65f8310 Binary files /dev/null and b/master/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/master/.doctrees/api/pydra.utils.messenger.doctree b/master/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..e833288fd3 Binary files /dev/null and b/master/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/master/.doctrees/api/pydra.utils.misc.doctree b/master/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..f8bdd86ff1 Binary files /dev/null and b/master/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/master/.doctrees/api/pydra.utils.profiler.doctree b/master/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..ccd19d9da9 Binary files /dev/null and b/master/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/master/.doctrees/api/pydra.utils.typing.doctree b/master/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..84874fc742 Binary files /dev/null and b/master/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/master/.doctrees/changes.doctree b/master/.doctrees/changes.doctree new file mode 100644 index 0000000000..c53478cc25 Binary files /dev/null and b/master/.doctrees/changes.doctree differ diff --git a/master/.doctrees/combiner.doctree b/master/.doctrees/combiner.doctree new file mode 100644 index 0000000000..4180c151df Binary files /dev/null and b/master/.doctrees/combiner.doctree differ diff --git a/master/.doctrees/components.doctree b/master/.doctrees/components.doctree new file mode 100644 index 0000000000..9dfd4745ce Binary files /dev/null and b/master/.doctrees/components.doctree differ diff --git a/master/.doctrees/environment.pickle b/master/.doctrees/environment.pickle new file mode 100644 index 0000000000..d4a423ae9d Binary files /dev/null and b/master/.doctrees/environment.pickle differ diff --git a/master/.doctrees/index.doctree b/master/.doctrees/index.doctree new file mode 100644 index 0000000000..8b261377c2 Binary files /dev/null and b/master/.doctrees/index.doctree differ diff --git a/master/.doctrees/input_spec.doctree b/master/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..aecdcc4f1e Binary files /dev/null and b/master/.doctrees/input_spec.doctree differ diff --git a/master/.doctrees/output_spec.doctree b/master/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..eac8c8a612 Binary files /dev/null and b/master/.doctrees/output_spec.doctree differ diff --git a/master/.doctrees/state.doctree b/master/.doctrees/state.doctree new file mode 100644 index 0000000000..f9ecfb63dc Binary files /dev/null and b/master/.doctrees/state.doctree differ diff --git a/master/.doctrees/user_guide.doctree b/master/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..76778af78d Binary files /dev/null and b/master/.doctrees/user_guide.doctree differ diff --git a/master/.nojekyll b/master/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/master/_images/nd_spl_1.png b/master/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/master/_images/nd_spl_1.png differ diff --git a/master/_images/nd_spl_3.png b/master/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/master/_images/nd_spl_3.png differ diff --git a/master/_images/nd_spl_3_comb1.png b/master/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/master/_images/nd_spl_3_comb1.png differ diff --git a/master/_images/nd_spl_3_comb3.png b/master/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/master/_images/nd_spl_3_comb3.png differ diff --git a/master/_images/nd_spl_4.png b/master/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/master/_images/nd_spl_4.png differ diff --git a/master/_sources/api.rst.txt b/master/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/master/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/master/_sources/api/pydra.engine.audit.rst.txt b/master/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/master/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.boutiques.rst.txt b/master/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/master/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.core.rst.txt b/master/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/master/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.environments.rst.txt b/master/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/master/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.graph.rst.txt b/master/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/master/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.helpers.rst.txt b/master/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/master/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.helpers_file.rst.txt b/master/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/master/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.helpers_state.rst.txt b/master/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/master/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.rst.txt b/master/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/master/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/master/_sources/api/pydra.engine.run_pickled.rst.txt b/master/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/master/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.specs.rst.txt b/master/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/master/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.state.rst.txt b/master/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/master/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.submitter.rst.txt b/master/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/master/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.task.rst.txt b/master/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/master/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.engine.workers.rst.txt b/master/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/master/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.mark.functions.rst.txt b/master/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/master/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.mark.rst.txt b/master/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/master/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/master/_sources/api/pydra.tasks.rst.txt b/master/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/master/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.utils.hash.rst.txt b/master/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/master/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.utils.messenger.rst.txt b/master/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/master/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.utils.misc.rst.txt b/master/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/master/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.utils.profiler.rst.txt b/master/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/master/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/api/pydra.utils.rst.txt b/master/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/master/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/master/_sources/api/pydra.utils.typing.rst.txt b/master/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/master/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/master/_sources/changes.rst.txt b/master/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/master/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/master/_sources/combiner.rst.txt b/master/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/master/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/master/_sources/components.rst.txt b/master/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/master/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/master/_sources/index.rst.txt b/master/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/master/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/master/_sources/input_spec.rst.txt b/master/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/master/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/master/_sources/output_spec.rst.txt b/master/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/master/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/master/_sources/state.rst.txt b/master/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/master/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/master/_sources/user_guide.rst.txt b/master/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/master/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/master/_static/_sphinx_javascript_frameworks_compat.js b/master/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/master/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/master/_static/banner.css b/master/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/master/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/master/_static/basic.css b/master/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/master/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/master/_static/css/badge_only.css b/master/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/master/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/master/_static/css/fonts/Roboto-Slab-Bold.woff b/master/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/master/_static/css/fonts/Roboto-Slab-Bold.woff2 b/master/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/master/_static/css/fonts/Roboto-Slab-Regular.woff b/master/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/master/_static/css/fonts/Roboto-Slab-Regular.woff2 b/master/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/master/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/master/_static/css/fonts/fontawesome-webfont.eot b/master/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/master/_static/css/fonts/fontawesome-webfont.svg b/master/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/master/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/css/fonts/fontawesome-webfont.ttf b/master/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/master/_static/css/fonts/fontawesome-webfont.woff b/master/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/master/_static/css/fonts/fontawesome-webfont.woff2 b/master/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/master/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/master/_static/css/fonts/lato-bold-italic.woff b/master/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/master/_static/css/fonts/lato-bold-italic.woff differ diff --git a/master/_static/css/fonts/lato-bold-italic.woff2 b/master/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/master/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/master/_static/css/fonts/lato-bold.woff b/master/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/master/_static/css/fonts/lato-bold.woff differ diff --git a/master/_static/css/fonts/lato-bold.woff2 b/master/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/master/_static/css/fonts/lato-bold.woff2 differ diff --git a/master/_static/css/fonts/lato-normal-italic.woff b/master/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/master/_static/css/fonts/lato-normal-italic.woff differ diff --git a/master/_static/css/fonts/lato-normal-italic.woff2 b/master/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/master/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/master/_static/css/fonts/lato-normal.woff b/master/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/master/_static/css/fonts/lato-normal.woff differ diff --git a/master/_static/css/fonts/lato-normal.woff2 b/master/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/master/_static/css/fonts/lato-normal.woff2 differ diff --git a/master/_static/css/theme.css b/master/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/master/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/master/_static/doctools.js b/master/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/master/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/master/_static/documentation_options.js b/master/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/master/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/master/_static/file.png b/master/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/master/_static/file.png differ diff --git a/master/_static/jquery.js b/master/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/master/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/master/_static/js/html5shiv.min.js b/master/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/master/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/master/_static/js/theme.js b/master/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/master/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/master/_static/minus.png b/master/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/master/_static/minus.png differ diff --git a/master/_static/plus.png b/master/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/master/_static/plus.png differ diff --git a/master/_static/pygments.css b/master/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/master/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/master/_static/searchtools.js b/master/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/master/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/master/_static/sphinx_highlight.js b/master/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/master/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/master/api.html b/master/api.html new file mode 100644 index 0000000000..81e6ea1711 --- /dev/null +++ b/master/api.html @@ -0,0 +1,1013 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.audit.html b/master/api/pydra.engine.audit.html new file mode 100644 index 0000000000..ec14b3b8d8 --- /dev/null +++ b/master/api/pydra.engine.audit.html @@ -0,0 +1,241 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.boutiques.html b/master/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..412eb96cbe --- /dev/null +++ b/master/api/pydra.engine.boutiques.html @@ -0,0 +1,179 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.core.html b/master/api/pydra.engine.core.html new file mode 100644 index 0000000000..02bfdd5e2e --- /dev/null +++ b/master/api/pydra.engine.core.html @@ -0,0 +1,498 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.environments.html b/master/api/pydra.engine.environments.html new file mode 100644 index 0000000000..f9f7fb8278 --- /dev/null +++ b/master/api/pydra.engine.environments.html @@ -0,0 +1,303 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.graph.html b/master/api/pydra.engine.graph.html new file mode 100644 index 0000000000..3161734f81 --- /dev/null +++ b/master/api/pydra.engine.graph.html @@ -0,0 +1,348 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.helpers.html b/master/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..e54897500b --- /dev/null +++ b/master/api/pydra.engine.helpers.html @@ -0,0 +1,449 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.parse_format_string(fmtstr)
+

Parse a argstr format string and return all keywords used in it.

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.helpers_file.html b/master/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..afbd0f2c14 --- /dev/null +++ b/master/api/pydra.engine.helpers_file.html @@ -0,0 +1,312 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.helpers_state.html b/master/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..0a80b4227e --- /dev/null +++ b/master/api/pydra.engine.helpers_state.html @@ -0,0 +1,316 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.html b/master/api/pydra.engine.html new file mode 100644 index 0000000000..d49f257408 --- /dev/null +++ b/master/api/pydra.engine.html @@ -0,0 +1,426 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.run_pickled.html b/master/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..b0d85671d3 --- /dev/null +++ b/master/api/pydra.engine.run_pickled.html @@ -0,0 +1,177 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.specs.html b/master/api/pydra.engine.specs.html new file mode 100644 index 0000000000..e6b6e04c57 --- /dev/null +++ b/master/api/pydra.engine.specs.html @@ -0,0 +1,647 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.state.html b/master/api/pydra.engine.state.html new file mode 100644 index 0000000000..2e79709a02 --- /dev/null +++ b/master/api/pydra.engine.state.html @@ -0,0 +1,595 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.submitter.html b/master/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..6ed1e1f229 --- /dev/null +++ b/master/api/pydra.engine.submitter.html @@ -0,0 +1,261 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.task.html b/master/api/pydra.engine.task.html new file mode 100644 index 0000000000..b98015cd3e --- /dev/null +++ b/master/api/pydra.engine.task.html @@ -0,0 +1,303 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.engine.workers.html b/master/api/pydra.engine.workers.html new file mode 100644 index 0000000000..c5f56f7d69 --- /dev/null +++ b/master/api/pydra.engine.workers.html @@ -0,0 +1,511 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.mark.functions.html b/master/api/pydra.mark.functions.html new file mode 100644 index 0000000000..aac444834f --- /dev/null +++ b/master/api/pydra.mark.functions.html @@ -0,0 +1,197 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.mark.html b/master/api/pydra.mark.html new file mode 100644 index 0000000000..52c4e358fa --- /dev/null +++ b/master/api/pydra.mark.html @@ -0,0 +1,203 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.tasks.html b/master/api/pydra.tasks.html new file mode 100644 index 0000000000..c8acbaadb3 --- /dev/null +++ b/master/api/pydra.tasks.html @@ -0,0 +1,168 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.hash.html b/master/api/pydra.utils.hash.html new file mode 100644 index 0000000000..f115deeb8c --- /dev/null +++ b/master/api/pydra.utils.hash.html @@ -0,0 +1,268 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.html b/master/api/pydra.utils.html new file mode 100644 index 0000000000..b97b2db6a4 --- /dev/null +++ b/master/api/pydra.utils.html @@ -0,0 +1,179 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.messenger.html b/master/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..2b9df3c15a --- /dev/null +++ b/master/api/pydra.utils.messenger.html @@ -0,0 +1,372 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.misc.html b/master/api/pydra.utils.misc.html new file mode 100644 index 0000000000..c8a9ccf2a9 --- /dev/null +++ b/master/api/pydra.utils.misc.html @@ -0,0 +1,188 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.profiler.html b/master/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..249e7685c8 --- /dev/null +++ b/master/api/pydra.utils.profiler.html @@ -0,0 +1,244 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/api/pydra.utils.typing.html b/master/api/pydra.utils.typing.html new file mode 100644 index 0000000000..fc2b274ab9 --- /dev/null +++ b/master/api/pydra.utils.typing.html @@ -0,0 +1,459 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + +
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]] | None) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/changes.html b/master/changes.html new file mode 100644 index 0000000000..601fe2511e --- /dev/null +++ b/master/changes.html @@ -0,0 +1,322 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/combiner.html b/master/combiner.html new file mode 100644 index 0000000000..74896bdca4 --- /dev/null +++ b/master/combiner.html @@ -0,0 +1,204 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/components.html b/master/components.html new file mode 100644 index 0000000000..98afe4127f --- /dev/null +++ b/master/components.html @@ -0,0 +1,335 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/genindex.html b/master/genindex.html new file mode 100644 index 0000000000..10f0ad2847 --- /dev/null +++ b/master/genindex.html @@ -0,0 +1,1506 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 0000000000..ae46720bb2 --- /dev/null +++ b/master/index.html @@ -0,0 +1,243 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + +
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/input_spec.html b/master/input_spec.html new file mode 100644 index 0000000000..695e409144 --- /dev/null +++ b/master/input_spec.html @@ -0,0 +1,307 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/objects.inv b/master/objects.inv new file mode 100644 index 0000000000..fe7057680d Binary files /dev/null and b/master/objects.inv differ diff --git a/master/output_spec.html b/master/output_spec.html new file mode 100644 index 0000000000..56d05fdb07 --- /dev/null +++ b/master/output_spec.html @@ -0,0 +1,231 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/py-modindex.html b/master/py-modindex.html new file mode 100644 index 0000000000..6c93749deb --- /dev/null +++ b/master/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/search.html b/master/search.html new file mode 100644 index 0000000000..e8435874ba --- /dev/null +++ b/master/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/master/searchindex.js b/master/searchindex.js new file mode 100644 index 0000000000..c5234506a3 --- /dev/null +++ b/master/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "parse_format_str": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": [4, 7], "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "fmtstr": 7, "pars": [7, 8, 11, 13], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "parse_format_string"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "parse_format_string() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_format_string"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/master/state.html b/master/state.html new file mode 100644 index 0000000000..428f32c8c5 --- /dev/null +++ b/master/state.html @@ -0,0 +1,227 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/user_guide.html b/master/user_guide.html new file mode 100644 index 0000000000..c52d5c5bb4 --- /dev/null +++ b/master/user_guide.html @@ -0,0 +1,187 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mock-bytes-repr/.buildinfo b/mock-bytes-repr/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/mock-bytes-repr/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/mock-bytes-repr/.doctrees/api.doctree b/mock-bytes-repr/.doctrees/api.doctree new file mode 100644 index 0000000000..8732274cc7 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.audit.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..a48f5349ef Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.boutiques.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..f10a7dd154 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.core.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..d8b476a982 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.core.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..7d377cae59 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.environments.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..9663950094 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.graph.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..e27902ed5d Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.helpers.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..21aa3810f2 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_file.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..8302287157 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_state.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..68fe06690e Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.run_pickled.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..c4d4d98a01 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.specs.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..7a19fe4644 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.state.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..adfade204d Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.state.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.submitter.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..535e141195 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.task.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..d0c9485588 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.task.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.engine.workers.doctree b/mock-bytes-repr/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..2e974f6a27 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.mark.doctree b/mock-bytes-repr/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..4f7a9f8db5 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.mark.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.mark.functions.doctree b/mock-bytes-repr/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..d8505125e3 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.tasks.doctree b/mock-bytes-repr/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..60096382a6 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.tasks.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..a3c841d1f6 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.hash.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..a89a90d31d Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.messenger.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..1e74dc9787 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.misc.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..2c6de90f55 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.profiler.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..0145b70c8e Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/mock-bytes-repr/.doctrees/api/pydra.utils.typing.doctree b/mock-bytes-repr/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..aef920f9d3 Binary files /dev/null and b/mock-bytes-repr/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/mock-bytes-repr/.doctrees/changes.doctree b/mock-bytes-repr/.doctrees/changes.doctree new file mode 100644 index 0000000000..9076554bd7 Binary files /dev/null and b/mock-bytes-repr/.doctrees/changes.doctree differ diff --git a/mock-bytes-repr/.doctrees/combiner.doctree b/mock-bytes-repr/.doctrees/combiner.doctree new file mode 100644 index 0000000000..91ac94b756 Binary files /dev/null and b/mock-bytes-repr/.doctrees/combiner.doctree differ diff --git a/mock-bytes-repr/.doctrees/components.doctree b/mock-bytes-repr/.doctrees/components.doctree new file mode 100644 index 0000000000..4bfe0d3fe9 Binary files /dev/null and b/mock-bytes-repr/.doctrees/components.doctree differ diff --git a/mock-bytes-repr/.doctrees/environment.pickle b/mock-bytes-repr/.doctrees/environment.pickle new file mode 100644 index 0000000000..5b208a55e0 Binary files /dev/null and b/mock-bytes-repr/.doctrees/environment.pickle differ diff --git a/mock-bytes-repr/.doctrees/index.doctree b/mock-bytes-repr/.doctrees/index.doctree new file mode 100644 index 0000000000..0881d337b8 Binary files /dev/null and b/mock-bytes-repr/.doctrees/index.doctree differ diff --git a/mock-bytes-repr/.doctrees/input_spec.doctree b/mock-bytes-repr/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..b0fa3eeb83 Binary files /dev/null and b/mock-bytes-repr/.doctrees/input_spec.doctree differ diff --git a/mock-bytes-repr/.doctrees/output_spec.doctree b/mock-bytes-repr/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..8ad2644c72 Binary files /dev/null and b/mock-bytes-repr/.doctrees/output_spec.doctree differ diff --git a/mock-bytes-repr/.doctrees/state.doctree b/mock-bytes-repr/.doctrees/state.doctree new file mode 100644 index 0000000000..570924a55d Binary files /dev/null and b/mock-bytes-repr/.doctrees/state.doctree differ diff --git a/mock-bytes-repr/.doctrees/user_guide.doctree b/mock-bytes-repr/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..58b314173a Binary files /dev/null and b/mock-bytes-repr/.doctrees/user_guide.doctree differ diff --git a/mock-bytes-repr/.nojekyll b/mock-bytes-repr/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mock-bytes-repr/_images/nd_spl_1.png b/mock-bytes-repr/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/mock-bytes-repr/_images/nd_spl_1.png differ diff --git a/mock-bytes-repr/_images/nd_spl_3.png b/mock-bytes-repr/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/mock-bytes-repr/_images/nd_spl_3.png differ diff --git a/mock-bytes-repr/_images/nd_spl_3_comb1.png b/mock-bytes-repr/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/mock-bytes-repr/_images/nd_spl_3_comb1.png differ diff --git a/mock-bytes-repr/_images/nd_spl_3_comb3.png b/mock-bytes-repr/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/mock-bytes-repr/_images/nd_spl_3_comb3.png differ diff --git a/mock-bytes-repr/_images/nd_spl_4.png b/mock-bytes-repr/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/mock-bytes-repr/_images/nd_spl_4.png differ diff --git a/mock-bytes-repr/_sources/api.rst.txt b/mock-bytes-repr/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/mock-bytes-repr/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/mock-bytes-repr/_sources/api/pydra.engine.audit.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.boutiques.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.core.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.environments.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.graph.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.helpers.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.helpers_file.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.helpers_state.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/mock-bytes-repr/_sources/api/pydra.engine.run_pickled.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.specs.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.state.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.submitter.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.task.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.engine.workers.rst.txt b/mock-bytes-repr/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.mark.functions.rst.txt b/mock-bytes-repr/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.mark.rst.txt b/mock-bytes-repr/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/mock-bytes-repr/_sources/api/pydra.tasks.rst.txt b/mock-bytes-repr/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.utils.hash.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.utils.messenger.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.utils.misc.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.utils.profiler.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/api/pydra.utils.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/mock-bytes-repr/_sources/api/pydra.utils.typing.rst.txt b/mock-bytes-repr/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/mock-bytes-repr/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/mock-bytes-repr/_sources/changes.rst.txt b/mock-bytes-repr/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/mock-bytes-repr/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/mock-bytes-repr/_sources/combiner.rst.txt b/mock-bytes-repr/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/mock-bytes-repr/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/mock-bytes-repr/_sources/components.rst.txt b/mock-bytes-repr/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/mock-bytes-repr/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/mock-bytes-repr/_sources/index.rst.txt b/mock-bytes-repr/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/mock-bytes-repr/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/mock-bytes-repr/_sources/input_spec.rst.txt b/mock-bytes-repr/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/mock-bytes-repr/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/mock-bytes-repr/_sources/output_spec.rst.txt b/mock-bytes-repr/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/mock-bytes-repr/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/mock-bytes-repr/_sources/state.rst.txt b/mock-bytes-repr/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/mock-bytes-repr/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/mock-bytes-repr/_sources/user_guide.rst.txt b/mock-bytes-repr/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/mock-bytes-repr/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/mock-bytes-repr/_static/_sphinx_javascript_frameworks_compat.js b/mock-bytes-repr/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/mock-bytes-repr/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/mock-bytes-repr/_static/banner.css b/mock-bytes-repr/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/mock-bytes-repr/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/mock-bytes-repr/_static/basic.css b/mock-bytes-repr/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/mock-bytes-repr/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/mock-bytes-repr/_static/css/badge_only.css b/mock-bytes-repr/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/mock-bytes-repr/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.eot b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.svg b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.ttf b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff2 b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff b/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff2 b/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-bold.woff b/mock-bytes-repr/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-bold.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-bold.woff2 b/mock-bytes-repr/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-bold.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff b/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff2 b/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-normal.woff b/mock-bytes-repr/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-normal.woff differ diff --git a/mock-bytes-repr/_static/css/fonts/lato-normal.woff2 b/mock-bytes-repr/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/mock-bytes-repr/_static/css/fonts/lato-normal.woff2 differ diff --git a/mock-bytes-repr/_static/css/theme.css b/mock-bytes-repr/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/mock-bytes-repr/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/mock-bytes-repr/_static/doctools.js b/mock-bytes-repr/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/mock-bytes-repr/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/mock-bytes-repr/_static/documentation_options.js b/mock-bytes-repr/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/mock-bytes-repr/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/mock-bytes-repr/_static/file.png b/mock-bytes-repr/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/mock-bytes-repr/_static/file.png differ diff --git a/mock-bytes-repr/_static/jquery.js b/mock-bytes-repr/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/mock-bytes-repr/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mock-bytes-repr/_static/js/html5shiv.min.js b/mock-bytes-repr/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/mock-bytes-repr/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mock-bytes-repr/_static/js/theme.js b/mock-bytes-repr/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/mock-bytes-repr/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/mock-bytes-repr/_static/minus.png b/mock-bytes-repr/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/mock-bytes-repr/_static/minus.png differ diff --git a/mock-bytes-repr/_static/plus.png b/mock-bytes-repr/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/mock-bytes-repr/_static/plus.png differ diff --git a/mock-bytes-repr/_static/pygments.css b/mock-bytes-repr/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/mock-bytes-repr/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/mock-bytes-repr/_static/searchtools.js b/mock-bytes-repr/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/mock-bytes-repr/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/mock-bytes-repr/_static/sphinx_highlight.js b/mock-bytes-repr/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/mock-bytes-repr/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/mock-bytes-repr/api.html b/mock-bytes-repr/api.html new file mode 100644 index 0000000000..573be97213 --- /dev/null +++ b/mock-bytes-repr/api.html @@ -0,0 +1,1016 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.audit.html b/mock-bytes-repr/api/pydra.engine.audit.html new file mode 100644 index 0000000000..b54c34850c --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.audit.html @@ -0,0 +1,244 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.boutiques.html b/mock-bytes-repr/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..f4a658941e --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.boutiques.html @@ -0,0 +1,182 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.core.html b/mock-bytes-repr/api/pydra.engine.core.html new file mode 100644 index 0000000000..06b9649557 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.core.html @@ -0,0 +1,501 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.environments.html b/mock-bytes-repr/api/pydra.engine.environments.html new file mode 100644 index 0000000000..286f1ae940 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.environments.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.graph.html b/mock-bytes-repr/api/pydra.engine.graph.html new file mode 100644 index 0000000000..16f38e3f74 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.graph.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.helpers.html b/mock-bytes-repr/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..c6fa7c98bb --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.helpers.html @@ -0,0 +1,452 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.parse_format_string(fmtstr)
+

Parse a argstr format string and return all keywords used in it.

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.helpers_file.html b/mock-bytes-repr/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..1d72250fed --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.helpers_file.html @@ -0,0 +1,315 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.helpers_state.html b/mock-bytes-repr/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..19563eb5e3 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.helpers_state.html @@ -0,0 +1,319 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.html b/mock-bytes-repr/api/pydra.engine.html new file mode 100644 index 0000000000..4155fac0ec --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.html @@ -0,0 +1,429 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.run_pickled.html b/mock-bytes-repr/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..8f0e3e605b --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.run_pickled.html @@ -0,0 +1,180 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.specs.html b/mock-bytes-repr/api/pydra.engine.specs.html new file mode 100644 index 0000000000..b788c3e8c8 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.specs.html @@ -0,0 +1,650 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.state.html b/mock-bytes-repr/api/pydra.engine.state.html new file mode 100644 index 0000000000..bcc149e14a --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.state.html @@ -0,0 +1,598 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.submitter.html b/mock-bytes-repr/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..d6a85117ca --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.submitter.html @@ -0,0 +1,264 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.task.html b/mock-bytes-repr/api/pydra.engine.task.html new file mode 100644 index 0000000000..fbb880a9e6 --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.task.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.engine.workers.html b/mock-bytes-repr/api/pydra.engine.workers.html new file mode 100644 index 0000000000..bf1cb9ac1d --- /dev/null +++ b/mock-bytes-repr/api/pydra.engine.workers.html @@ -0,0 +1,514 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.mark.functions.html b/mock-bytes-repr/api/pydra.mark.functions.html new file mode 100644 index 0000000000..418280b359 --- /dev/null +++ b/mock-bytes-repr/api/pydra.mark.functions.html @@ -0,0 +1,200 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.mark.html b/mock-bytes-repr/api/pydra.mark.html new file mode 100644 index 0000000000..02e0d76a8b --- /dev/null +++ b/mock-bytes-repr/api/pydra.mark.html @@ -0,0 +1,206 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.tasks.html b/mock-bytes-repr/api/pydra.tasks.html new file mode 100644 index 0000000000..998334c922 --- /dev/null +++ b/mock-bytes-repr/api/pydra.tasks.html @@ -0,0 +1,171 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.hash.html b/mock-bytes-repr/api/pydra.utils.hash.html new file mode 100644 index 0000000000..ee6740c239 --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.hash.html @@ -0,0 +1,271 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.html b/mock-bytes-repr/api/pydra.utils.html new file mode 100644 index 0000000000..c8f2482d9a --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.messenger.html b/mock-bytes-repr/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..ca48030f81 --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.messenger.html @@ -0,0 +1,375 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.misc.html b/mock-bytes-repr/api/pydra.utils.misc.html new file mode 100644 index 0000000000..48823adecf --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.misc.html @@ -0,0 +1,191 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.profiler.html b/mock-bytes-repr/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..3a47efaa1d --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.profiler.html @@ -0,0 +1,247 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/api/pydra.utils.typing.html b/mock-bytes-repr/api/pydra.utils.typing.html new file mode 100644 index 0000000000..857bbd778f --- /dev/null +++ b/mock-bytes-repr/api/pydra.utils.typing.html @@ -0,0 +1,462 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]] | None) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/changes.html b/mock-bytes-repr/changes.html new file mode 100644 index 0000000000..47247f66ed --- /dev/null +++ b/mock-bytes-repr/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/combiner.html b/mock-bytes-repr/combiner.html new file mode 100644 index 0000000000..296dc9b946 --- /dev/null +++ b/mock-bytes-repr/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/components.html b/mock-bytes-repr/components.html new file mode 100644 index 0000000000..e3ac04bd9c --- /dev/null +++ b/mock-bytes-repr/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/genindex.html b/mock-bytes-repr/genindex.html new file mode 100644 index 0000000000..43c316e6e5 --- /dev/null +++ b/mock-bytes-repr/genindex.html @@ -0,0 +1,1506 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/index.html b/mock-bytes-repr/index.html new file mode 100644 index 0000000000..5746bcd4f7 --- /dev/null +++ b/mock-bytes-repr/index.html @@ -0,0 +1,246 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/input_spec.html b/mock-bytes-repr/input_spec.html new file mode 100644 index 0000000000..7ab6d5ca73 --- /dev/null +++ b/mock-bytes-repr/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/objects.inv b/mock-bytes-repr/objects.inv new file mode 100644 index 0000000000..fe7057680d Binary files /dev/null and b/mock-bytes-repr/objects.inv differ diff --git a/mock-bytes-repr/output_spec.html b/mock-bytes-repr/output_spec.html new file mode 100644 index 0000000000..d531cc79c8 --- /dev/null +++ b/mock-bytes-repr/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/py-modindex.html b/mock-bytes-repr/py-modindex.html new file mode 100644 index 0000000000..b0edfe7ba7 --- /dev/null +++ b/mock-bytes-repr/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/search.html b/mock-bytes-repr/search.html new file mode 100644 index 0000000000..199037c0aa --- /dev/null +++ b/mock-bytes-repr/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/mock-bytes-repr/searchindex.js b/mock-bytes-repr/searchindex.js new file mode 100644 index 0000000000..c5234506a3 --- /dev/null +++ b/mock-bytes-repr/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "parse_format_str": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": [4, 7], "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "fmtstr": 7, "pars": [7, 8, 11, 13], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "parse_format_string"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "parse_format_string() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_format_string"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/mock-bytes-repr/state.html b/mock-bytes-repr/state.html new file mode 100644 index 0000000000..0e57d87469 --- /dev/null +++ b/mock-bytes-repr/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/mock-bytes-repr/user_guide.html b/mock-bytes-repr/user_guide.html new file mode 100644 index 0000000000..b3742f4e6e --- /dev/null +++ b/mock-bytes-repr/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: mock-bytes-repr + + + +
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000..fe7057680d Binary files /dev/null and b/objects.inv differ diff --git a/output_spec.html b/output_spec.html new file mode 100644 index 0000000000..6e206f30f1 --- /dev/null +++ b/output_spec.html @@ -0,0 +1,231 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/.buildinfo b/pre-commit-ci-update-config/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/pre-commit-ci-update-config/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/pre-commit-ci-update-config/.doctrees/api.doctree b/pre-commit-ci-update-config/.doctrees/api.doctree new file mode 100644 index 0000000000..9b576546ff Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.audit.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..7a11e65bbc Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.boutiques.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..090dcc2c60 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.core.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..5a285ac0ba Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.core.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..f83021cf2e Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.environments.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..e8ce521063 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.graph.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..823591451f Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..edfaae2324 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_file.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..0da92d33e0 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_state.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..570f7eaa6d Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.run_pickled.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..a4c37efdb7 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.specs.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..7b3f4f343e Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.state.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..714578bf1e Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.state.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.submitter.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..81f704d341 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.task.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..beee805e7a Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.task.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.engine.workers.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..02eabe68d1 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.mark.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..0cd699607b Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.mark.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.mark.functions.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..af0df3f09a Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.tasks.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..d17b545dd6 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.tasks.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..da83be9761 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.hash.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..555b728d99 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.messenger.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..ec738fe44a Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.misc.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..bc0eceecbb Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.profiler.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..32c00e9512 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/api/pydra.utils.typing.doctree b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..70f1125a7d Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/changes.doctree b/pre-commit-ci-update-config/.doctrees/changes.doctree new file mode 100644 index 0000000000..4eac8bb909 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/changes.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/combiner.doctree b/pre-commit-ci-update-config/.doctrees/combiner.doctree new file mode 100644 index 0000000000..9a128a5720 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/combiner.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/components.doctree b/pre-commit-ci-update-config/.doctrees/components.doctree new file mode 100644 index 0000000000..3ae09871db Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/components.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/environment.pickle b/pre-commit-ci-update-config/.doctrees/environment.pickle new file mode 100644 index 0000000000..226efee4ac Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/environment.pickle differ diff --git a/pre-commit-ci-update-config/.doctrees/index.doctree b/pre-commit-ci-update-config/.doctrees/index.doctree new file mode 100644 index 0000000000..8d43c69f70 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/index.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/input_spec.doctree b/pre-commit-ci-update-config/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..21cb41b043 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/input_spec.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/output_spec.doctree b/pre-commit-ci-update-config/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..f8bbe8ad90 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/output_spec.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/state.doctree b/pre-commit-ci-update-config/.doctrees/state.doctree new file mode 100644 index 0000000000..610e897231 Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/state.doctree differ diff --git a/pre-commit-ci-update-config/.doctrees/user_guide.doctree b/pre-commit-ci-update-config/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..9c6d2b025b Binary files /dev/null and b/pre-commit-ci-update-config/.doctrees/user_guide.doctree differ diff --git a/pre-commit-ci-update-config/.nojekyll b/pre-commit-ci-update-config/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pre-commit-ci-update-config/_images/nd_spl_1.png b/pre-commit-ci-update-config/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/pre-commit-ci-update-config/_images/nd_spl_1.png differ diff --git a/pre-commit-ci-update-config/_images/nd_spl_3.png b/pre-commit-ci-update-config/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/pre-commit-ci-update-config/_images/nd_spl_3.png differ diff --git a/pre-commit-ci-update-config/_images/nd_spl_3_comb1.png b/pre-commit-ci-update-config/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/pre-commit-ci-update-config/_images/nd_spl_3_comb1.png differ diff --git a/pre-commit-ci-update-config/_images/nd_spl_3_comb3.png b/pre-commit-ci-update-config/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/pre-commit-ci-update-config/_images/nd_spl_3_comb3.png differ diff --git a/pre-commit-ci-update-config/_images/nd_spl_4.png b/pre-commit-ci-update-config/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/pre-commit-ci-update-config/_images/nd_spl_4.png differ diff --git a/pre-commit-ci-update-config/_sources/api.rst.txt b/pre-commit-ci-update-config/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.audit.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.boutiques.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.core.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.environments.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.graph.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_file.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_state.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.run_pickled.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.specs.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.state.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.submitter.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.task.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.engine.workers.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.mark.functions.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.mark.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/pre-commit-ci-update-config/_sources/api/pydra.tasks.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.hash.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.messenger.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.misc.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.profiler.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/pre-commit-ci-update-config/_sources/api/pydra.utils.typing.rst.txt b/pre-commit-ci-update-config/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/pre-commit-ci-update-config/_sources/changes.rst.txt b/pre-commit-ci-update-config/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/pre-commit-ci-update-config/_sources/combiner.rst.txt b/pre-commit-ci-update-config/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/pre-commit-ci-update-config/_sources/components.rst.txt b/pre-commit-ci-update-config/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/pre-commit-ci-update-config/_sources/index.rst.txt b/pre-commit-ci-update-config/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/pre-commit-ci-update-config/_sources/input_spec.rst.txt b/pre-commit-ci-update-config/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/pre-commit-ci-update-config/_sources/output_spec.rst.txt b/pre-commit-ci-update-config/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/pre-commit-ci-update-config/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/pre-commit-ci-update-config/_sources/state.rst.txt b/pre-commit-ci-update-config/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/pre-commit-ci-update-config/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/pre-commit-ci-update-config/_sources/user_guide.rst.txt b/pre-commit-ci-update-config/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/pre-commit-ci-update-config/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/pre-commit-ci-update-config/_static/_sphinx_javascript_frameworks_compat.js b/pre-commit-ci-update-config/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/pre-commit-ci-update-config/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/pre-commit-ci-update-config/_static/banner.css b/pre-commit-ci-update-config/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/pre-commit-ci-update-config/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/pre-commit-ci-update-config/_static/basic.css b/pre-commit-ci-update-config/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/pre-commit-ci-update-config/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/css/badge_only.css b/pre-commit-ci-update-config/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/pre-commit-ci-update-config/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff2 b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff2 b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.eot b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.svg b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.ttf b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff2 b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff b/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff2 b/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff b/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff2 b/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-bold.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff b/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff2 b/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff b/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff differ diff --git a/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff2 b/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/pre-commit-ci-update-config/_static/css/fonts/lato-normal.woff2 differ diff --git a/pre-commit-ci-update-config/_static/css/theme.css b/pre-commit-ci-update-config/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/pre-commit-ci-update-config/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/doctools.js b/pre-commit-ci-update-config/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/pre-commit-ci-update-config/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/pre-commit-ci-update-config/_static/documentation_options.js b/pre-commit-ci-update-config/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/pre-commit-ci-update-config/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/file.png b/pre-commit-ci-update-config/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/pre-commit-ci-update-config/_static/file.png differ diff --git a/pre-commit-ci-update-config/_static/jquery.js b/pre-commit-ci-update-config/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/pre-commit-ci-update-config/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/js/html5shiv.min.js b/pre-commit-ci-update-config/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/pre-commit-ci-update-config/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/js/theme.js b/pre-commit-ci-update-config/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/pre-commit-ci-update-config/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/pre-commit-ci-update-config/_static/minus.png b/pre-commit-ci-update-config/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/pre-commit-ci-update-config/_static/minus.png differ diff --git a/pre-commit-ci-update-config/_static/plus.png b/pre-commit-ci-update-config/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/pre-commit-ci-update-config/_static/plus.png differ diff --git a/pre-commit-ci-update-config/_static/pygments.css b/pre-commit-ci-update-config/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/pre-commit-ci-update-config/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/pre-commit-ci-update-config/_static/searchtools.js b/pre-commit-ci-update-config/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/pre-commit-ci-update-config/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/pre-commit-ci-update-config/_static/sphinx_highlight.js b/pre-commit-ci-update-config/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/pre-commit-ci-update-config/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/pre-commit-ci-update-config/api.html b/pre-commit-ci-update-config/api.html new file mode 100644 index 0000000000..047f5b222d --- /dev/null +++ b/pre-commit-ci-update-config/api.html @@ -0,0 +1,1016 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.audit.html b/pre-commit-ci-update-config/api/pydra.engine.audit.html new file mode 100644 index 0000000000..61c868d774 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.audit.html @@ -0,0 +1,244 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.boutiques.html b/pre-commit-ci-update-config/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..0a99a02282 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.boutiques.html @@ -0,0 +1,182 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.core.html b/pre-commit-ci-update-config/api/pydra.engine.core.html new file mode 100644 index 0000000000..740e6eb135 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.core.html @@ -0,0 +1,501 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.environments.html b/pre-commit-ci-update-config/api/pydra.engine.environments.html new file mode 100644 index 0000000000..a6f7690041 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.environments.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.graph.html b/pre-commit-ci-update-config/api/pydra.engine.graph.html new file mode 100644 index 0000000000..17a2b7a4cc --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.graph.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.helpers.html b/pre-commit-ci-update-config/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..32f02f3958 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.helpers.html @@ -0,0 +1,452 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.parse_format_string(fmtstr)
+

Parse a argstr format string and return all keywords used in it.

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.helpers_file.html b/pre-commit-ci-update-config/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..17d6b0221a --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.helpers_file.html @@ -0,0 +1,315 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.helpers_state.html b/pre-commit-ci-update-config/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..f246552d3d --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.helpers_state.html @@ -0,0 +1,319 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.html b/pre-commit-ci-update-config/api/pydra.engine.html new file mode 100644 index 0000000000..563a69c59e --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.html @@ -0,0 +1,429 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.run_pickled.html b/pre-commit-ci-update-config/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..afaa8a0330 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.run_pickled.html @@ -0,0 +1,180 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.specs.html b/pre-commit-ci-update-config/api/pydra.engine.specs.html new file mode 100644 index 0000000000..bbf4ab69be --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.specs.html @@ -0,0 +1,650 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.state.html b/pre-commit-ci-update-config/api/pydra.engine.state.html new file mode 100644 index 0000000000..1fc59a456d --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.state.html @@ -0,0 +1,598 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.submitter.html b/pre-commit-ci-update-config/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..f2ec07ae7a --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.submitter.html @@ -0,0 +1,264 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.task.html b/pre-commit-ci-update-config/api/pydra.engine.task.html new file mode 100644 index 0000000000..82ccc9f6fa --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.task.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.engine.workers.html b/pre-commit-ci-update-config/api/pydra.engine.workers.html new file mode 100644 index 0000000000..9612c6d3e1 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.engine.workers.html @@ -0,0 +1,514 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.mark.functions.html b/pre-commit-ci-update-config/api/pydra.mark.functions.html new file mode 100644 index 0000000000..5413c03e33 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.mark.functions.html @@ -0,0 +1,200 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.mark.html b/pre-commit-ci-update-config/api/pydra.mark.html new file mode 100644 index 0000000000..21a4287c9b --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.mark.html @@ -0,0 +1,206 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.tasks.html b/pre-commit-ci-update-config/api/pydra.tasks.html new file mode 100644 index 0000000000..e66b05a14c --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.tasks.html @@ -0,0 +1,171 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.hash.html b/pre-commit-ci-update-config/api/pydra.utils.hash.html new file mode 100644 index 0000000000..da62a2f0c0 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.hash.html @@ -0,0 +1,271 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.html b/pre-commit-ci-update-config/api/pydra.utils.html new file mode 100644 index 0000000000..4c3b484e89 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.messenger.html b/pre-commit-ci-update-config/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..adbed9ef31 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.messenger.html @@ -0,0 +1,375 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.misc.html b/pre-commit-ci-update-config/api/pydra.utils.misc.html new file mode 100644 index 0000000000..85bfb9fae0 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.misc.html @@ -0,0 +1,191 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.profiler.html b/pre-commit-ci-update-config/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..4b3967f4c8 --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.profiler.html @@ -0,0 +1,247 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/api/pydra.utils.typing.html b/pre-commit-ci-update-config/api/pydra.utils.typing.html new file mode 100644 index 0000000000..4f5759f8ff --- /dev/null +++ b/pre-commit-ci-update-config/api/pydra.utils.typing.html @@ -0,0 +1,462 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '')
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: object | type, target: type | Any)
+

Checks whether the source object or type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object or type) – source object or type to be coerced

  • +
  • target (type or ty.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]] | None) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/changes.html b/pre-commit-ci-update-config/changes.html new file mode 100644 index 0000000000..96b5dbed1f --- /dev/null +++ b/pre-commit-ci-update-config/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/combiner.html b/pre-commit-ci-update-config/combiner.html new file mode 100644 index 0000000000..1d4eda212d --- /dev/null +++ b/pre-commit-ci-update-config/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/components.html b/pre-commit-ci-update-config/components.html new file mode 100644 index 0000000000..4fc363faa4 --- /dev/null +++ b/pre-commit-ci-update-config/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/genindex.html b/pre-commit-ci-update-config/genindex.html new file mode 100644 index 0000000000..52422e3235 --- /dev/null +++ b/pre-commit-ci-update-config/genindex.html @@ -0,0 +1,1506 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/index.html b/pre-commit-ci-update-config/index.html new file mode 100644 index 0000000000..78d2628733 --- /dev/null +++ b/pre-commit-ci-update-config/index.html @@ -0,0 +1,246 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/input_spec.html b/pre-commit-ci-update-config/input_spec.html new file mode 100644 index 0000000000..07071e21dd --- /dev/null +++ b/pre-commit-ci-update-config/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/objects.inv b/pre-commit-ci-update-config/objects.inv new file mode 100644 index 0000000000..fe7057680d Binary files /dev/null and b/pre-commit-ci-update-config/objects.inv differ diff --git a/pre-commit-ci-update-config/output_spec.html b/pre-commit-ci-update-config/output_spec.html new file mode 100644 index 0000000000..22b1fd304b --- /dev/null +++ b/pre-commit-ci-update-config/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/py-modindex.html b/pre-commit-ci-update-config/py-modindex.html new file mode 100644 index 0000000000..49777e3a82 --- /dev/null +++ b/pre-commit-ci-update-config/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/search.html b/pre-commit-ci-update-config/search.html new file mode 100644 index 0000000000..f6ba4c1035 --- /dev/null +++ b/pre-commit-ci-update-config/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/searchindex.js b/pre-commit-ci-update-config/searchindex.js new file mode 100644 index 0000000000..c5234506a3 --- /dev/null +++ b/pre-commit-ci-update-config/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "parse_format_str": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": [4, 7], "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "fmtstr": 7, "pars": [7, 8, 11, 13], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "parse_format_string"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "parse_format_string() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_format_string"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/pre-commit-ci-update-config/state.html b/pre-commit-ci-update-config/state.html new file mode 100644 index 0000000000..58c2e9398d --- /dev/null +++ b/pre-commit-ci-update-config/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/pre-commit-ci-update-config/user_guide.html b/pre-commit-ci-update-config/user_guide.html new file mode 100644 index 0000000000..a6eaee990b --- /dev/null +++ b/pre-commit-ci-update-config/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: pre-commit-ci-update-config + + + +
+ + + + \ No newline at end of file diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 0000000000..9a0350f813 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000000..ef322da8ad --- /dev/null +++ b/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000000..c5234506a3 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "parse_format_str": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": [4, 7], "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "fmtstr": 7, "pars": [7, 8, 11, 13], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "necessarili": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "parse_format_string"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "parse_format_string() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_format_string"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/state.html b/state.html new file mode 100644 index 0000000000..dfc7280f50 --- /dev/null +++ b/state.html @@ -0,0 +1,227 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/typing-bugfixes/.buildinfo b/typing-bugfixes/.buildinfo new file mode 100644 index 0000000000..ce6375ce98 --- /dev/null +++ b/typing-bugfixes/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 542912f80ce34c063298eb7c8e368ec9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/typing-bugfixes/.doctrees/api.doctree b/typing-bugfixes/.doctrees/api.doctree new file mode 100644 index 0000000000..c3dae9e7bf Binary files /dev/null and b/typing-bugfixes/.doctrees/api.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.audit.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.audit.doctree new file mode 100644 index 0000000000..7f5986c2f2 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.audit.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.boutiques.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.boutiques.doctree new file mode 100644 index 0000000000..49c79be2b9 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.boutiques.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.core.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.core.doctree new file mode 100644 index 0000000000..2b3dedd6ac Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.core.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.doctree new file mode 100644 index 0000000000..6db155a93c Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.environments.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.environments.doctree new file mode 100644 index 0000000000..e31d4c3af5 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.environments.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.graph.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.graph.doctree new file mode 100644 index 0000000000..4df7d05f70 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.graph.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.helpers.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.helpers.doctree new file mode 100644 index 0000000000..380dffedb8 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.helpers.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.helpers_file.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.helpers_file.doctree new file mode 100644 index 0000000000..c7acc396b6 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.helpers_file.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.helpers_state.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.helpers_state.doctree new file mode 100644 index 0000000000..863f84baee Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.helpers_state.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.run_pickled.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.run_pickled.doctree new file mode 100644 index 0000000000..41601b1c59 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.run_pickled.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.specs.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.specs.doctree new file mode 100644 index 0000000000..c61ec156a0 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.specs.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.state.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.state.doctree new file mode 100644 index 0000000000..341fa15e9e Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.state.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.submitter.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.submitter.doctree new file mode 100644 index 0000000000..81c4745359 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.submitter.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.task.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.task.doctree new file mode 100644 index 0000000000..60a099c267 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.task.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.engine.workers.doctree b/typing-bugfixes/.doctrees/api/pydra.engine.workers.doctree new file mode 100644 index 0000000000..0e81e9c04d Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.engine.workers.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.mark.doctree b/typing-bugfixes/.doctrees/api/pydra.mark.doctree new file mode 100644 index 0000000000..a8ec378404 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.mark.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.mark.functions.doctree b/typing-bugfixes/.doctrees/api/pydra.mark.functions.doctree new file mode 100644 index 0000000000..411d1fa091 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.mark.functions.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.tasks.doctree b/typing-bugfixes/.doctrees/api/pydra.tasks.doctree new file mode 100644 index 0000000000..f4600c750a Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.tasks.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.doctree new file mode 100644 index 0000000000..576b22057d Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.hash.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.hash.doctree new file mode 100644 index 0000000000..ec6b6b678d Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.hash.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.messenger.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.messenger.doctree new file mode 100644 index 0000000000..229263f995 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.messenger.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.misc.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.misc.doctree new file mode 100644 index 0000000000..a69b5d8fa1 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.misc.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.profiler.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.profiler.doctree new file mode 100644 index 0000000000..d4d6c07324 Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.profiler.doctree differ diff --git a/typing-bugfixes/.doctrees/api/pydra.utils.typing.doctree b/typing-bugfixes/.doctrees/api/pydra.utils.typing.doctree new file mode 100644 index 0000000000..76e6cc1bfa Binary files /dev/null and b/typing-bugfixes/.doctrees/api/pydra.utils.typing.doctree differ diff --git a/typing-bugfixes/.doctrees/changes.doctree b/typing-bugfixes/.doctrees/changes.doctree new file mode 100644 index 0000000000..74ff9da711 Binary files /dev/null and b/typing-bugfixes/.doctrees/changes.doctree differ diff --git a/typing-bugfixes/.doctrees/combiner.doctree b/typing-bugfixes/.doctrees/combiner.doctree new file mode 100644 index 0000000000..0b09d39b24 Binary files /dev/null and b/typing-bugfixes/.doctrees/combiner.doctree differ diff --git a/typing-bugfixes/.doctrees/components.doctree b/typing-bugfixes/.doctrees/components.doctree new file mode 100644 index 0000000000..911ff94549 Binary files /dev/null and b/typing-bugfixes/.doctrees/components.doctree differ diff --git a/typing-bugfixes/.doctrees/environment.pickle b/typing-bugfixes/.doctrees/environment.pickle new file mode 100644 index 0000000000..d194fa12c5 Binary files /dev/null and b/typing-bugfixes/.doctrees/environment.pickle differ diff --git a/typing-bugfixes/.doctrees/index.doctree b/typing-bugfixes/.doctrees/index.doctree new file mode 100644 index 0000000000..7f29dad510 Binary files /dev/null and b/typing-bugfixes/.doctrees/index.doctree differ diff --git a/typing-bugfixes/.doctrees/input_spec.doctree b/typing-bugfixes/.doctrees/input_spec.doctree new file mode 100644 index 0000000000..708725cea3 Binary files /dev/null and b/typing-bugfixes/.doctrees/input_spec.doctree differ diff --git a/typing-bugfixes/.doctrees/output_spec.doctree b/typing-bugfixes/.doctrees/output_spec.doctree new file mode 100644 index 0000000000..326fa557e9 Binary files /dev/null and b/typing-bugfixes/.doctrees/output_spec.doctree differ diff --git a/typing-bugfixes/.doctrees/state.doctree b/typing-bugfixes/.doctrees/state.doctree new file mode 100644 index 0000000000..adca180a37 Binary files /dev/null and b/typing-bugfixes/.doctrees/state.doctree differ diff --git a/typing-bugfixes/.doctrees/user_guide.doctree b/typing-bugfixes/.doctrees/user_guide.doctree new file mode 100644 index 0000000000..75c6a6e49e Binary files /dev/null and b/typing-bugfixes/.doctrees/user_guide.doctree differ diff --git a/typing-bugfixes/.nojekyll b/typing-bugfixes/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/typing-bugfixes/_images/nd_spl_1.png b/typing-bugfixes/_images/nd_spl_1.png new file mode 100644 index 0000000000..e4967901dc Binary files /dev/null and b/typing-bugfixes/_images/nd_spl_1.png differ diff --git a/typing-bugfixes/_images/nd_spl_3.png b/typing-bugfixes/_images/nd_spl_3.png new file mode 100644 index 0000000000..e4e95b4e72 Binary files /dev/null and b/typing-bugfixes/_images/nd_spl_3.png differ diff --git a/typing-bugfixes/_images/nd_spl_3_comb1.png b/typing-bugfixes/_images/nd_spl_3_comb1.png new file mode 100644 index 0000000000..dd19db24f9 Binary files /dev/null and b/typing-bugfixes/_images/nd_spl_3_comb1.png differ diff --git a/typing-bugfixes/_images/nd_spl_3_comb3.png b/typing-bugfixes/_images/nd_spl_3_comb3.png new file mode 100644 index 0000000000..b50fad23f5 Binary files /dev/null and b/typing-bugfixes/_images/nd_spl_3_comb3.png differ diff --git a/typing-bugfixes/_images/nd_spl_4.png b/typing-bugfixes/_images/nd_spl_4.png new file mode 100644 index 0000000000..e900bc3298 Binary files /dev/null and b/typing-bugfixes/_images/nd_spl_4.png differ diff --git a/typing-bugfixes/_sources/api.rst.txt b/typing-bugfixes/_sources/api.rst.txt new file mode 100644 index 0000000000..fe1e815677 --- /dev/null +++ b/typing-bugfixes/_sources/api.rst.txt @@ -0,0 +1,17 @@ +Library API (application programmer interface) +============================================== + +.. automodule:: pydra + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + api/pydra.engine + api/pydra.mark + api/pydra.tasks + api/pydra.utils diff --git a/typing-bugfixes/_sources/api/pydra.engine.audit.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.audit.rst.txt new file mode 100644 index 0000000000..6694df54d3 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.audit.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.audit module +========================= + +.. automodule:: pydra.engine.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.boutiques.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.boutiques.rst.txt new file mode 100644 index 0000000000..d7de9fe60c --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.boutiques.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.boutiques module +============================= + +.. automodule:: pydra.engine.boutiques + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.core.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.core.rst.txt new file mode 100644 index 0000000000..1681ed01e0 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.core.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.core module +======================== + +.. automodule:: pydra.engine.core + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.environments.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.environments.rst.txt new file mode 100644 index 0000000000..e3c46cbb7c --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.environments.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.environments module +================================ + +.. automodule:: pydra.engine.environments + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.graph.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.graph.rst.txt new file mode 100644 index 0000000000..a757bc9687 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.graph.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.graph module +========================= + +.. automodule:: pydra.engine.graph + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.helpers.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.helpers.rst.txt new file mode 100644 index 0000000000..809e146656 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.helpers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers module +=========================== + +.. automodule:: pydra.engine.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.helpers_file.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.helpers_file.rst.txt new file mode 100644 index 0000000000..57d2063d74 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.helpers_file.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_file module +================================= + +.. automodule:: pydra.engine.helpers_file + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.helpers_state.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.helpers_state.rst.txt new file mode 100644 index 0000000000..0e81db7bb1 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.helpers_state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.helpers\_state module +================================== + +.. automodule:: pydra.engine.helpers_state + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.rst.txt new file mode 100644 index 0000000000..1caeb8d589 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.rst.txt @@ -0,0 +1,28 @@ +pydra.engine package +==================== + +.. automodule:: pydra.engine + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.engine.audit + pydra.engine.boutiques + pydra.engine.core + pydra.engine.environments + pydra.engine.graph + pydra.engine.helpers + pydra.engine.helpers_file + pydra.engine.helpers_state + pydra.engine.run_pickled + pydra.engine.specs + pydra.engine.state + pydra.engine.submitter + pydra.engine.task + pydra.engine.workers diff --git a/typing-bugfixes/_sources/api/pydra.engine.run_pickled.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.run_pickled.rst.txt new file mode 100644 index 0000000000..bf38289e13 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.run_pickled.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.run\_pickled module +================================ + +.. automodule:: pydra.engine.run_pickled + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.specs.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.specs.rst.txt new file mode 100644 index 0000000000..900a5b2fe6 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.specs.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.specs module +========================= + +.. automodule:: pydra.engine.specs + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.state.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.state.rst.txt new file mode 100644 index 0000000000..678f574341 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.state.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.state module +========================= + +.. automodule:: pydra.engine.state + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.submitter.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.submitter.rst.txt new file mode 100644 index 0000000000..6f69b8507c --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.submitter.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.submitter module +============================= + +.. automodule:: pydra.engine.submitter + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.task.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.task.rst.txt new file mode 100644 index 0000000000..f515b2d45f --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.task.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.task module +======================== + +.. automodule:: pydra.engine.task + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.engine.workers.rst.txt b/typing-bugfixes/_sources/api/pydra.engine.workers.rst.txt new file mode 100644 index 0000000000..962579943e --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.engine.workers.rst.txt @@ -0,0 +1,7 @@ +pydra.engine.workers module +=========================== + +.. automodule:: pydra.engine.workers + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.mark.functions.rst.txt b/typing-bugfixes/_sources/api/pydra.mark.functions.rst.txt new file mode 100644 index 0000000000..e9497472b3 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.mark.functions.rst.txt @@ -0,0 +1,7 @@ +pydra.mark.functions module +=========================== + +.. automodule:: pydra.mark.functions + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.mark.rst.txt b/typing-bugfixes/_sources/api/pydra.mark.rst.txt new file mode 100644 index 0000000000..addd22afa0 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.mark.rst.txt @@ -0,0 +1,15 @@ +pydra.mark package +================== + +.. automodule:: pydra.mark + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.mark.functions diff --git a/typing-bugfixes/_sources/api/pydra.tasks.rst.txt b/typing-bugfixes/_sources/api/pydra.tasks.rst.txt new file mode 100644 index 0000000000..0fc7a9ca9e --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.tasks.rst.txt @@ -0,0 +1,7 @@ +pydra.tasks package +=================== + +.. automodule:: pydra.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.utils.hash.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.hash.rst.txt new file mode 100644 index 0000000000..d899a1c3e1 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.hash.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.hash module +======================= + +.. automodule:: pydra.utils.hash + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.utils.messenger.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.messenger.rst.txt new file mode 100644 index 0000000000..56101dd12e --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.messenger.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.messenger module +============================ + +.. automodule:: pydra.utils.messenger + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.utils.misc.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.misc.rst.txt new file mode 100644 index 0000000000..fac6fb4350 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.misc.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.misc module +======================= + +.. automodule:: pydra.utils.misc + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.utils.profiler.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.profiler.rst.txt new file mode 100644 index 0000000000..76cb8a4a25 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.profiler.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.profiler module +=========================== + +.. automodule:: pydra.utils.profiler + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/api/pydra.utils.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.rst.txt new file mode 100644 index 0000000000..cb1e5fcdb8 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.rst.txt @@ -0,0 +1,19 @@ +pydra.utils package +=================== + +.. automodule:: pydra.utils + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + pydra.utils.hash + pydra.utils.messenger + pydra.utils.misc + pydra.utils.profiler + pydra.utils.typing diff --git a/typing-bugfixes/_sources/api/pydra.utils.typing.rst.txt b/typing-bugfixes/_sources/api/pydra.utils.typing.rst.txt new file mode 100644 index 0000000000..238eaba076 --- /dev/null +++ b/typing-bugfixes/_sources/api/pydra.utils.typing.rst.txt @@ -0,0 +1,7 @@ +pydra.utils.typing module +========================= + +.. automodule:: pydra.utils.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/typing-bugfixes/_sources/changes.rst.txt b/typing-bugfixes/_sources/changes.rst.txt new file mode 100644 index 0000000000..4e23840e90 --- /dev/null +++ b/typing-bugfixes/_sources/changes.rst.txt @@ -0,0 +1,132 @@ +Release Notes +============= + +0.8.0 +----- + +* refactoring template formatting for ``input_spec`` +* fixing issues with input fields with extension (and using them in templates) +* adding simple validators to input spec (using ``attr.validator``) +* adding ``create_dotfile`` for workflows, that creates graphs as dotfiles (can convert to other formats if dot available) +* adding a simple user guide with ``input_spec`` description +* expanding docstrings for ``State``, ``audit`` and ``messenger`` +* updating syntax to newer python + +0.7.0 +----- + +* refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can't be run +* refactoring of the ``input_spec``: adapting better to the nipype interfaces +* switching from ``pkg_resources.declare_namespace`` to the stdlib ``pkgutil.extend_path`` +* moving ``readme`` to rst format + + +0.6.2 +----- + +* Use pkgutil to declare ``pydra.tasks`` as a namespace package, ensuring better support for + editable mode. + +0.6.1 +----- + +* Add ``pydra.tasks`` namespace package to enable separate packages of ``Task``\s to be + installed into ``pydra.tasks``. +* Raise error when task or workflow name conflicts with names of attributes, methods, or + other tasks already added to workflow +* Mention ``requirements.txt`` in README + +0.6 +--- + +* removing the tutorial to a `separate repo `__ +* adding windows tests to codecov +* accepting ``None`` as a valid output from a ``FunctionTask``, also for function that returns multiple values +* fixing slurm error files +* adding ``wf._connection`` to ``checksum`` +* allowing for updates of ``wf._connections`` +* editing output, so it works with ``numpy.arrays`` +* removing ``to_job`` and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory) +* adding standalone function ``load_and_run`` that can load and run a task from a pickle file +* removing ``create_pyscript`` and simplifying the slurm worker +* improving error reports in errors flies +* fixing ``make_class`` so the ``Output`` is properly formatted + +0.5 +--- + +* fixing ``hash_dir`` function +* adding ``get_available_cpus`` to get the number of CPUs available to the current process or available on the system +* adding simple implementation for ``BoshTask`` that uses boutiques descriptor +* adding azure to CI +* fixing code for windows +* etelementry updates +* adding more verbose output for task ``result`` - returns values or indices for input fields +* adding an experimental implementation of Dask Worker (limited testing with ci) + +0.4 +--- + +* reorganization of the ``State`` class, fixing small issues with the class +* fixing some paths issues on windows os +* adding osx and window sto the travis runs (right now allowing for failures for windows) +* adding ``PydraStateError`` for exception in the ``State`` class +* small fixes to the hashing functions, adding more tests +* adding ``hash_dir`` to calculate hash for ``Directory`` type + +0.3.1 +----- + +* passing ``wf.cache_locations`` to the task +* using ``rerun`` from submitter to all task +* adding ``test_rerun`` and ``propagate_rerun`` for workflows +* fixing task with a full combiner +* adding ``cont_dim`` to specify dimensionality of the input variables (how much the input is nested) + +0.3 +--- + +* adding sphinx documentation +* moving from ``dataclasses`` to ``attrs`` +* adding ``container`` flag to the ``ShellCommandTask`` +* fixing ``cmdline``, ``command_args`` and ``container_args`` for tasks with states +* adding ``CONTRIBUTING.md`` +* fixing hash calculations for inputs with a list of files +* using ``attr.NOTHING`` for input that is not set + +0.2.2 +----- + +* supporting tuple as a single element of an input + +0.2.1 +----- + +* fixing: nodes with states and input fields (from splitter) that are empty were failing + +0.2 +--- + +* big changes in ``ShellTask``, ``DockerTask`` and ``SingularityTask`` + * customized input specification and output specification for ``Task``\s + * adding singularity checks to Travis CI + * binding all input files to the container +* changes in ``Workflow`` + * passing all outputs to the next node: ``lzout.all_`` + * fixing inner splitter +* allowing for ``splitter`` and ``combiner`` updates +* adding ``etelementry`` support + +0.1 +--- + +* Core dataflow creation and management API +* Distributed workers: + * concurrent futures + * SLURM +* Notebooks for Pydra concepts + +0.0.1 +----- + +Initial Pydra Dataflow Engine release. diff --git a/typing-bugfixes/_sources/combiner.rst.txt b/typing-bugfixes/_sources/combiner.rst.txt new file mode 100644 index 0000000000..78875e1e55 --- /dev/null +++ b/typing-bugfixes/_sources/combiner.rst.txt @@ -0,0 +1,66 @@ +Grouping Task's Output +======================= + +In addition to the splitting the input, *Pydra* supports grouping +or combining the output resulting from the splits. +In order to achieve this for a *Task*, a user can specify a *combiner*. +This can be set by calling ``combine`` method. +Note, the *combiner* only makes sense when a *splitter* is +set first. When *combiner=x*, all values are combined together within one list, +and each element of the list represents an output of the *Task* for the specific +value of the input *x*. Splitting and combining for this example can be written +as follows: + +.. math:: + + S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ + C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)], + +where `S` represents the *splitter*, *C* represents the *combiner*, :math:`x` is the input field, +:math:`out(x_i)` represents the output of the *Task* for :math:`x_i`, and :math:`out_{comb}` +is the final output after applying the *combiner*. + +In the situation where input has multiple fields and an *outer splitter* is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of :math:`x_i` and +all the values of :math:`y`. +In this situation, the combined output would be a two dimensional list, each +inner list for each value of :math:`x`. This can be written as follow: + +.. math:: + + C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ + &\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ + && ~..., \\ + && ~[out(x_n, y_1), ..., out(x_n, y_m)]]. + + + + +.. figure:: images/nd_spl_3_comb1.png + :figclass: h! + :scale: 75% + + + +However, for the same task the user might want to combine +all values of :math:`x` for specific values of :math:`y`. +One may also need to combine all the values together. +This can be achieved by providing a list of fields, :math:`[x, y]` to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list: + +.. math:: + + C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)]. + + +.. figure:: images/nd_spl_3_comb3.png + :figclass: h! + :scale: 75% + +These are the basic examples of the *Pydra*'s *splitter-combiner* concept. It +is important to note, that *Pydra* allows for mixing *splitters* and *combiners* +on various levels of a dataflow. They can be set on a single *Task* or a *Workflow*. +They can be passed from one *Task* to following *Tasks* within the *Workflow*. diff --git a/typing-bugfixes/_sources/components.rst.txt b/typing-bugfixes/_sources/components.rst.txt new file mode 100644 index 0000000000..d4928e82c6 --- /dev/null +++ b/typing-bugfixes/_sources/components.rst.txt @@ -0,0 +1,189 @@ +Dataflows Components: Task and Workflow +======================================= +A *Task* is the basic runnable component of *Pydra* and is described by the +class ``TaskBase``. A *Task* has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any *Pydra*'s *Task* can be used as a function in a script, thus allowing +dual use in *Pydra*'s *Workflows* and in standalone scripts. There are several +classes that inherit from ``TaskBase`` and each has a different application: + + +Function Tasks +-------------- + +* ``FunctionTask`` is a *Task* that executes Python functions. Most Python functions + declared in an existing library, package, or interactively in a terminal can + be converted to a ``FunctionTask`` by using *Pydra*'s decorator - ``mark.task``. + + .. code-block:: python + + import numpy as np + from pydra import mark + fft = mark.annotate({'a': np.ndarray, + 'return': float})(np.fft.fft) + fft_task = mark.task(fft)() + result = fft_task(a=np.random.rand(512)) + + + `fft_task` is now a *Pydra* *Task* and result will contain a *Pydra*'s ``Result`` object. + In addition, the user can use Python's function annotation or another *Pydra* + decorator --- ``mark.annotate`` in order to specify the output. In the + following example, we decorate an arbitrary Python function to create named + outputs: + + .. code-block:: python + + @mark.task + @mark.annotate( + {"return": {"mean": float, "std": float}} + ) + def mean_dev(my_data): + import statistics as st + return st.mean(my_data), st.stdev(my_data) + + result = mean_dev(my_data=[...])() + + When the *Task* is executed `result.output` will contain two attributes: `mean` + and `std`. Named attributes facilitate passing different outputs to + different downstream nodes in a dataflow. + + +.. _shell_command_task: + +Shell Command Tasks +------------------- + +* ``ShellCommandTask`` is a *Task* used to run shell commands and executables. + It can be used with a simple command without any arguments, or with specific + set of arguments and flags, e.g.: + + .. code-block:: python + + ShellCommandTask(executable="pwd") + + ShellCommandTask(executable="ls", args="my_dir") + + The *Task* can accommodate more complex shell commands by allowing the user to + customize inputs and outputs of the commands. + One can generate an input + specification to specify names of inputs, positions in the command, types of + the inputs, and other metadata. + As a specific example, FSL's BET command (Brain + Extraction Tool) can be called on the command line as: + + .. code-block:: python + + bet input_file output_file -m + + Each of the command argument can be treated as a named input to the + ``ShellCommandTask``, and can be included in the input specification. + As shown next, even an output is specified by constructing + the *out_file* field form a template: + + .. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + More details are in the :ref:`Input Specification section`. + +Container Tasks +--------------- +* ``ContainerTask`` class is a child class of ``ShellCommandTask`` and serves as + a parent class for ``DockerTask`` and ``SingularityTask``. Both *Container Tasks* + run shell commands or executables within containers with specific user defined + environments using Docker_ and Singularity_ software respectively. + This might be extremely useful for users and projects that require environment + encapsulation and sharing. + Using container technologies helps improve scientific + workflows reproducibility, one of the key concept behind *Pydra*. + + These *Container Tasks* can be defined by using + ``DockerTask`` and ``SingularityTask`` classes directly, or can be created + automatically from ``ShellCommandTask``, when an optional argument + ``container_info`` is used when creating a *Shell Task*. The following two + types of syntax are equivalent: + + .. code-block:: python + + DockerTask(executable="pwd", image="busybox") + + ShellCommandTask(executable="ls", + container_info=("docker", "busybox")) + +Workflows +--------- +* ``Workflow`` - is a subclass of *Task* that provides support for creating *Pydra* + dataflows. As a subclass, a *Workflow* acts like a *Task* and has inputs, outputs, + is hashable, and is treated as a single unit. Unlike *Tasks*, workflows embed + a directed acyclic graph. Each node of the graph contains a *Task* of any type, + including another *Workflow*, and can be added to the *Workflow* simply by calling + the ``add`` method. The connections between *Tasks* are defined by using so + called *Lazy Inputs* or *Lazy Outputs*. These are special attributes that allow + assignment of values when a *Workflow* is executed rather than at the point of + assignment. The following example creates a *Workflow* from two *Pydra* *Tasks*. + + .. code-block:: python + + # creating workflow with two input fields + wf = Workflow(input_spec=["x", "y"]) + # adding a task and connecting task's input + # to the workflow input + wf.add(mult(name="mlt", + x=wf.lzin.x, y=wf.lzin.y)) + # adding another task and connecting + # task's input to the "mult" task's output + wf.add(add2(name="add", x=wf.mlt.lzout.out)) + # setting workflow output + wf.set_output([("out", wf.add.lzout.out)]) + + +Task's State +------------ +All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra's powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class. + +.. code-block:: python + + task_with_state = + add2().split(x=[1, 5]).combine("x") + +In this example, the ``State`` class is responsible for creating a list of two +separate inputs, *[{x: 1}, {x:5}]*, each run of the *Task* should get one +element from the list. Note that in this case the value for `x` is set in the `split()` +method, not at the task's initialisation. +The `combine()` method, specifies that the results are grouped back when returning the +result from the *Task*. + +While this example illustrates mapping and grouping of results over a single parameter, +*Pydra* extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power *Pydra*'s +scalable dataflows are described in the next section. + + + +.. _Docker: https://www.docker.com/ +.. _Singularity: https://www.singularity.lbl.gov/ diff --git a/typing-bugfixes/_sources/index.rst.txt b/typing-bugfixes/_sources/index.rst.txt new file mode 100644 index 0000000000..bd30e2e088 --- /dev/null +++ b/typing-bugfixes/_sources/index.rst.txt @@ -0,0 +1,91 @@ +.. Pydra: A simple dataflow engine with scalable semantics documentation master file, created by + sphinx-quickstart on Fri Jan 3 13:52:41 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Pydra: A simple dataflow engine with scalable semantics's documentation! +=================================================================================== + +Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain. + +Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python. + +The Pydra package is a part of the second generation of the Nipype_ ecosystem +--- an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL_, ANTs_, AFNI_, FreeSurfer_ and SPM_. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep_ and C-PAC_. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain. + +The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine: + +- Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested + dataflows of arbitrary depths and encouraging creating reusable dataflows. + +- Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run + over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce_ model, + but Pydra extends this to graphs with nested dataflows). + +- A content-addressable global cache: Hash values are computed for each graph and each Task. + This supports reusing of previously computed and stored dataflows and Tasks. + +- Support for Python functions and external (shell) commands: Pydra can decorate and use existing + functions in Python libraries alongside external command line tools, allowing easy integration + of existing code and software. + +- Native container execution support: Any dataflow or Task can be executed in an associated container + (via Docker or Singularity) enabling greater consistency for reproducibility. + +- Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism + to capture the dataflow execution activities as a provenance graph. These messages track inputs + and outputs of each task in a dataflow, and the resources consumed by the task. + +.. _Nipype: https://nipype.readthedocs.io/en/latest/ +.. _FSL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSL +.. _ANTs: http://stnava.github.io/ANTs/ +.. _AFNI: https://afni.nimh.nih.gov/ +.. _FreeSurfer: https://surfer.nmr.mgh.harvard.edu/ +.. _SPM: https://www.fil.ion.ucl.ac.uk/spm/ +.. _fMRIPrep: https://fmriprep.org/en/stable/ +.. _C-PAC: https://fcp-indi.github.io/docs/latest/index +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + user_guide + changes + api + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/typing-bugfixes/_sources/input_spec.rst.txt b/typing-bugfixes/_sources/input_spec.rst.txt new file mode 100644 index 0000000000..48d66fd814 --- /dev/null +++ b/typing-bugfixes/_sources/input_spec.rst.txt @@ -0,0 +1,181 @@ +.. _Input Specification section: + +Input Specification +=================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, more examples of the input specification will be provided. + + +Let's start from the previous example: + +.. code-block:: python + + bet_input_spec = SpecInfo( + name="Input", + fields=[ + ( "in_file", File, + { "help_string": "input file ...", + "position": 1, + "mandatory": True } ), + ( "out_file", str, + { "help_string": "name of output ...", + "position": 2, + "output_file_template": + "{in_file}_br" } ), + ( "mask", bool, + { "help_string": "create binary mask", + "argstr": "-m", } ) ], + bases=(ShellSpec,) ) + + ShellCommandTask(executable="bet", + input_spec=bet_input_spec) + + + +In order to create an input specification, a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Input" for +the input specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below. + +Adding a New Field to the Spec +------------------------------ + +Pydra uses `attr` classes to represent the input specification, and the full syntax for each field +is: + +.. code-block:: python + + field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>) + +However, we allow for shorter syntax, that does not include `attr.ib`: + +- providing only name and the type + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>) + + +- providing name, type and metadata (as in the example above) + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>)) + +- providing name, type and default value + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value'>) + +- providing name, type, default value and metadata + +.. code-block:: python + + field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>)) + + +Each of the shorter versions will be converted to the `(name, attr.ib(...)`. + + +Types +----- + +Type can be provided as a simple python type (e.g. `str`, `int`, `float`, etc.) +or can be more complex by using `typing.List`, `typing.Dict` and `typing.Union`. + +There are also special types provided by Pydra: + +- `File` and `Directory` - should be used in `input_spec` if the field is an existing file + or directory. + Pydra checks if the file or directory exists, and returns an error if it doesn't exist. + + +- `MultiInputObj` - a special type that takes a any value and if the value is not a list it + converts value to a 1-element list (it could be used together with `MultiOutputObj` + in the `output_spec` to reverse the conversion of the output values). + + + +Metadata +-------- + +In the example we used multiple keys in the metadata dictionary including `help_string`, +`position`, etc. In this section all allowed key will be described: + +`help_string` (`str`, mandatory): + A short description of the input field. + +`mandatory` (`bool`, default: `False`): + If `True` user has to provide a value for the field. + +`sep` (`str`): + A separator if a list is provided as a value. + +`argstr` (`str`): + A flag or string that is used in the command before the value, e.g. `-v` or `-v {inp_field}`, + but it could be and empty string, `""`. + If `...` are used, e.g. `-v...`, the flag is used before every element if a list is provided + as a value. + If no `argstr` is used the field is not part of the command. + +`position` (`int`): + Position of the field in the command, could be nonnegative or negative integer. + If nothing is provided the field will be inserted between all fields with nonnegative positions + and fields with negative positions. + +`allowed_values` (`list`): + List of allowed values for the field. + +`requires` (`list`): + List of field names that are required together with the field. + +`xor` (`list`): + List of field names that are mutually exclusive with the field. + +`copyfile` (`bool`, default: `False`): + If `True`, a hard link is created for the input file in the output directory. + If hard link not possible, the file is copied to the output directory. + +`container_path` (`bool`, default: `False`, only for `ContainerTask`): + If `True` a path will be consider as a path inside the container (and not as a local path). + +`output_file_template` (`str`): + If provided, the field is treated also as an output field and it is added to the output spec. + The template can use other fields, e.g. `{file1}`. + Used in order to create an output specification. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + Used in order to create an output specification. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + Used in order to create an output specification. + +`readonly` (`bool`, default: `False`): + If `True` the input field can't be provided by the user but it aggregates other input fields + (for example the fields with `argstr: -o {fldA} {fldB}`). + +`formatter` (`function`): + If provided the `argstr` of the field is created using the function. This function can for example + be used to combine several inputs into one command argument. + The function can take `field` (this input field will be passed to the function), + `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). + + +Validators +---------- +Pydra allows for using simple validator for types and `allowev_values`. +The validators are disabled by default, but can be enabled by calling +`pydra.set_input_validator(flag=True)`. diff --git a/typing-bugfixes/_sources/output_spec.rst.txt b/typing-bugfixes/_sources/output_spec.rst.txt new file mode 100644 index 0000000000..2e0907076b --- /dev/null +++ b/typing-bugfixes/_sources/output_spec.rst.txt @@ -0,0 +1,90 @@ +.. _Output Specification section: + +Output Specification +==================== + +As it was mentioned in :ref:`shell_command_task`, the user can customize the input and output +for the `ShellCommandTask`. +In this section, the output specification will be covered. + + +Instead of using field with `output_file_template` in the customized `input_spec` to specify an output field, +a customized `output_spec` can be used, e.g.: + + +.. code-block:: python + + output_spec = SpecInfo( + name="Output", + fields=[ + ( + "out1", + attr.ib( + type=File, + metadata={ + "output_file_template": "{inp1}", + "help_string": "output file", + "requires": ["inp1", "inp2"] + }, + ), + ) + ], + bases=(ShellOutSpec,), + ) + + ShellCommandTask(executable=executable, + output_spec=output_spec) + + + +Similarly as for `input_spec`, in order to create an output specification, +a new `SpecInfo` object has to be created. +The field `name` specifies the type of the spec and it should be always "Output" for +the output specification. +The field `bases` specifies the "base specification" you want to use (can think about it as a +`parent class`) and it will usually contains `ShellOutSpec` only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the `fields` part. +Each element of the `fields` is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See :ref:`Input Specification section` for other recognized syntax for specification's fields +and possible types. + + + +Metadata +-------- + +The metadata dictionary for `output_spec` can include: + +`help_string` (`str`, mandatory): + A short description of the input field. The same as in `input_spec`. + +`mandatory` (`bool`, default: `False`): + If `True` the output file has to exist, otherwise an error will be raised. + +`output_file_template` (`str`): + If provided the output file name (or list of file names) is created using the template. + The template can use other fields, e.g. `{file1}`. The same as in `input_spec`. + +`output_field_name` (`str`, used together with `output_file_template`) + If provided the field is added to the output spec with changed name. + The same as in `input_spec`. + +`keep_extension` (`bool`, default: `True`): + A flag that specifies if the file extension should be removed from the field value. + The same as in `input_spec`. + +`requires` (`list`): + List of field names that are required to create a specific output. + The fields do not have to be a part of the `output_file_template` and + if any field from the list is not provided in the input, a `NOTHING` is returned for the specific output. + This has a different meaning than the `requires` form the `input_spec`. + +`callable` (`function`): + If provided the output file name (or list of file names) is created using the function. + The function can take `field` (the specific output field will be passed to the function), + `output_dir` (task `output_dir` will be used), `stdout`, `stderr` (`stdout` and `stderr` of + the task will be sent) `inputs` (entire `inputs` will be passed) or any input field name + (a specific input field will be sent). diff --git a/typing-bugfixes/_sources/state.rst.txt b/typing-bugfixes/_sources/state.rst.txt new file mode 100644 index 0000000000..c99dadd00a --- /dev/null +++ b/typing-bugfixes/_sources/state.rst.txt @@ -0,0 +1,88 @@ +State and Nested Loops over Input +================================= + +One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce_, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task's split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow: + +.. math:: + + S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~, + +where S represents the splitter, and x is the input field. +This is also represented in the diagram, where :math:`x=[1, 2, 3]` as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed). + +.. image:: images/nd_spl_1.png + :scale: 50 % + +Types of Splitter +----------------- +Whenever a *Task* has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These *splitters* are called *scalar splitter* and *outer splitter*. +They use a special, but Python-based syntax as described next. + +Scalar Splitter +--------------- +A *scalar splitter* performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The *scalar splitter* uses +Python tuples and its operation is therefore represented by a parenthesis, ``()``: + +.. math:: + + S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n), + + +where `S` represents the *splitter*, `x` and `y` are the input fields. +This is also represented as a diagram: + +.. figure:: images/nd_spl_4.png + :figclass: h! + :scale: 80% + + +Outer Splitter +-------------- + +The second option of mapping the input, when there are multiple fields, is +provided by the *outer splitter*. The *outer splitter* creates all combination +of the input values and does not require the lists to have the same lengths. +The *outer splitter* uses Python's list syntax and is represented by square +brackets, ``[]``: + +.. math:: + + S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ + &\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m). + + +The *outer splitter* for a node with two input fields is schematically represented in the diagram: + +.. figure:: images/nd_spl_3.png + :figclass: h! + :scale: 80% + + +Different types of splitters can be combined over inputs such as +`[inp1, (inp2, inp3)]`. In this example an *outer splitter* provides all +combinations of values of `inp1` with pairwise combinations of values of `inp2` +and `inp3`. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section. + + +.. _Map-Reduce: https://en.wikipedia.org/wiki/MapReduce diff --git a/typing-bugfixes/_sources/user_guide.rst.txt b/typing-bugfixes/_sources/user_guide.rst.txt new file mode 100644 index 0000000000..bf48a9a8a9 --- /dev/null +++ b/typing-bugfixes/_sources/user_guide.rst.txt @@ -0,0 +1,12 @@ +User Guide +========== + + + +.. toctree:: + + components + state + combiner + input_spec + output_spec diff --git a/typing-bugfixes/_static/_sphinx_javascript_frameworks_compat.js b/typing-bugfixes/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000000..81415803ec --- /dev/null +++ b/typing-bugfixes/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/typing-bugfixes/_static/banner.css b/typing-bugfixes/_static/banner.css new file mode 100644 index 0000000000..e52e8d2aed --- /dev/null +++ b/typing-bugfixes/_static/banner.css @@ -0,0 +1,41 @@ +.scv-banner { + padding: 3px; + border-radius: 2px; + font-size: 80%; + text-align: center; + color: white; + background: #d40 linear-gradient(-45deg, + rgba(255, 255, 255, 0.2) 0%, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 28px 28px; +} +.scv-banner > a { + color: white; +} + + +.scv-sphinx_rtd_theme { + background-color: #2980B9; +} + + +.scv-bizstyle { + background-color: #336699; +} + + +.scv-classic { + text-align: center !important; +} + + +.scv-traditional { + text-align: center !important; +} diff --git a/typing-bugfixes/_static/basic.css b/typing-bugfixes/_static/basic.css new file mode 100644 index 0000000000..7577acb1ad --- /dev/null +++ b/typing-bugfixes/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/typing-bugfixes/_static/css/badge_only.css b/typing-bugfixes/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/typing-bugfixes/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff2 b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff2 b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/fontawesome-webfont.eot b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/typing-bugfixes/_static/css/fonts/fontawesome-webfont.svg b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/typing-bugfixes/_static/css/fonts/fontawesome-webfont.ttf b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff2 b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff b/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff differ diff --git a/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff2 b/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/lato-bold.woff b/typing-bugfixes/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-bold.woff differ diff --git a/typing-bugfixes/_static/css/fonts/lato-bold.woff2 b/typing-bugfixes/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-bold.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff b/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff differ diff --git a/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff2 b/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/typing-bugfixes/_static/css/fonts/lato-normal.woff b/typing-bugfixes/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-normal.woff differ diff --git a/typing-bugfixes/_static/css/fonts/lato-normal.woff2 b/typing-bugfixes/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/typing-bugfixes/_static/css/fonts/lato-normal.woff2 differ diff --git a/typing-bugfixes/_static/css/theme.css b/typing-bugfixes/_static/css/theme.css new file mode 100644 index 0000000000..19a446a0e7 --- /dev/null +++ b/typing-bugfixes/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/typing-bugfixes/_static/doctools.js b/typing-bugfixes/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/typing-bugfixes/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/typing-bugfixes/_static/documentation_options.js b/typing-bugfixes/_static/documentation_options.js new file mode 100644 index 0000000000..13b8cd73d3 --- /dev/null +++ b/typing-bugfixes/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.24.dev17+g873f8a0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/typing-bugfixes/_static/file.png b/typing-bugfixes/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/typing-bugfixes/_static/file.png differ diff --git a/typing-bugfixes/_static/jquery.js b/typing-bugfixes/_static/jquery.js new file mode 100644 index 0000000000..c4c6022f29 --- /dev/null +++ b/typing-bugfixes/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/typing-bugfixes/_static/js/html5shiv.min.js b/typing-bugfixes/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/typing-bugfixes/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/typing-bugfixes/_static/js/theme.js b/typing-bugfixes/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/typing-bugfixes/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/typing-bugfixes/_static/minus.png b/typing-bugfixes/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/typing-bugfixes/_static/minus.png differ diff --git a/typing-bugfixes/_static/plus.png b/typing-bugfixes/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/typing-bugfixes/_static/plus.png differ diff --git a/typing-bugfixes/_static/pygments.css b/typing-bugfixes/_static/pygments.css new file mode 100644 index 0000000000..84ab3030a9 --- /dev/null +++ b/typing-bugfixes/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/typing-bugfixes/_static/searchtools.js b/typing-bugfixes/_static/searchtools.js new file mode 100644 index 0000000000..97d56a74d8 --- /dev/null +++ b/typing-bugfixes/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/typing-bugfixes/_static/sphinx_highlight.js b/typing-bugfixes/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/typing-bugfixes/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/typing-bugfixes/api.html b/typing-bugfixes/api.html new file mode 100644 index 0000000000..55df0adf9e --- /dev/null +++ b/typing-bugfixes/api.html @@ -0,0 +1,1019 @@ + + + + + + + Library API (application programmer interface) — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Library API (application programmer interface)

+

The Pydra workflow engine.

+

Pydra is a rewrite of the Nipype engine with mapping and joining as +first-class operations. It forms the core of the Nipype 2.0 ecosystem.

+
+
+class pydra.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.audit.html b/typing-bugfixes/api/pydra.engine.audit.html new file mode 100644 index 0000000000..dd7e0758bb --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.audit.html @@ -0,0 +1,244 @@ + + + + + + + pydra.engine.audit module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.audit module

+

Module to keep track of provenance information.

+
+
+class pydra.engine.audit.Audit(audit_flags, messengers, messenger_args, develop=None)
+

Bases: object

+

Handle provenance tracking and resource utilization.

+
+
+audit_check(flag)
+

Determine whether auditing is enabled for a particular flag.

+
+
Parameters:
+

flag (:obj: bool) – The flag that is checked.

+
+
Returns:
+

Boolean AND for self.oudit_flags and flag

+
+
Return type:
+

bool

+
+
+
+ +
+
+audit_message(message, flags=None)
+

Send auditing message.

+
+
Parameters:
+
    +
  • message (dict) – A message in Pydra is a JSON-LD message object.

  • +
  • flags (bool, optional) – If True and self.audit_flag, the message is sent.

  • +
+
+
+
+ +
+
+audit_task(task)
+
+ +
+
+finalize_audit(result)
+

End auditing.

+
+ +
+
+monitor()
+

Start resource monitoring.

+
+ +
+
+start_audit(odir)
+

Start recording provenance.

+

Monitored information is not sent until directory is created, +in case message directory is inside task output directory.

+
+
Parameters:
+

odir (os.pathlike) – Message output directory.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.boutiques.html b/typing-bugfixes/api/pydra.engine.boutiques.html new file mode 100644 index 0000000000..f7ad4bdb9d --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.boutiques.html @@ -0,0 +1,182 @@ + + + + + + + pydra.engine.boutiques module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.boutiques module

+
+
+class pydra.engine.boutiques.BoshTask(zenodo_id=None, bosh_file=None, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec_names: List | None = None, messenger_args=None, messengers=None, name=None, output_spec_names: List | None = None, rerun=False, strip=False, **kwargs)
+

Bases: ShellCommandTask

+

Shell Command Task based on the Boutiques descriptor

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.core.html b/typing-bugfixes/api/pydra.engine.core.html new file mode 100644 index 0000000000..19e0fed6de --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.core.html @@ -0,0 +1,501 @@ + + + + + + + pydra.engine.core module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.core module

+

Basic processing graph elements.

+
+
+class pydra.engine.core.TaskBase(name: str, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, inputs: str | File | Dict | None = None, cont_dim=None, messenger_args=None, messengers=None, rerun=False)
+

Bases: object

+

A base structure for the nodes in the processing graph.

+

Tasks are a generic compute step from which both elementary tasks and +Workflow instances inherit.

+
+
+DEFAULT_COPY_COLLATION = 0
+
+ +
+
+SUPPORTED_COPY_MODES = 15
+
+ +
+
+audit_flags: AuditFlag = 0
+

AuditFlag.

+
+
Type:
+

What to audit – available flags

+
+
+
+ +
+
+property cache_dir
+

Get the location of the cache directory.

+
+ +
+
+property cache_locations
+

Get the list of cache sources.

+
+ +
+
+property can_resume
+

Whether the task accepts checkpoint-restart.

+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+checksum_states(state_index=None)
+

Calculate a checksum for the specific state or all of the states of the task. +Replaces lists in the inputs fields with a specific values for states. +Used to recreate names of the task directories,

+
+
Parameters:
+

state_index – TODO

+
+
+
+ +
+
+combine(combiner: List[str] | str, overwrite: bool = False)
+

Combine inputs parameterized by one or more previous tasks.

+
+
Parameters:
+
    +
  • combiner (list[str] or str) – the

  • +
  • overwrite (bool) – whether to overwrite an existing combiner on the node

  • +
  • **kwargs (dict[str, Any]) – values for the task that will be “combined” before they are provided to the +node

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property cont_dim
+
+ +
+
+property done
+

Check whether the tasks has been finalized and all outputs are stored.

+
+ +
+
+property errored
+

Check if the task has raised an error

+
+ +
+
+property generated_output_names
+

Get the names of the outputs generated by the task. +If the spec doesn’t have generated_output_names method, +it uses output_names. +The results depends on the input provided to the task

+
+ +
+
+get_input_el(ind)
+

Collect all inputs required to run the node (for specific state element).

+
+ +
+
+help(returnhelp=False)
+

Print class help.

+
+ +
+
+property lzout
+
+ +
+
+property output_dir
+

Get the filesystem path where outputs will be written.

+
+ +
+
+property output_names
+

Get the names of the outputs from the task’s output_spec +(not everything has to be generated, see generated_output_names).

+
+ +
+
+pickle_task()
+

Pickling the tasks with full inputs

+
+ +
+
+result(state_index=None, return_inputs=False)
+

Retrieve the outcomes of this particular task.

+
+
Parameters:
+
    +
  • state_index (:obj: int) – index of the element for task with splitter and multiple states

  • +
  • return_inputs (:obj: bool, str) – if True or “val” result is returned together with values of the input fields, +if “ind” result is returned together with indices of the input fields

  • +
+
+
Returns:
+

result – the result of the task

+
+
Return type:
+

Result

+
+
+
+ +
+
+set_state(splitter, combiner=None)
+

Set a particular state on this task.

+
+
Parameters:
+
    +
  • splitter – TODO

  • +
  • combiner – TODO

  • +
+
+
+
+ +
+
+split(splitter: str | List[str] | Tuple[str, ...] | None = None, overwrite: bool = False, cont_dim: dict | None = None, **inputs)
+

Run this task parametrically over lists of split inputs.

+
+
Parameters:
+
    +
  • splitter (str or list[str] or tuple[str] or None) – the fields which to split over. If splitting over multiple fields, lists of +fields are interpreted as outer-products and tuples inner-products. If None, +then the fields to split are taken from the keyword-arg names.

  • +
  • overwrite (bool, optional) – whether to overwrite an existing split on the node, by default False

  • +
  • cont_dim (dict, optional) – Container dimensions for specific inputs, used in the splitter. +If input name is not in cont_dim, it is assumed that the input values has +a container dimension of 1, so only the most outer dim will be used for splitting.

  • +
  • **split_inputs – fields to split over, will automatically be wrapped in a StateArray object +and passed to the node inputs

  • +
+
+
Returns:
+

self – a reference to the task

+
+
Return type:
+

TaskBase

+
+
+
+ +
+
+property uid
+

the unique id number for the task +It will be used to create unique names for slurm scripts etc. +without a need to run checksum

+
+ +
+
+property version
+

Get version of this task structure.

+
+ +
+ +
+
+class pydra.engine.core.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+
+pydra.engine.core.is_lazy(obj)
+

Check whether an object has any field that is a Lazy Field

+
+ +
+
+pydra.engine.core.is_task(obj)
+

Check whether an object looks like a task.

+
+ +
+
+pydra.engine.core.is_workflow(obj)
+

Check whether an object is a Workflow instance.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.environments.html b/typing-bugfixes/api/pydra.engine.environments.html new file mode 100644 index 0000000000..1d1e093d75 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.environments.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.environments module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.environments module

+
+
+class pydra.engine.environments.Container(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Environment

+

Base class for container environments used by Docker and Singularity.

+
+
Parameters:
+
    +
  • image (str) – Name of the container image

  • +
  • tag (str) – Tag of the container image

  • +
  • root (str) – Base path for mounting host directories into the container

  • +
  • xargs (Union[str, List[str]]) – Extra arguments to be passed to the container

  • +
+
+
+
+
+bind(loc, mode='ro')
+
+ +
+ +
+
+class pydra.engine.environments.Docker(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Docker environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Environment
+

Bases: object

+

Base class for environments that are used to execute tasks. +Right now it is assumed that the environment, including container images, +are available and are not removed at the end +TODO: add setup and teardown methods

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+
+setup()
+
+ +
+
+teardown()
+
+ +
+ +
+
+class pydra.engine.environments.Native
+

Bases: Environment

+

Native environment, i.e. the tasks are executed in the current python environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+
+class pydra.engine.environments.Singularity(image, tag='latest', root='/mnt/pydra', xargs=None)
+

Bases: Container

+

Singularity environment.

+
+
+execute(task)
+

Execute the task in the environment.

+
+
Parameters:
+

task (TaskBase) – the task to execute

+
+
Returns:
+

Output of the task.

+
+
Return type:
+

output

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.graph.html b/typing-bugfixes/api/pydra.engine.graph.html new file mode 100644 index 0000000000..f35051c575 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.graph.html @@ -0,0 +1,351 @@ + + + + + + + pydra.engine.graph module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.graph module

+

Data structure to support Workflow tasks.

+
+
+class pydra.engine.graph.DiGraph(name=None, nodes=None, edges=None)
+

Bases: object

+

A simple Directed Graph object.

+
+
+add_edges(new_edges)
+

Add new edges and sort the new graph.

+
+ +
+
+add_edges_description(new_edge_details)
+

adding detailed description of the connections, filling _nodes_details

+
+ +
+
+add_nodes(new_nodes)
+

Insert new nodes and sort the new graph.

+
+ +
+
+calculate_max_paths()
+

Calculate maximum paths.

+

Maximum paths are calculated between any node without “history” (no predecessors) +and all of the connections.

+
+ +
+
+copy()
+

Duplicate this graph.

+

Create a copy that contains new lists and dictionaries, +but runnable objects are the same.

+
+ +
+
+create_dotfile_detailed(outdir, name='graph_det')
+

creates a detailed dotfile (detailed connections - input/output fields, +but no nested structure)

+
+ +
+
+create_dotfile_nested(outdir, name='graph')
+

dotfile that includes the nested structures for workflows

+
+ +
+
+create_dotfile_simple(outdir, name='graph')
+

creates a simple dotfile (no nested structure)

+
+ +
+
+property edges
+

Get a list of the links between nodes.

+
+ +
+
+property edges_names
+

Get edges as pairs of the nodes they connect.

+
+ +
+
+export_graph(dotfile, ext='png')
+

exporting dotfile to other formats requires the dot command

+
+ +
+
+property nodes
+

Get a list of the nodes currently contained in the graph.

+
+ +
+
+property nodes_details
+

dictionary with details of the nodes +for each task, there are inputs/outputs and connections +(with input/output fields names)

+
+ +
+
+property nodes_names_map
+

Get a map of node names to nodes.

+
+ +
+
+remove_nodes(nodes, check_ready=True)
+

Mark nodes for removal from the graph, re-sorting if needed.

+
+

Important

+

This method does not remove connections, see +remove_node_connections(). +Nodes are added to the _node_wip list, marking +them for removal when all referring connections +are removed.

+
+
+
Parameters:
+
    +
  • nodes (list) – List of nodes to be marked for removal.

  • +
  • check_ready (:obj: bool) – checking if the node is ready to be removed

  • +
+
+
+
+ +
+
+remove_nodes_connections(nodes)
+

Remove connections between nodes.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_previous_connections(nodes)
+

Remove connections that the node has with predecessors.

+

Also prunes the nodes from _node_wip.

+
+
Parameters:
+

nodes (list) – List of nodes which connections are to be removed.

+
+
+
+ +
+
+remove_successors_nodes(node)
+

Removing all the nodes that follow the node

+
+ +
+
+property sorted_nodes
+

Return sorted nodes (runs sorting if needed).

+
+ +
+
+property sorted_nodes_names
+

Return a list of sorted nodes names.

+
+ +
+
+sorting(presorted=None)
+

Sort this graph.

+

Sorting starts either from self.nodes or the +previously sorted list.

+
+
Parameters:
+

presorted (list) – A list of previously sorted nodes.

+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.helpers.html b/typing-bugfixes/api/pydra.engine.helpers.html new file mode 100644 index 0000000000..197130a022 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.helpers.html @@ -0,0 +1,452 @@ + + + + + + + pydra.engine.helpers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers module

+

Administrative support for the engine framework.

+
+
+class pydra.engine.helpers.PydraFileLock(lockfile)
+

Bases: object

+

Wrapper for filelock’s SoftFileLock that makes it work with asyncio.

+
+ +
+
+pydra.engine.helpers.allowed_values_validator(_, attribute, value)
+

checking if the values is in allowed_values

+
+ +
+
+pydra.engine.helpers.argstr_formatting(argstr, inputs, value_updates=None)
+

formatting argstr that have form {field_name}, +using values from inputs and updating with value_update if provided

+
+ +
+
+pydra.engine.helpers.copyfile_workflow(wf_path: PathLike, result)
+

if file in the wf results, the file will be copied to the workflow directory

+
+ +
+
+pydra.engine.helpers.create_checksum(name, inputs)
+

Generate a checksum name for a given combination of task name and inputs.

+
+
Parameters:
+
    +
  • name (str) – Task name.

  • +
  • inputs (str) – String of inputs.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.ensure_list(obj, tuple2list=False)
+

Return a list whatever the input object is.

+

Examples

+
>>> ensure_list(list("abc"))
+['a', 'b', 'c']
+>>> ensure_list("abc")
+['abc']
+>>> ensure_list(tuple("abc"))
+[('a', 'b', 'c')]
+>>> ensure_list(tuple("abc"), tuple2list=True)
+['a', 'b', 'c']
+>>> ensure_list(None)
+[]
+>>> ensure_list(5.0)
+[5.0]
+
+
+
+ +
+
+pydra.engine.helpers.execute(cmd, strip=False)
+

Run the event loop with coroutine.

+

Uses read_and_display_async() unless a loop is +already running, in which case read_and_display() +is used.

+
+
Parameters:
+
    +
  • cmd (list or tuple) – The command line to be executed.

  • +
  • strip (bool) – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.from_list_if_single(obj)
+

Converts a list to a single item if it is of length == 1

+
+ +
+
+pydra.engine.helpers.gather_runtime_info(fname)
+

Extract runtime information from a file.

+
+
Parameters:
+

fname (os.pathlike) – The file containing runtime information

+
+
Returns:
+

runtime – A runtime object containing the collected information.

+
+
Return type:
+

Runtime

+
+
+
+ +
+
+pydra.engine.helpers.get_available_cpus()
+

Return the number of CPUs available to the current process or, if that is not +available, the total number of CPUs on the system.

+
+
Returns:
+

n_proc – The number of available CPUs.

+
+
Return type:
+

int

+
+
+
+ +
+
+pydra.engine.helpers.get_open_loop()
+

Get current event loop.

+

If the loop is closed, a new +loop is created and set as the current event loop.

+
+
Returns:
+

loop – The current event loop

+
+
Return type:
+

asyncio.EventLoop

+
+
+
+ +
+
+pydra.engine.helpers.load_and_run(task_pkl, ind=None, rerun=False, submitter=None, plugin=None, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the task

+
+ +
+
+async pydra.engine.helpers.load_and_run_async(task_pkl, ind=None, submitter=None, rerun=False, **kwargs)
+

loading a task from a pickle file, settings proper input +and running the workflow

+
+ +
+
+pydra.engine.helpers.load_result(checksum, cache_locations)
+

Restore a result from the cache.

+
+
Parameters:
+
    +
  • checksum (str) – Unique identifier of the task to be loaded.

  • +
  • cache_locations (list of os.pathlike) – List of cache directories, in order of priority, where +the checksum will be looked for.

  • +
+
+
+
+ +
+
+pydra.engine.helpers.load_task(task_pkl, ind=None)
+

loading a task from a pickle file, settings proper input for the specific ind

+
+ +
+
+pydra.engine.helpers.make_klass(spec)
+

Create a data class given a spec.

+
+
Parameters:
+

spec – TODO

+
+
+
+ +
+
+pydra.engine.helpers.output_from_inputfields(output_spec, input_spec)
+

Collect values from output from input fields. +If names_only is False, the output_spec is updated, +if names_only is True only the names are returned

+
+
Parameters:
+
    +
  • output_spec – TODO

  • +
  • input_spec – TODO

  • +
+
+
+
+ +
+
+pydra.engine.helpers.parse_copyfile(fld: Attribute, default_collation=CopyCollation.any)
+

Gets the copy mode from the ‘copyfile’ value from a field attribute

+
+ +
+
+pydra.engine.helpers.parse_format_string(fmtstr)
+

Parse a argstr format string and return all keywords used in it.

+
+ +
+
+pydra.engine.helpers.position_sort(args)
+

Sort objects by position, following Python indexing conventions.

+

Ordering is positive positions, lowest to highest, followed by unspecified +positions (None) and negative positions, lowest to highest.

+
>>> position_sort([(None, "d"), (-3, "e"), (2, "b"), (-2, "f"), (5, "c"), (1, "a")])
+['a', 'b', 'c', 'd', 'e', 'f']
+
+
+
+
Parameters:
+

args (list of (int/None, object) tuples)

+
+
Return type:
+

list of objects

+
+
+
+ +
+
+pydra.engine.helpers.print_help(obj)
+

Visit a task object and print its input/output interface.

+
+ +
+
+pydra.engine.helpers.read_and_display(*cmd, strip=False, hide_display=False)
+

Capture a process’ standard output.

+
+ +
+
+async pydra.engine.helpers.read_and_display_async(*cmd, hide_display=False, strip=False)
+

Capture standard input and output of a process, displaying them as they arrive.

+

Works line-by-line.

+
+ +
+
+async pydra.engine.helpers.read_stream_and_display(stream, display)
+

Read from stream line by line until EOF, display, and capture the lines.

+
+

See also

+

This discussion on StackOverflow.

+
+
+ +
+
+pydra.engine.helpers.record_error(error_path, error)
+

Write an error file.

+
+ +
+
+pydra.engine.helpers.save(task_path: Path, result=None, task=None, name_prefix=None)
+

Save a TaskBase object and/or results.

+
+
Parameters:
+
    +
  • task_path (Path) – Write directory

  • +
  • result (Result) – Result to pickle and write

  • +
  • task (TaskBase) – Task to pickle and write

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.helpers_file.html b/typing-bugfixes/api/pydra.engine.helpers_file.html new file mode 100644 index 0000000000..1f5bb97318 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.helpers_file.html @@ -0,0 +1,315 @@ + + + + + + + pydra.engine.helpers_file module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_file module

+

Functions ported from Nipype 1, after removing parts that were related to py2.

+
+
+class pydra.engine.helpers_file.MountIndentifier
+

Bases: object

+

Used to check the mount type that given file paths reside on in order to determine +features that can be used (e.g. symlinks)

+
+
+classmethod generate_cifs_table() List[Tuple[str, str]]
+

Construct a reverse-length-ordered list of mount points that fall under a CIFS mount.

+

This precomputation allows efficient checking for whether a given path +would be on a CIFS filesystem. +On systems without a mount command, or with no CIFS mounts, returns an +empty list.

+
+ +
+
+classmethod get_mount(path: PathLike) Tuple[Path, str]
+

Get the mount point for a given file-system path

+
+
Parameters:
+

path (os.PathLike) – the file-system path to identify the mount of

+
+
Returns:
+

    +
  • mount_point (os.PathLike) – the root of the mount the path sits on

  • +
  • fstype (str) – the type of the file-system (e.g. ext4 or cifs)

  • +
+

+
+
+
+ +
+
+classmethod get_mount_table() List[Tuple[str, str]]
+
+ +
+
+classmethod on_cifs(path: PathLike) bool
+

Check whether a file path is on a CIFS filesystem mounted in a POSIX host.

+

POSIX hosts are assumed to have the mount command.

+

On Windows, Docker mounts host directories into containers through CIFS +shares, which has support for Minshall+French symlinks, or text files that +the CIFS driver exposes to the OS as symlinks. +We have found that under concurrent access to the filesystem, this feature +can result in failures to create or read recently-created symlinks, +leading to inconsistent behavior and FileNotFoundError errors.

+

This check is written to support disabling symlinks on CIFS shares.

+

NB: This function and sub-functions are copied from the nipype.utils.filemanip module

+

NB: Adapted from https://github.com/nipy/nipype

+
+ +
+
+classmethod on_same_mount(path1: PathLike, path2: PathLike) bool
+

Checks whether two or paths are on the same logical file system

+
+ +
+
+classmethod parse_mount_table(exit_code: int, output: str) List[Tuple[str, str]]
+

Parse the output of mount to produce (path, fs_type) pairs.

+

Separated from _generate_cifs_table to enable testing logic with real +outputs

+
+ +
+
+classmethod patch_table(mount_table: List[Tuple[str, str]])
+

Patch the mount table with new values. Used in test routines

+
+ +
+ +
+
+pydra.engine.helpers_file.copy_nested_files(value: Any, dest_dir: PathLike, supported_modes: CopyMode = CopyMode.any, **kwargs) Any
+

Copies all “file-sets” found within the nested value (e.g. dict, list,…) into the +destination directory. If no nested file-sets are found then the original value is +returned. Note that multiple nested file-sets (e.g. a list) will to have unique names +names (i.e. not differentiated by parent directories) otherwise there will be a path +clash in the destination directory.

+
+
Parameters:
+
    +
  • value (Any) – the value to copy files from (if required)

  • +
  • dest_dir (os.PathLike) – the destination directory to copy the files to

  • +
  • **kwargs – passed directly onto FileSet.copy()

  • +
+
+
+
+ +
+
+pydra.engine.helpers_file.ensure_list(filename)
+

Return a list given either a string or a list.

+
+ +
+
+pydra.engine.helpers_file.is_container(item)
+

Check if item is a container (list, tuple, dict, set).

+
+
Parameters:
+

item (object) – Input object to check.

+
+
Returns:
+

outputTrue if container False otherwise.

+
+
Return type:
+

bool

+
+
+
+ +
+
+pydra.engine.helpers_file.is_local_file(f)
+
+ +
+
+pydra.engine.helpers_file.template_update(inputs, output_dir, state_ind=None, map_copyfiles=None)
+

Update all templates that are present in the input spec.

+

Should be run when all inputs used in the templates are already set.

+
+ +
+
+pydra.engine.helpers_file.template_update_single(field, inputs, inputs_dict_st=None, output_dir=None, spec_type='input')
+

Update a single template from the input_spec or output_spec +based on the value from inputs_dict +(checking the types of the fields, that have “output_file_template)”

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.helpers_state.html b/typing-bugfixes/api/pydra.engine.helpers_state.html new file mode 100644 index 0000000000..12af3f5f1b --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.helpers_state.html @@ -0,0 +1,319 @@ + + + + + + + pydra.engine.helpers_state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.helpers_state module

+

Additional functions used mostly by the State class.

+
+
+exception pydra.engine.helpers_state.PydraStateError(value)
+

Bases: Exception

+

Custom error for Pydra State

+
+ +
+
+pydra.engine.helpers_state.add_name_combiner(combiner, name)
+

adding a node’s name to each field from the combiner

+
+ +
+
+pydra.engine.helpers_state.add_name_splitter(splitter: str | List[str] | Tuple[str, ...] | None, name: str) List[str] | None
+

adding a node’s name to each field from the splitter

+
+ +
+
+pydra.engine.helpers_state.combine_final_groups(combiner, groups, groups_stack, keys)
+

Combine the final groups.

+
+ +
+
+pydra.engine.helpers_state.converter_groups_to_input(group_for_inputs)
+

Return fields for each axis and number of all groups.

+

Requires having axes for all the input fields.

+
+
Parameters:
+

group_for_inputs – specified axes (groups) for each input

+
+
+
+ +
+
+pydra.engine.helpers_state.flatten(vals, cur_depth=0, max_depth=None)
+

Flatten a list of values.

+
+ +
+
+pydra.engine.helpers_state.input_shape(inp, cont_dim=1)
+

Get input shape, depends on the container dimension, if not specify it is assumed to be 1

+
+ +
+
+pydra.engine.helpers_state.inputs_types_to_dict(name, inputs)
+

Convert type.Inputs to dictionary.

+
+ +
+
+pydra.engine.helpers_state.iter_splits(iterable, keys)
+

Generate splits.

+
+ +
+
+pydra.engine.helpers_state.map_splits(split_iter, inputs, cont_dim=None)
+

generate a dictionary of inputs prescribed by the splitter.

+
+ +
+
+pydra.engine.helpers_state.remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove)
+

Remove inputs due to combining.

+

Mutates a splitter.

+
+
Parameters:
+
    +
  • splitter_rpn – The splitter in reverse polish notation

  • +
  • inputs_to_remove – input names that should be removed from the splitter

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.rpn2splitter(splitter_rpn)
+

Convert from splitter_rpn to splitter.

+

Recurrent algorithm to perform the conversion. +Every time combines pairs of input in one input, +ends when the length is one.

+
+
Parameters:
+

splitter_rpn – splitter in reverse polish notation

+
+
Returns:
+

splitter in the standard/original form

+
+
Return type:
+

splitter

+
+
+
+ +
+
+pydra.engine.helpers_state.splits_groups(splitter_rpn, combiner=None, inner_inputs=None)
+

splits inputs to groups (axes) and creates stacks for these groups +This is used to specify which input can be combined.

+
+ +
+
+pydra.engine.helpers_state.splitter2rpn(splitter, other_states=None, state_fields=True)
+

Translate user-provided splitter into reverse polish notation.

+

The reverse polish notation is imposed by State.

+
+
Parameters:
+
    +
  • splitter – splitter (standard form)

  • +
  • other_states – other states that are connected to the state

  • +
  • state_fields (bool) – if False the splitter from the previous states are unwrapped

  • +
+
+
+
+ +
+
+pydra.engine.helpers_state.unwrap_splitter(splitter: str | List[str] | Tuple[str, ...]) Iterable[str]
+

Unwraps a splitter into a flat list of fields that are split over, i.e. +[(“a”, “b”), “c”] -> [“a”, “b”, “c”]

+
+
Parameters:
+

splitter (str or list[str] or tuple[str, …]) – the splitter spec to unwrap

+
+
Returns:
+

unwrapped – the field names listed in the splitter

+
+
Return type:
+

ty.Iterable[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.html b/typing-bugfixes/api/pydra.engine.html new file mode 100644 index 0000000000..e811fbda6c --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.html @@ -0,0 +1,429 @@ + + + + + + + pydra.engine package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine package

+

The core of the workflow engine.

+
+
+class pydra.engine.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.engine.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+class pydra.engine.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+class pydra.engine.Workflow(name, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: List[str] | Dict[str, Type[Any]] | SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, output_spec: List[str] | Dict[str, type] | SpecInfo | BaseSpec | None = None, rerun=False, propagate_rerun=True, **kwargs)
+

Bases: TaskBase

+

A composite task with structure of computational graph.

+
+
+add(task)
+

Add a task to the workflow.

+
+
Parameters:
+

task (TaskBase) – The task to be added.

+
+
+
+ +
+
+property checksum
+

Calculates the unique checksum of the task. +Used to create specific directory name for task that are run; +and to create nodes checksums needed for graph checksums +(before the tasks have inputs etc.)

+
+ +
+
+create_connections(task, detailed=False)
+

Add and connect a particular task to existing nodes in the workflow.

+
+
Parameters:
+
    +
  • task (TaskBase) – The task to be added.

  • +
  • detailed (bool) – If True, add_edges_description is run for self.graph to add +a detailed descriptions of the connections (input/output fields names)

  • +
+
+
+
+ +
+
+create_dotfile(type='simple', export=None, name=None, output_dir=None)
+

creating a graph - dotfile and optionally exporting to other formats

+
+ +
+
+property graph_sorted
+

Get a sorted graph representation of the workflow.

+
+ +
+
+property lzin
+
+ +
+
+property nodes
+

Get the list of node names.

+
+ +
+
+set_output(connections: Tuple[str, LazyField] | List[Tuple[str, LazyField]])
+

Set outputs of the workflow by linking them with lazy outputs of tasks

+
+
Parameters:
+

connections (tuple[str, LazyField] or list[tuple[str, LazyField]] or None) – single or list of tuples linking the name of the output to a lazy output +of a task in the workflow.

+
+
+
+ +
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.run_pickled.html b/typing-bugfixes/api/pydra.engine.run_pickled.html new file mode 100644 index 0000000000..b0d29088bc --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.run_pickled.html @@ -0,0 +1,180 @@ + + + + + + + pydra.engine.run_pickled module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.run_pickled module

+
+
+pydra.engine.run_pickled.run_pickled(*file_paths, rerun=False)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.specs.html b/typing-bugfixes/api/pydra.engine.specs.html new file mode 100644 index 0000000000..13c5690355 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.specs.html @@ -0,0 +1,650 @@ + + + + + + + pydra.engine.specs module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.specs module

+

Task I/O specifications.

+
+
+class pydra.engine.specs.BaseSpec
+

Bases: object

+

The base dataclass specs for all inputs and outputs.

+
+
+check_fields_input_spec()
+

Check fields from input spec based on the medatada.

+

e.g., if xor, requires are fulfilled, if value provided when mandatory.

+
+ +
+
+check_metadata()
+

Check contained metadata.

+
+ +
+
+collect_additional_outputs(inputs, output_dir, outputs)
+

Get additional outputs.

+
+ +
+
+copyfile_input(output_dir)
+

Copy the file pointed by a File input.

+
+ +
+
+property hash
+
+ +
+
+hash_changes()
+

Detects any changes in the hashed values between the current inputs and the +previously calculated values

+
+ +
+
+retrieve_values(wf, state_index: int | None = None)
+

Get values contained by this spec.

+
+ +
+
+template_update()
+

Update template.

+
+ +
+ +
+
+class pydra.engine.specs.FunctionSpec
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+ +
+
+class pydra.engine.specs.LazyField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: Generic[T]

+

Lazy fields implement promises.

+
+
+cast(new_type: Type[T] | Any) LazyField
+

“casts” the lazy field to a new type

+
+
Parameters:
+

new_type (type) – the type to cast the lazy-field to

+
+
Returns:
+

cast_field – a copy of the lazy field with the new type

+
+
Return type:
+

LazyField

+
+
+
+ +
+
+cast_from: Type[Any] | None
+
+ +
+
+field: str
+
+ +
+
+name: str
+
+ +
+
+classmethod sanitize_splitter(splitter: str | Tuple[str, ...], strip_previous: bool = True) Tuple[Tuple[str, ...], ...]
+

Converts the splitter spec into a consistent tuple[tuple[str, …], …] form +used in LazyFields

+
+ +
+
+split(splitter: str | Tuple[str, ...]) LazyField
+

“Splits” the lazy field over an array of nodes by replacing the sequence type +of the lazy field with StateArray to signify that it will be “split” across

+
+
Parameters:
+

splitter (str or ty.Tuple[str, …] or ty.List[str]) – the splitter to append to the list of splitters

+
+
+
+ +
+
+splits: FrozenSet[Tuple[Tuple[str, ...], ...]]
+
+ +
+
+type: Type[T] | Any
+
+ +
+ +
+
+class pydra.engine.specs.LazyIn(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyInField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'input'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.LazyInterface(task: core.TaskBase)
+

Bases: object

+
+ +
+
+class pydra.engine.specs.LazyOut(task: core.TaskBase)
+

Bases: LazyInterface

+
+ +
+
+class pydra.engine.specs.LazyOutField(*, name: str, field: str, type: Type[T] | Any, splits=_Nothing.NOTHING, cast_from: Type[Any] | None = None)
+

Bases: LazyField[T]

+
+
+attr_type = 'output'
+
+ +
+
+get_value(wf: Workflow, state_index: int | None = None) Any
+

Return the value of a lazy field.

+
+
Parameters:
+
    +
  • wf (Workflow) – the workflow the lazy field references

  • +
  • state_index (int, optional) – the state index of the field to access

  • +
+
+
Returns:
+

value – the resolved value of the lazy-field

+
+
Return type:
+

Any

+
+
+
+ +
+ +
+
+class pydra.engine.specs.MultiInputObj(iterable=(), /)
+

Bases: list, Generic[T]

+
+ +
+
+class pydra.engine.specs.MultiOutputType
+

Bases: object

+
+ +
+
+class pydra.engine.specs.Result(*, output: Any | None = None, runtime: Runtime | None = None, errored: bool = False)
+

Bases: object

+

Metadata regarding the outputs of processing.

+
+
+errored: bool
+
+ +
+
+get_output_field(field_name)
+

Used in get_values in Workflow

+
+
Parameters:
+

field_name (str) – Name of field in LazyField object

+
+
+
+ +
+
+output: Any | None
+
+ +
+
+runtime: Runtime | None
+
+ +
+ +
+
+class pydra.engine.specs.Runtime(*, rss_peak_gb: float | None = None, vms_peak_gb: float | None = None, cpu_peak_percent: float | None = None)
+

Bases: object

+

Represent run time metadata.

+
+
+cpu_peak_percent: float | None
+

Peak in cpu consumption.

+
+ +
+
+rss_peak_gb: float | None
+

Peak in consumption of physical RAM.

+
+ +
+
+vms_peak_gb: float | None
+

Peak in consumption of virtual memory.

+
+ +
+ +
+
+class pydra.engine.specs.RuntimeSpec(*, outdir: str | None = None, container: str | None = 'shell', network: bool = False)
+

Bases: object

+

Specification for a task.

+

From CWL:

+
InlineJavascriptRequirement
+SchemaDefRequirement
+DockerRequirement
+SoftwareRequirement
+InitialWorkDirRequirement
+EnvVarRequirement
+ShellCommandRequirement
+ResourceRequirement
+
+InlineScriptRequirement
+
+
+
+
+container: str | None
+
+ +
+
+network: bool
+
+ +
+
+outdir: str | None
+
+ +
+ +
+
+class pydra.engine.specs.ShellOutSpec(*, return_code: int, stdout: str, stderr: str)
+

Bases: object

+

Output specification of a generic shell process.

+
+
+collect_additional_outputs(inputs, output_dir, outputs)
+
+ +
+
+generated_output_names(inputs, output_dir)
+

Returns a list of all outputs that will be generated by the task. +Takes into account the task input and the requires list for the output fields. +TODO: should be in all Output specs?

+
+ +
+
+return_code: int
+

The process’ exit code.

+
+ +
+
+stderr: str
+

The process’ standard input.

+
+ +
+
+stdout: str
+

The process’ standard output.

+
+ +
+ +
+
+class pydra.engine.specs.ShellSpec(*, executable: str | List[str], args: str | List[str] | None = None)
+

Bases: BaseSpec

+

Specification for a process invoked from a shell.

+
+
+args: str | List[str] | None
+
+ +
+
+check_metadata()
+

Check the metadata for fields in input_spec and fields.

+

Also sets the default values when available and needed.

+
+ +
+
+executable: str | List[str]
+
+ +
+
+retrieve_values(wf, state_index=None)
+

Parse output results.

+
+ +
+ +
+
+class pydra.engine.specs.SpecInfo(*, name: str, fields: List[Tuple] = _Nothing.NOTHING, bases: Sequence[Type[BaseSpec]] = _Nothing.NOTHING)
+

Bases: object

+

Base data structure for metadata of specifications.

+
+
+bases: Sequence[Type[BaseSpec]]
+

Keeps track of specification inheritance. +Should be a tuple containing at least one BaseSpec

+
+ +
+
+fields: List[Tuple]
+

List of names of fields (can be inputs or outputs).

+
+ +
+
+name: str
+

A name for the specification.

+
+ +
+ +
+
+class pydra.engine.specs.StateArray(iterable=(), /)
+

Bases: List[T]

+

an array of values from, or to be split over in an array of nodes (see TaskBase.split()), +multiple nodes of the same task. Used in type-checking to differentiate between list +types and values for multiple nodes

+
+ +
+
+class pydra.engine.specs.TaskHook(*, pre_run_task: ~typing.Callable = <function donothing>, post_run_task: ~typing.Callable = <function donothing>, pre_run: ~typing.Callable = <function donothing>, post_run: ~typing.Callable = <function donothing>)
+

Bases: object

+

Callable task hooks.

+
+
+post_run: Callable
+
+ +
+
+post_run_task: Callable
+
+ +
+
+pre_run: Callable
+
+ +
+
+pre_run_task: Callable
+
+ +
+
+reset()
+
+ +
+ +
+
+pydra.engine.specs.attr_fields(spec, exclude_names=())
+
+ +
+
+pydra.engine.specs.donothing(*args, **kwargs)
+
+ +
+
+pydra.engine.specs.path_to_string(value)
+

Convert paths to strings.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.state.html b/typing-bugfixes/api/pydra.engine.state.html new file mode 100644 index 0000000000..a8272618c5 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.state.html @@ -0,0 +1,598 @@ + + + + + + + pydra.engine.state module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.state module

+

Keeping track of mapping and reduce operations over tasks.

+
+
+class pydra.engine.state.State(name, splitter=None, combiner=None, other_states=None)
+

Bases: object

+

A class that specifies a State of all tasks.

+
+
    +
  • It’s only used when a task have a splitter.

  • +
  • It contains all information about splitter, combiner, final splitter, +and input values for specific task states +(specified by the splitter and the input).

  • +
  • It also contains information about the final groups and the final splitter +if combiner is available.

  • +
+
+
+
+name
+

name of the state that is the same as a name of the task

+
+
Type:
+

str

+
+
+
+ +
+
+splitter
+

can be a str (name of a single input), +tuple for scalar splitter, or list for outer splitter

+
+
Type:
+

str, tuple, list

+
+
+
+ +
+
+splitter_rpn_compact
+

splitter in RPN, using a compact +notation for splitter from previous states, e.g. _NA

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_rpn
+

splitter represented in RPN, +unwrapping splitters from previous states

+
+
Type:
+

list

+
+
+
+ +
+
+combiner
+

list of fields that should be combined +(order is not important)

+
+
Type:
+

list

+
+
+
+ +
+
+splitter_final
+

final splitter that includes the combining process

+
+ +
+
+other_states
+

used to create connections with previous states:

+
{
+  name of a previous state:
+    (previous state, input from current state needed the connection)
+}
+
+
+
+
Type:
+

dict

+
+
+
+ +
+
+inner_inputs
+

used to create connections with previous states +{"{self.name}.input name for current inp": previous state}

+
+
Type:
+

dict

+
+
+
+ +
+
+states_ind
+

dictionary for every state that contains +indices for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+states_val
+

dictionary for every state that contains +values for all state inputs (i.e. inputs that are part of the splitter)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+inputs_ind
+

dictionary for every state that contains +indices for all task inputs (i.e. inputs that are relevant +for current task, can be outputs from previous nodes)

+
+
Type:
+

list of dict

+
+
+
+ +
+
+group_for_inputs
+

specifying groups (axes) for each input field +(depends on the splitter)

+
+
Type:
+

dict

+
+
+
+ +
+
+group_for_inputs_final
+

specifying final groups (axes) +for each input field (depends on the splitter and combiner)

+
+
Type:
+

dict

+
+
+
+ +
+
+groups_stack_final
+

specify stack of groups/axes (used to +determine which field could be combined)

+
+
Type:
+

list

+
+
+
+ +
+
+final_combined_ind_mapping
+

mapping between final indices +after combining and partial indices of the results

+
+
Type:
+

dict

+
+
+
+ +
+
+property combiner
+

the combiner associated to the state.

+
+ +
+
+combiner_validation()
+

validating if the combiner is correct (after all states are connected)

+
+ +
+
+property current_combiner
+

the current part of the combiner, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_combiner_all
+

the current part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property current_splitter
+

the current part of the splitter, +i.e. the part that is related to the current task’s state only +(doesn’t include fields propagated from the previous tasks)

+
+ +
+
+property current_splitter_rpn
+

the current part of the splitter using RPN

+
+ +
+
+property inner_inputs
+

specifies connections between fields from the current state +with the specific state from the previous states, uses dictionary +{input name for current state: the previous state}

+
+ +
+
+property other_states
+

specifies the connections with previous states, uses dictionary: +{name of a previous state: (previous state, input field from current state)}

+
+ +
+
+prepare_inputs()
+

Preparing inputs indices, merges input from previous states.

+

Includes indices for fields from inner splitters +(removes elements connected to the inner splitters fields).

+
+ +
+
+prepare_states(inputs, cont_dim=None)
+

Prepare a full list of state indices and state values.

+
+
State Indices

number of elements depends on the splitter

+
+
State Values

specific elements from inputs that can be used running interfaces

+
+
+
+
Parameters:
+
    +
  • inputs (dict) – inputs of the task

  • +
  • cont_dim (dict or None) – container’s dimensions for a specific input’s fields

  • +
+
+
+
+ +
+
+prepare_states_combined_ind(elements_to_remove_comb)
+

Prepare the final list of dictionaries with indices after combiner.

+
+
Parameters:
+

elements_to_remove_comb (list) – elements of the splitter that should be removed due to the combining

+
+
+
+ +
+
+prepare_states_ind()
+

Calculate a list of dictionaries with state indices.

+

Uses hlpst.splits.

+
+ +
+
+prepare_states_val()
+

Evaluate states values having states indices.

+
+ +
+
+property prev_state_combiner
+

the prev-state part of the combiner, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_combiner_all
+

the prev-state part of the combiner including all the fields +that should be combined (i.e. not only the fields that are explicitly +set, but also the fields that re in the same group/axis and had to be combined +together, e.g., if splitter is (a, b) a and b has to be combined together)

+
+ +
+
+property prev_state_splitter
+

the prev-state part of the splitter, +i.e. the part that comes from the previous tasks’ states

+
+ +
+
+property prev_state_splitter_rpn
+

the prev-state art of the splitter using RPN

+
+ +
+
+property prev_state_splitter_rpn_compact
+

the prev-state part of the splitter using RPN in a compact form, +(without unwrapping the states from previous nodes), e.g. [_NA, _NB, *]

+
+ +
+
+set_input_groups(state_fields=True)
+

Evaluates groups, especially the final groups that address the combiner.

+
+
Parameters:
+

state_fields (bool) – if False the splitter from the previous states are unwrapped

+
+
+
+ +
+
+splits(splitter_rpn)
+

Splits input variable as specified by splitter

+
+
Parameters:
+

splitter_rpn (list) – splitter in RPN notation

+
+
Returns:
+

    +
  • splitter (list) – each element contains indices for input variables

  • +
  • keys (list) – names of input variables

  • +
+

+
+
+
+ +
+
+property splitter
+

Get the splitter of the state.

+
+ +
+
+property splitter_final
+

the final splitter, after removing the combined fields

+
+ +
+
+property splitter_rpn
+

splitter in RPN

+
+ +
+
+property splitter_rpn_compact
+

splitter in RPN +with a compact representation of the prev-state part (i.e. without unwrapping +the part that comes from the previous states), e.g., [_NA, _NB, *]

+
+ +
+
+property splitter_rpn_final
+
+ +
+
+splitter_validation()
+

validating if the splitter is correct (after all states are connected)

+
+ +
+
+update_connections(new_other_states=None, new_combiner=None)
+

updating connections, can use a new other_states and combiner

+
+
Parameters:
+
    +
  • new_other_states (dict, optional) – dictionary with new other_states, will be set before updating connections

  • +
  • new_combiner (str, or list, optional) – new combiner

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.submitter.html b/typing-bugfixes/api/pydra.engine.submitter.html new file mode 100644 index 0000000000..e9f39566cb --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.submitter.html @@ -0,0 +1,264 @@ + + + + + + + pydra.engine.submitter module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.submitter module

+

Handle execution backends.

+
+
+class pydra.engine.submitter.Submitter(plugin: str | Type[Worker] = 'cf', **kwargs)
+

Bases: object

+

Send a task to the execution backend.

+
+
+close()
+

Close submitter.

+

Do not close previously running loop.

+
+ +
+
+async expand_runnable(runnable, wait=False, rerun=False)
+

This coroutine handles state expansion.

+

Removes any states from runnable. If wait is +set to False (default), aggregates all worker +execution coroutines and returns them. If wait is +True, waits for all coroutines to complete / error +and returns None.

+
+
Parameters:
+
    +
  • runnable (pydra Task) – Task instance (Task, Workflow)

  • +
  • wait (bool (False)) – Await all futures before completing

  • +
+
+
Returns:
+

futures – Coroutines for TaskBase execution.

+
+
Return type:
+

set or None

+
+
+
+ +
+
+async expand_workflow(wf, rerun=False)
+

Expand and execute a stateless Workflow. +This method is only reached by Workflow._run_task.

+
+
Parameters:
+

wf (Workflow) – Workflow Task object

+
+
Returns:
+

wf – The computed workflow

+
+
Return type:
+

pydra.engine.core.Workflow

+
+
+
+ +
+
+async submit_from_call(runnable, rerun, environment)
+

This coroutine should only be called once per Submitter call, +and serves as the bridge between sync/async lands.

+

There are 4 potential paths based on the type of runnable: +0) Workflow has a different plugin than a submitter +1) Workflow without State +2) Task without State +3) (Workflow or Task) with State

+

Once Python 3.10 is the minimum, this should probably be refactored into using +structural pattern matching.

+
+ +
+ +
+
+pydra.engine.submitter.get_runnable_tasks(graph)
+

Parse a graph and return all runnable tasks.

+
+ +
+
+pydra.engine.submitter.is_runnable(graph, obj)
+

Check if a task within a graph is runnable.

+
+ +
+
+async pydra.engine.submitter.prepare_runnable_with_state(runnable)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.task.html b/typing-bugfixes/api/pydra.engine.task.html new file mode 100644 index 0000000000..ec92cdfd4f --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.task.html @@ -0,0 +1,306 @@ + + + + + + + pydra.engine.task module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.task module

+

Implement processing nodes.

+
+

Notes:

+
    +
  • Environment specs

    +
    +
      +
    1. neurodocker json

    2. +
    3. singularity file+hash

    4. +
    5. docker hash

    6. +
    7. conda env

    8. +
    9. niceman config

    10. +
    11. environment variables

    12. +
    +
    +
  • +
  • Monitors/Audit

    +
    +
      +
    1. internal monitor

    2. +
    3. external monitor

    4. +
    5. callbacks

    6. +
    +
    +
  • +
  • Resuming

    +
    +
      +
    1. internal tracking

    2. +
    3. external tracking (DMTCP)

    4. +
    +
    +
  • +
  • Provenance

    +
    +
      +
    1. Local fragments

    2. +
    3. Remote server

    4. +
    +
    +
  • +
  • Isolation

    +
    +
      +
    1. Working directory

    2. +
    3. File (copy to local on write)

    4. +
    5. read only file system

    6. +
    +
    +
  • +
  • Original implementation

  • +
+
+
+
+class pydra.engine.task.FunctionTask(func: Callable, audit_flags: AuditFlag = AuditFlag.NONE, cache_dir=None, cache_locations=None, input_spec: SpecInfo | BaseSpec | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: SpecInfo | BaseSpec | None = None, rerun=False, **kwargs)
+

Bases: TaskBase

+

Wrap a Python callable as a task element.

+
+ +
+
+class pydra.engine.task.ShellCommandTask(audit_flags: ~pydra.utils.messenger.AuditFlag = AuditFlag.NONE, cache_dir=None, input_spec: ~pydra.engine.specs.SpecInfo | None = None, cont_dim=None, messenger_args=None, messengers=None, name=None, output_spec: ~pydra.engine.specs.SpecInfo | None = None, rerun=False, strip=False, environment=<pydra.engine.environments.Native object>, **kwargs)
+

Bases: TaskBase

+

Wrap a shell command as a task element.

+
+
+DEFAULT_COPY_COLLATION = 2
+
+ +
+
+property cmdline
+

Get the actual command line that will be submitted +Returns a list if the task has a state.

+
+ +
+
+command_args(root=None)
+

Get command line arguments

+
+ +
+
+get_bindings(root: str | None = None) dict[str, tuple[str, str]]
+

Return bindings necessary to run task in an alternative root.

+

This is primarily intended for contexts when a task is going +to be run in a container with mounted volumes.

+
+
Parameters:
+

root (str)

+
+
Returns:
+

bindings – Mapping from paths in the host environment to the target environment

+
+
Return type:
+

dict

+
+
+
+ +
+
+input_spec = None
+
+ +
+
+output_spec = None
+
+ +
+ +
+
+pydra.engine.task.split_cmd(cmd: str)
+

Splits a shell command line into separate arguments respecting quotes

+
+
Parameters:
+

cmd (str) – Command line string or part thereof

+
+
Returns:
+

the command line string split into process args

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.engine.workers.html b/typing-bugfixes/api/pydra.engine.workers.html new file mode 100644 index 0000000000..0fef7c82f0 --- /dev/null +++ b/typing-bugfixes/api/pydra.engine.workers.html @@ -0,0 +1,514 @@ + + + + + + + pydra.engine.workers module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.engine.workers module

+

Execution workers.

+
+
+class pydra.engine.workers.ConcurrentFuturesWorker(n_procs=None)
+

Bases: Worker

+

A worker to execute in parallel using Python’s concurrent futures.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_as_coro(runnable, rerun=False, environment=None)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'cf'
+
+ +
+
+run_el(runnable, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DaskWorker(**kwargs)
+

Bases: Worker

+

A worker to execute in parallel using Dask.distributed. +This is an experimental implementation with limited testing.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_dask(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+ +
+
+plugin_name = 'dask'
+
+ +
+
+run_el(runnable, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.DistributedWorker(loop=None, max_jobs=None)
+

Bases: Worker

+

Base Worker for distributed execution.

+
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+

Limits number of submissions based on +py:attr:DistributedWorker.max_jobs.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+max_jobs
+

Maximum number of concurrently running jobs.

+
+ +
+ +
+
+class pydra.engine.workers.PsijLocalWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J on the local machine.

+
+
+plugin_name = 'psij-local'
+
+ +
+
+subtype = 'local'
+
+ +
+ +
+
+class pydra.engine.workers.PsijSlurmWorker(**kwargs)
+

Bases: PsijWorker

+

A worker to execute tasks using PSI/J using SLURM.

+
+
+plugin_name = 'psij-slurm'
+
+ +
+
+subtype = 'slurm'
+
+ +
+ +
+
+class pydra.engine.workers.PsijWorker(**kwargs)
+

Bases: Worker

+

A worker to execute tasks using PSI/J.

+
+
+close()
+

Finalize the internal pool of tasks.

+
+ +
+
+async exec_psij(runnable, rerun=False)
+

Run a task (coroutine wrapper).

+
+
Raises:
+

Exception – If stderr is not empty.

+
+
Return type:
+

None

+
+
+
+ +
+
+make_job(spec, attributes)
+

Create a PSI/J job.

+
+
Parameters:
+
    +
  • spec (psij.JobSpec) – PSI/J job specification.

  • +
  • attributes (any) – Job attributes.

  • +
+
+
Returns:
+

PSI/J job.

+
+
Return type:
+

psij.Job

+
+
+
+ +
+
+make_spec(cmd=None, arg=None)
+

Create a PSI/J job specification.

+
+
Parameters:
+
    +
  • cmd (str, optional) – Executable command. Defaults to None.

  • +
  • arg (list, optional) – List of arguments. Defaults to None.

  • +
+
+
Returns:
+

PSI/J job specification.

+
+
Return type:
+

psij.JobSpec

+
+
+
+ +
+
+run_el(interface, rerun=False, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SGEWorker(loop=None, max_jobs=None, poll_delay=1, qsub_args=None, write_output_files=True, max_job_array_length=50, indirect_submit_host=None, max_threads=None, poll_for_result_file=True, default_threads_per_task=1, polls_before_checking_evicted=60, collect_jobs_delay=30, default_qsub_args='', max_mem_free=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+async check_for_results_files(jobid, threads_requested)
+
+ +
+
+async get_output_by_task_pkl(task_pkl)
+
+ +
+
+async get_tasks_to_run(task_qsub_args, mem_free)
+
+ +
+
+plugin_name = 'sge'
+
+ +
+
+run_el(runnable, rerun=False)
+

Worker submission API.

+
+ +
+
+async submit_array_job(sargs, tasks_to_run, error_file)
+
+ +
+ +
+
+class pydra.engine.workers.SerialWorker(**kwargs)
+

Bases: Worker

+

A worker to execute linearly.

+
+
+close()
+

Return whether the task is finished.

+
+ +
+
+async exec_serial(runnable, rerun=False, environment=None)
+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+plugin_name = 'serial'
+
+ +
+
+run_el(interface, rerun=False, environment=None, **kwargs)
+

Run a task.

+
+ +
+ +
+
+class pydra.engine.workers.SlurmWorker(loop=None, max_jobs=None, poll_delay=1, sbatch_args=None)
+

Bases: DistributedWorker

+

A worker to execute tasks on SLURM systems.

+
+
+plugin_name = 'slurm'
+
+ +
+
+run_el(runnable, rerun=False, environment=None)
+

Worker submission API.

+
+ +
+ +
+
+class pydra.engine.workers.Worker(loop=None)
+

Bases: object

+

A base class for execution of tasks.

+
+
+close()
+

Close this worker.

+
+ +
+
+async fetch_finished(futures)
+

Awaits asyncio’s asyncio.Task until one is finished.

+
+
Parameters:
+

futures (set of asyncio awaitables) – Task execution coroutines or asyncio asyncio.Task

+
+
Returns:
+

pending – Pending asyncio asyncio.Task.

+
+
Return type:
+

set

+
+
+
+ +
+
+run_el(interface, **kwargs)
+

Return coroutine for task execution.

+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.mark.functions.html b/typing-bugfixes/api/pydra.mark.functions.html new file mode 100644 index 0000000000..e298889ef1 --- /dev/null +++ b/typing-bugfixes/api/pydra.mark.functions.html @@ -0,0 +1,200 @@ + + + + + + + pydra.mark.functions module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark.functions module

+

Decorators to apply to functions used in Pydra workflows

+
+
+pydra.mark.functions.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.functions.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.mark.html b/typing-bugfixes/api/pydra.mark.html new file mode 100644 index 0000000000..f6df7c498c --- /dev/null +++ b/typing-bugfixes/api/pydra.mark.html @@ -0,0 +1,206 @@ + + + + + + + pydra.mark package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.mark package

+
+
+pydra.mark.annotate(annotation)
+

Update the annotation of a function.

+

Example

+
>>> import pydra
+>>> @pydra.mark.annotate({'a': int, 'return': float})
+... def square(a):
+...     return a ** 2.0
+
+
+
+ +
+
+pydra.mark.task(func)
+

Promote a function to a FunctionTask.

+

Example

+
>>> import pydra
+>>> @pydra.mark.task
+... def square(a: int) -> float:
+...     return a ** 2.0
+
+
+
+ +
+

Submodules

+ +
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.tasks.html b/typing-bugfixes/api/pydra.tasks.html new file mode 100644 index 0000000000..9710052305 --- /dev/null +++ b/typing-bugfixes/api/pydra.tasks.html @@ -0,0 +1,171 @@ + + + + + + + pydra.tasks package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.tasks package

+

Pydra tasks

+

The pydra.tasks namespace is reserved for collections of Tasks, to be managed and +packaged separately. +To create a task package, please fork the pydra-tasks-template.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.hash.html b/typing-bugfixes/api/pydra.utils.hash.html new file mode 100644 index 0000000000..ced9bea2d8 --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.hash.html @@ -0,0 +1,271 @@ + + + + + + + pydra.utils.hash module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.hash module

+

Generic object hashing dispatch

+
+
+class pydra.utils.hash.Cache(persistent: Path | str | PersistentCache | None = None, hashes: Dict[int, Hash] = _Nothing.NOTHING)
+

Bases: object

+

Cache for hashing objects, used to avoid infinite recursion caused by circular +references between objects, and to store hashes of objects that have already been +hashed to avoid recomputation.

+

This concept is extended to persistent caching of hashes for certain object types, +for which calculating the hash is a potentially expensive operation (e.g. +File/Directory types). For these classes the bytes_repr override function yields a +“locally unique cache key” (e.g. file-system path + mtime) as the first item of its +iterator.

+
+
+persistent: PersistentCache | None
+
+ +
+ +
+
+pydra.utils.hash.bytes_repr_mapping_contents(mapping: Mapping, cache: Cache) Iterator[bytes]
+

Serialize the contents of a mapping

+

Concatenates byte-serialized keys and hashed values.

+
>>> from pydra.utils.hash import bytes_repr_mapping_contents, Cache
+>>> generator = bytes_repr_mapping_contents({"a": 1, "b": 2}, Cache())
+>>> b''.join(generator)
+b'str:1:a=...str:1:b=...'
+
+
+
+ +
+
+pydra.utils.hash.bytes_repr_sequence_contents(seq: Sequence, cache: Cache) Iterator[bytes]
+

Serialize the contents of a sequence

+

Concatenates hashed values.

+
>>> from pydra.utils.hash import bytes_repr_sequence_contents, Cache
+>>> generator = bytes_repr_sequence_contents([1, 2], Cache())
+>>> list(generator)
+[b'm...', b'£...']
+
+
+
+ +
+
+pydra.utils.hash.hash_function(obj, **kwargs)
+

Generate hash of object.

+
+ +
+
+pydra.utils.hash.hash_object(obj: object, cache: Cache | None = None, persistent_cache: PersistentCache | Path | None = None) Hash
+

Hash an object

+

Constructs a byte string that uniquely identifies the object, +and returns the hash of that string.

+

Base Python types are implemented, including recursive lists and +dicts. Custom types can be registered with register_serializer().

+
+ +
+
+pydra.utils.hash.hash_single(obj: object, cache: Cache) Hash
+

Single object-scoped hash

+

Uses a local cache to prevent infinite recursion. This cache is unsafe +to reuse across multiple objects, so this function should not be used directly.

+
+ +
+
+pydra.utils.hash.register_serializer(cls, func=None)
+

Register a custom serializer for a type

+

The generator function should yield byte strings that will be hashed +to produce the final hash. A recommended convention is to yield a +qualified type prefix (e.g. f"{module}.{class}"), +followed by a colon, followed by the serialized value.

+

If serializing an iterable, an open and close bracket may be yielded +to identify the start and end of the iterable.

+

Consider using bytes_repr_mapping_contents() and +bytes_repr_sequence_contents() to serialize the contents of a mapping +or sequence. These do not include the prefix or brackets, so they can be +reused as part of a custom serializer.

+

As an example, the following example is the default serializer for user-defined +classes:

+
@register_serializer
+def bytes_repr(obj: object, cache: Cache) -> Iterator[bytes]:
+    cls = obj.__class__
+    yield f"{cls.__module__}.{cls.__name__}:{{".encode()
+    yield from bytes_repr_mapping_contents(obj.__dict__, cache)
+    yield b"}"
+
+
+

Serializers must accept a cache argument, which is a dictionary that +permits caching of hashes for recursive objects. If the hash of sub-objects +is used to create an object serialization, the hash_single() function +should be called with the same cache object.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.html b/typing-bugfixes/api/pydra.utils.html new file mode 100644 index 0000000000..53c097189d --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.html @@ -0,0 +1,182 @@ + + + + + + + pydra.utils package — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.messenger.html b/typing-bugfixes/api/pydra.utils.messenger.html new file mode 100644 index 0000000000..6335191a21 --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.messenger.html @@ -0,0 +1,375 @@ + + + + + + + pydra.utils.messenger module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.messenger module

+

Messaging of states.

+
+
+class pydra.utils.messenger.AuditFlag(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: Flag

+

Auditing flags.

+
+
+ALL = 3
+

Track provenance and resource utilization.

+
+ +
+
+NONE = 0
+

Do not track provenance or monitor resources.

+
+ +
+
+PROV = 1
+

Track provenance only.

+
+ +
+
+RESOURCE = 2
+

Monitor resource utilization only.

+
+ +
+ +
+
+class pydra.utils.messenger.FileMessenger
+

Bases: Messenger

+

A messenger that redirects to a file.

+
+
+send(message, append=True, **kwargs)
+

Append message to file.

+
+
Parameters:
+
    +
  • message (dict) – The message to be printed.

  • +
  • append (bool) – Do not truncate file when opening (i.e. append to it).

  • +
+
+
Returns:
+

Returns the unique identifier used in the file’s name.

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.Messenger
+

Bases: object

+

Base messenger class.

+
+
+abstract send(message, **kwargs)
+

Send a message.

+
+ +
+ +
+
+class pydra.utils.messenger.PrintMessenger
+

Bases: Messenger

+

A messenger that redirects to standard output.

+
+
+send(message, **kwargs)
+

Send the message to standard output.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RemoteRESTMessenger
+

Bases: Messenger

+

A messenger that redirects to remote REST endpoint.

+
+
+send(message, **kwargs)
+

Append message to file.

+
+
Parameters:
+

message (dict) – The message to be printed.

+
+
Returns:
+

The status code from the request.post

+
+
Return type:
+

int

+
+
+
+ +
+ +
+
+class pydra.utils.messenger.RuntimeHooks(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
+

Bases: IntEnum

+

Allowed points to hook into the process.

+
+
+resource_monitor_post_stop = 4
+
+ +
+
+resource_monitor_pre_start = 3
+
+ +
+
+task_execute_post_exit = 6
+
+ +
+
+task_execute_pre_entry = 5
+
+ +
+
+task_run_entry = 1
+
+ +
+
+task_run_exit = 2
+
+ +
+ +
+
+pydra.utils.messenger.collect_messages(collected_path, message_path, ld_op='compact')
+

Compile all messages into a single provenance graph.

+
+
Parameters:
+
    +
  • collected_path (os.pathlike) – A place to write all of the collected messages. (?TODO)

  • +
  • message_path (os.pathlike) – A path with the message file (?TODO)

  • +
  • ld_op (str, optional) – Option used by pld.jsonld

  • +
+
+
+
+ +
+
+pydra.utils.messenger.gen_uuid()
+

Generate a unique identifier.

+
+ +
+
+pydra.utils.messenger.make_message(obj, context=None)
+

Build a message using the specific context

+
+
Parameters:
+
    +
  • obj (dict) – A dictionary containing the non-context information of a message record.

  • +
  • context (dict, optional) – Dictionary with the link to the context file or containing a JSON-LD context.

  • +
+
+
Returns:
+

The message with the context.

+
+
Return type:
+

dict

+
+
+
+ +
+
+pydra.utils.messenger.now()
+

Get a formatted timestamp.

+
+ +
+
+pydra.utils.messenger.send_message(message, messengers=None, **kwargs)
+

Send NIDM messages for logging provenance and auditing.

+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.misc.html b/typing-bugfixes/api/pydra.utils.misc.html new file mode 100644 index 0000000000..751c126009 --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.misc.html @@ -0,0 +1,196 @@ + + + + + + + pydra.utils.misc module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.misc module

+
+
+pydra.utils.misc.add_exc_note(e: Exception, note: str) Exception
+

Adds a note to an exception in a Python <3.11 compatible way

+
+
Parameters:
+
    +
  • e (Exception) – the exception to add the note to

  • +
  • note (str) – the note to add

  • +
+
+
Returns:
+

returns the exception again

+
+
Return type:
+

Exception

+
+
+
+ +
+
+pydra.utils.misc.exc_info_matches(exc_info, match, regex=False)
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.profiler.html b/typing-bugfixes/api/pydra.utils.profiler.html new file mode 100644 index 0000000000..0adf7eeb36 --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.profiler.html @@ -0,0 +1,247 @@ + + + + + + + pydra.utils.profiler module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.profiler module

+

Utilities to keep track of performance and resource utilization.

+
+
+class pydra.utils.profiler.ResourceMonitor(pid, interval=5, logdir=None, fname=None)
+

Bases: Thread

+

A thread to monitor a specific PID with a certain frequency to a file.

+
+
+property fname
+

Get/set the internal filename.

+
+ +
+
+run()
+

Core monitoring function, called by start().

+
+ +
+
+stop()
+

Stop monitoring.

+
+ +
+ +
+
+pydra.utils.profiler.get_max_resources_used(pid, mem_mb, num_threads, pyfunc=False)
+

Get the RAM and threads utilized by a given process.

+
+
Parameters:
+
    +
  • pid (integer) – the process ID of process to profile

  • +
  • mem_mb (float) – the high memory watermark so far during process execution (in MB)

  • +
  • num_threads (int) – the high thread watermark so far during process execution

  • +
+
+
Returns:
+

    +
  • mem_mb (float) – the new high memory watermark of process (MB)

  • +
  • num_threads (float) – the new high thread watermark of process

  • +
+

+
+
+
+ +
+
+pydra.utils.profiler.get_system_total_memory_gb()
+

Get the total RAM of the running system, in GB.

+
+ +
+
+pydra.utils.profiler.log_nodes_cb(node, status)
+

Record node run statistics to a log file as json dictionaries.

+
+
Parameters:
+
    +
  • node (nipype.pipeline.engine.Node) – the node being logged

  • +
  • status (string) – acceptable values are ‘start’, ‘end’; otherwise it is +considered and error

  • +
+
+
Returns:
+

this function does not return any values, it logs the node +status info to the callback logger

+
+
Return type:
+

None

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/api/pydra.utils.typing.html b/typing-bugfixes/api/pydra.utils.typing.html new file mode 100644 index 0000000000..81da126b1f --- /dev/null +++ b/typing-bugfixes/api/pydra.utils.typing.html @@ -0,0 +1,487 @@ + + + + + + + pydra.utils.typing module — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

pydra.utils.typing module

+
+
+class pydra.utils.typing.TypeParser(tp, coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>)), not_coercible: ~typing.Iterable[~typing.Tuple[type | ~typing.Any, type | ~typing.Any]] | None = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>)), superclass_auto_cast: bool = False, label: str = '', match_any_of_union: bool = False)
+

Bases: Generic[T]

+

A callable which can be used as a converter for attrs.fields to check whether an +object or LazyField matches the specified field type, or can be +coerced into it (given the criteria passed on initialisation of the checker). +Nested container type are expanded and each of their type args are checked/coerced +against corresponding parts of the object.

+
+
Parameters:
+
    +
  • tp (type) – the type objects will be coerced to

  • +
  • coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – limits coercing between the pairs of types where they appear within the +tree of more complex nested container types. If None, then all types are +coercible except explicitly excluded

  • +
  • not_coercible (Iterable[ty.Tuple[type or Any, type or Any]], optional) – excludes the limits coercing between the pairs of types where they appear within +the tree of more complex nested container types. Overrides ‘coercible’ to enable +you to carve out exceptions, such as TypeParser(list, coercible=[(ty.Iterable, list)], +not_coercible=[(str, list)])

  • +
  • superclass_auto_cast (bool) – Allow lazy fields to pass the type check if their types are superclasses of the +specified pattern (instead of matching or being subclasses of the pattern)

  • +
  • label (str) – the label to be used to identify the type parser in error messages. Especially +useful when TypeParser is used as a converter in attrs.fields

  • +
  • match_any_of_union (bool) – match if any of the options in the union are a subclass (but not necessarily all)

  • +
+
+
+
+
+COERCIBLE_DEFAULT: Tuple[Tuple[type, type], ...] = ((typing.Sequence, typing.Sequence), (typing.Mapping, typing.Mapping), (<class 'pathlib.Path'>, <class 'os.PathLike'>), (<class 'str'>, <class 'os.PathLike'>), (<class 'os.PathLike'>, <class 'pathlib.Path'>), (<class 'os.PathLike'>, <class 'str'>), (typing.Any, <class 'pydra.engine.specs.MultiInputObj'>), (<class 'int'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'float'>), (<class 'int'>, <class 'fileformats.field.Decimal'>), (<class 'fileformats.field.Boolean'>, <class 'bool'>), (<class 'fileformats.field.Decimal'>, <class 'float'>), (<class 'fileformats.field.Integer'>, <class 'int'>), (<class 'fileformats.field.Text'>, <class 'str'>), (<class 'bool'>, <class 'fileformats.field.Boolean'>), (<class 'float'>, <class 'fileformats.field.Decimal'>), (<class 'int'>, <class 'fileformats.field.Integer'>), (<class 'str'>, <class 'fileformats.field.Text'>))
+
+ +
+
+NOT_COERCIBLE_DEFAULT = ((<class 'str'>, typing.Sequence), (typing.Sequence, <class 'str'>))
+
+ +
+
+classmethod apply_to_instances(target_type: Type[Any], func: Callable, value: Any, cache: Dict[int, Any] | None = None) Any
+

Applies a function to all instances of the given type that are potentially +nested within the given value, caching previously computed modifications to +handle repeated elements

+
+
Parameters:
+
    +
  • target_type (type) – the target type to apply the function to

  • +
  • func (callable) – the callable object (e.g. function) to apply to the instances

  • +
  • value (Any) – the value to copy files from (if required)

  • +
  • cache (dict, optional) – guards against multiple references to the same objects by keeping a cache of +the modified

  • +
+
+
+
+ +
+
+check_coercible(source: Any, target: type | Any)
+

Checks whether the source object is coercible to the target type given the coercion +rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (object) – the object to be coerced

  • +
  • target (type or typing.Any) – the target type for the object to be coerced to

  • +
+
+
Raises:
+

TypeError – If the object cannot be coerced into the target type depending on the explicit + inclusions and exclusions set in the coercible and not_coercible member attrs

+
+
+
+ +
+
+check_type(type_: Type[Any])
+

Checks the given type to see whether it matches or is a subtype of the +specified type or whether coercion rule is specified between the types

+
+
Parameters:
+

type_ (ty.Type[ty.Any]) – the type to check whether it is coercible into the specified type

+
+
Raises:
+

TypeError – if the type is not either the specified type, a sub-type or coercible to it

+
+
+
+ +
+
+check_type_coercible(source: type | Any, target: type | Any, source_repr: str | None = None)
+

Checks whether the source type is coercible to the target type +given the coercion rules defined in the coercible and not_coercible attrs

+
+
Parameters:
+
    +
  • source (type or typing.Any) – source type to be coerced

  • +
  • target (type or typing.Any) – target type for the source to be coerced to

  • +
+
+
Raises:
+

TypeError – If the source type cannot be coerced into the target type depending on the + explicit inclusions and exclusions set in the coercible and not_coercible + member attrs

+
+
+
+ +
+
+coerce(object_: Any) T
+

Attempts to coerce the given object to the type of the specified type

+
+ +
+
+coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod contains_type(target: Type[Any], type_: Type[Any])
+

Checks a potentially nested type for sub-classes of the target type

+
+
Parameters:
+
    +
  • target (type) – the target type to check for sub-classes of

  • +
  • type_ (type) – the type to check for nested types that are sub-classes of target

  • +
+
+
+
+ +
+
+static get_args(tp)
+

Get type arguments with all substitutions performed.

+

For unions, basic simplifications used by Union constructor are performed.

+

Examples:

+
>>> T = TypeVar('T')
+>>> assert get_args(Dict[str, int]) == (str, int)
+>>> assert get_args(int) == ()
+>>> assert get_args(Union[int, Union[T, int], str][int]) == (int, str)
+>>> assert get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+>>> assert get_args(Callable[[], T][int]) == ([], int)
+
+
+
+ +
+
+classmethod get_item_type(sequence_type: Type[Sequence[T]]) Type[T] | Any
+

Return the type of the types of items in a sequence type

+
+
Parameters:
+

sequence_type (type[Sequence]) – the type to find the type of the items of

+
+
Returns:
+

item_type – the type of the items

+
+
Return type:
+

type or None

+
+
+
+ +
+
+static get_origin(tp)
+

Get the unsubscripted version of a type.

+

This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar, +Annotated, and others. Return None for unsupported types.

+

Examples:

+
>>> P = ParamSpec('P')
+>>> assert get_origin(Literal[42]) is Literal
+>>> assert get_origin(int) is None
+>>> assert get_origin(ClassVar[int]) is ClassVar
+>>> assert get_origin(Generic) is Generic
+>>> assert get_origin(Generic[T]) is Generic
+>>> assert get_origin(Union[T, int]) is Union
+>>> assert get_origin(List[Tuple[T, T]][int]) is list
+>>> assert get_origin(P.args) is P
+
+
+
+ +
+
+classmethod is_instance(obj: object, candidates: Type[Any] | Sequence[Type[Any]] | None) bool
+

Checks whether the object is an instance of cls or that cls is typing.Any, +extending the built-in isinstance to check nested type args

+
+
Parameters:
+
    +
  • obj (object) – the object to check whether it is an instance of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
+
+
+
+ +
+
+classmethod is_subclass(klass: Type[Any], candidates: Type[Any] | Sequence[Type[Any]], any_ok: bool = False) bool
+

Checks whether the class a is either the same as b, a subclass of b or b is +typing.Any, extending built-in issubclass to check nested type args

+
+
Parameters:
+
    +
  • klass (type) – the klass to check whether it is a subclass of one of the candidates

  • +
  • candidates (type or ty.Iterable[type]) – the candidate types to check the object against

  • +
  • any_ok (bool) – whether klass=typing.Any should return True or False

  • +
+
+
+
+ +
+
+label: str
+
+ +
+
+property label_str
+
+ +
+
+match_any_of_union: bool
+
+ +
+
+classmethod matches(obj: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+classmethod matches_type(type_: Type[Any], target: Type[Any], **kwargs) bool
+

Returns true if the provided type matches the pattern of the TypeParser

+
+
Parameters:
+
    +
  • type_ (type) – the type to check

  • +
  • target (type) – the target type to check against

  • +
  • **kwargs (dict[str, Any], optional) – passed on to TypeParser.__init__

  • +
+
+
Returns:
+

matches – whether the type matches the target type factoring in sub-classes and coercible +pairs

+
+
Return type:
+

bool

+
+
+
+ +
+
+not_coercible: List[Tuple[type | Any, type | Any]]
+
+ +
+
+classmethod strip_splits(type_: Type[Any]) Tuple[Type, int]
+

Strips any StateArray types from the outside of the specified type and returns +the stripped type and the depth it was found at

+
+
Parameters:
+
    +
  • type_ (ty.Type[ty.Any]) – the type to list the nested sequences of

  • +
  • only_splits (bool, optional) – whether to only return nested splits, not all sequence types

  • +
+
+
Returns:
+

    +
  • inner_type (type) – the inner type once all outer sequences are stripped

  • +
  • depth (int) – the number of splits outside the inner_type

  • +
+

+
+
+
+ +
+
+superclass_auto_cast: bool
+
+ +
+
+tp: Type[T]
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/changes.html b/typing-bugfixes/changes.html new file mode 100644 index 0000000000..cca7c64353 --- /dev/null +++ b/typing-bugfixes/changes.html @@ -0,0 +1,325 @@ + + + + + + + Release Notes — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Release Notes

+
+

0.8.0

+
    +
  • refactoring template formatting for input_spec

  • +
  • fixing issues with input fields with extension (and using them in templates)

  • +
  • adding simple validators to input spec (using attr.validator)

  • +
  • adding create_dotfile for workflows, that creates graphs as dotfiles (can convert to other formats if dot available)

  • +
  • adding a simple user guide with input_spec description

  • +
  • expanding docstrings for State, audit and messenger

  • +
  • updating syntax to newer python

  • +
+
+
+

0.7.0

+
    +
  • refactoring the error handling by padra: improving raised errors, removing nodes from the workflow graph that can’t be run

  • +
  • refactoring of the input_spec: adapting better to the nipype interfaces

  • +
  • switching from pkg_resources.declare_namespace to the stdlib pkgutil.extend_path

  • +
  • moving readme to rst format

  • +
+
+
+

0.6.2

+
    +
  • Use pkgutil to declare pydra.tasks as a namespace package, ensuring better support for +editable mode.

  • +
+
+
+

0.6.1

+
    +
  • Add pydra.tasks namespace package to enable separate packages of Tasks to be +installed into pydra.tasks.

  • +
  • Raise error when task or workflow name conflicts with names of attributes, methods, or +other tasks already added to workflow

  • +
  • Mention requirements.txt in README

  • +
+
+
+

0.6

+
    +
  • removing the tutorial to a separate repo

  • +
  • adding windows tests to codecov

  • +
  • accepting None as a valid output from a FunctionTask, also for function that returns multiple values

  • +
  • fixing slurm error files

  • +
  • adding wf._connection to checksum

  • +
  • allowing for updates of wf._connections

  • +
  • editing output, so it works with numpy.arrays

  • +
  • removing to_job and pickling task instead (workers read the tasks and set the proper input, so the multiple copies of the input are not kept in the memory)

  • +
  • adding standalone function load_and_run that can load and run a task from a pickle file

  • +
  • removing create_pyscript and simplifying the slurm worker

  • +
  • improving error reports in errors flies

  • +
  • fixing make_class so the Output is properly formatted

  • +
+
+
+

0.5

+
    +
  • fixing hash_dir function

  • +
  • adding get_available_cpus to get the number of CPUs available to the current process or available on the system

  • +
  • adding simple implementation for BoshTask that uses boutiques descriptor

  • +
  • adding azure to CI

  • +
  • fixing code for windows

  • +
  • etelementry updates

  • +
  • adding more verbose output for task result - returns values or indices for input fields

  • +
  • adding an experimental implementation of Dask Worker (limited testing with ci)

  • +
+
+
+

0.4

+
    +
  • reorganization of the State class, fixing small issues with the class

  • +
  • fixing some paths issues on windows os

  • +
  • adding osx and window sto the travis runs (right now allowing for failures for windows)

  • +
  • adding PydraStateError for exception in the State class

  • +
  • small fixes to the hashing functions, adding more tests

  • +
  • adding hash_dir to calculate hash for Directory type

  • +
+
+
+

0.3.1

+
    +
  • passing wf.cache_locations to the task

  • +
  • using rerun from submitter to all task

  • +
  • adding test_rerun and propagate_rerun for workflows

  • +
  • fixing task with a full combiner

  • +
  • adding cont_dim to specify dimensionality of the input variables (how much the input is nested)

  • +
+
+
+

0.3

+
    +
  • adding sphinx documentation

  • +
  • moving from dataclasses to attrs

  • +
  • adding container flag to the ShellCommandTask

  • +
  • fixing cmdline, command_args and container_args for tasks with states

  • +
  • adding CONTRIBUTING.md

  • +
  • fixing hash calculations for inputs with a list of files

  • +
  • using attr.NOTHING for input that is not set

  • +
+
+
+

0.2.2

+
    +
  • supporting tuple as a single element of an input

  • +
+
+
+

0.2.1

+
    +
  • fixing: nodes with states and input fields (from splitter) that are empty were failing

  • +
+
+
+

0.2

+
    +
  • +
    big changes in ShellTask, DockerTask and SingularityTask
      +
    • customized input specification and output specification for Tasks

    • +
    • adding singularity checks to Travis CI

    • +
    • binding all input files to the container

    • +
    +
    +
    +
  • +
  • +
    changes in Workflow
      +
    • passing all outputs to the next node: lzout.all_

    • +
    • fixing inner splitter

    • +
    +
    +
    +
  • +
  • allowing for splitter and combiner updates

  • +
  • adding etelementry support

  • +
+
+
+

0.1

+
    +
  • Core dataflow creation and management API

  • +
  • +
    Distributed workers:
      +
    • concurrent futures

    • +
    • SLURM

    • +
    +
    +
    +
  • +
  • Notebooks for Pydra concepts

  • +
+
+
+

0.0.1

+

Initial Pydra Dataflow Engine release.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/combiner.html b/typing-bugfixes/combiner.html new file mode 100644 index 0000000000..eb6860e9e7 --- /dev/null +++ b/typing-bugfixes/combiner.html @@ -0,0 +1,207 @@ + + + + + + + Grouping Task’s Output — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Grouping Task’s Output

+

In addition to the splitting the input, Pydra supports grouping +or combining the output resulting from the splits. +In order to achieve this for a Task, a user can specify a combiner. +This can be set by calling combine method. +Note, the combiner only makes sense when a splitter is +set first. When combiner=x, all values are combined together within one list, +and each element of the list represents an output of the Task for the specific +value of the input x. Splitting and combining for this example can be written +as follows:

+
+\[\begin{split}S = x &:& ~x=[x_1, x_2, ..., x_n] \mapsto x=x_1, x=x_2, ..., x=x_n, \\ +C = x &:& ~out(x_1), ...,out(x_n) \mapsto out_{comb}=[out(x_1), ...out(x_n)],\end{split}\]
+

where S represents the splitter, C represents the combiner, \(x\) is the input field, +\(out(x_i)\) represents the output of the Task for \(x_i\), and \(out_{comb}\) +is the final output after applying the combiner.

+

In the situation where input has multiple fields and an outer splitter is used, +there are various ways of combining the output. +Taking as an example the task from the previous section, +user might want to combine all the outputs for one specific value of \(x_i\) and +all the values of \(y\). +In this situation, the combined output would be a two dimensional list, each +inner list for each value of \(x\). This can be written as follow:

+
+\[\begin{split}C = y &:& ~out(x_1, y1), out(x_1, y2), ...out(x_n, y_m) \\ +&\longmapsto& ~[[out(x_1, y_1), ..., out(x_1, y_m)], \\ +&& ~..., \\ +&& ~[out(x_n, y_1), ..., out(x_n, y_m)]].\end{split}\]
+
+_images/nd_spl_3_comb1.png +
+

However, for the same task the user might want to combine +all values of \(x\) for specific values of \(y\). +One may also need to combine all the values together. +This can be achieved by providing a list of fields, \([x, y]\) to the combiner. +When a full combiner is set, i.e. all the fields from +the splitter are also in the combiner, the output is a one dimensional list:

+
+\[C = [x, y] : out(x_1, y1), ...out(x_n, y_m) \longmapsto [out(x_1, y_1), ..., out(x_n, y_m)].\]
+
+_images/nd_spl_3_comb3.png +
+

These are the basic examples of the Pydra’s splitter-combiner concept. It +is important to note, that Pydra allows for mixing splitters and combiners +on various levels of a dataflow. They can be set on a single Task or a Workflow. +They can be passed from one Task to following Tasks within the Workflow.

+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/components.html b/typing-bugfixes/components.html new file mode 100644 index 0000000000..9600d189b1 --- /dev/null +++ b/typing-bugfixes/components.html @@ -0,0 +1,338 @@ + + + + + + + Dataflows Components: Task and Workflow — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Dataflows Components: Task and Workflow

+

A Task is the basic runnable component of Pydra and is described by the +class TaskBase. A Task has named inputs and outputs, thus allowing +construction of dataflows. It can be hashed and executes in a specific working +directory. Any Pydra’s Task can be used as a function in a script, thus allowing +dual use in Pydra’s Workflows and in standalone scripts. There are several +classes that inherit from TaskBase and each has a different application:

+
+

Function Tasks

+
    +
  • FunctionTask is a Task that executes Python functions. Most Python functions +declared in an existing library, package, or interactively in a terminal can +be converted to a FunctionTask by using Pydra’s decorator - mark.task.

    +
    import numpy as np
    +from pydra import mark
    +fft = mark.annotate({'a': np.ndarray,
    +                 'return': float})(np.fft.fft)
    +fft_task = mark.task(fft)()
    +result = fft_task(a=np.random.rand(512))
    +
    +
    +

    fft_task is now a Pydra Task and result will contain a Pydra’s Result object. +In addition, the user can use Python’s function annotation or another Pydra +decorator — mark.annotate in order to specify the output. In the +following example, we decorate an arbitrary Python function to create named +outputs:

    +
    @mark.task
    +@mark.annotate(
    +    {"return": {"mean": float, "std": float}}
    +)
    +def mean_dev(my_data):
    +    import statistics as st
    +    return st.mean(my_data), st.stdev(my_data)
    +
    +result = mean_dev(my_data=[...])()
    +
    +
    +

    When the Task is executed result.output will contain two attributes: mean +and std. Named attributes facilitate passing different outputs to +different downstream nodes in a dataflow.

    +
  • +
+
+
+

Shell Command Tasks

+
    +
  • ShellCommandTask is a Task used to run shell commands and executables. +It can be used with a simple command without any arguments, or with specific +set of arguments and flags, e.g.:

    +
    ShellCommandTask(executable="pwd")
    +
    +ShellCommandTask(executable="ls", args="my_dir")
    +
    +
    +

    The Task can accommodate more complex shell commands by allowing the user to +customize inputs and outputs of the commands. +One can generate an input +specification to specify names of inputs, positions in the command, types of +the inputs, and other metadata. +As a specific example, FSL’s BET command (Brain +Extraction Tool) can be called on the command line as:

    +
    bet input_file output_file -m
    +
    +
    +

    Each of the command argument can be treated as a named input to the +ShellCommandTask, and can be included in the input specification. +As shown next, even an output is specified by constructing +the out_file field form a template:

    +
    bet_input_spec = SpecInfo(
    +    name="Input",
    +    fields=[
    +    ( "in_file", File,
    +      { "help_string": "input file ...",
    +        "position": 1,
    +        "mandatory": True } ),
    +    ( "out_file", str,
    +      { "help_string": "name of output ...",
    +        "position": 2,
    +        "output_file_template":
    +                          "{in_file}_br" } ),
    +    ( "mask", bool,
    +      { "help_string": "create binary mask",
    +        "argstr": "-m", } ) ],
    +    bases=(ShellSpec,) )
    +
    +ShellCommandTask(executable="bet",
    +                 input_spec=bet_input_spec)
    +
    +
    +

    More details are in the Input Specification.

    +
  • +
+
+
+

Container Tasks

+
    +
  • ContainerTask class is a child class of ShellCommandTask and serves as +a parent class for DockerTask and SingularityTask. Both Container Tasks +run shell commands or executables within containers with specific user defined +environments using Docker and Singularity software respectively. +This might be extremely useful for users and projects that require environment +encapsulation and sharing. +Using container technologies helps improve scientific +workflows reproducibility, one of the key concept behind Pydra.

    +

    These Container Tasks can be defined by using +DockerTask and SingularityTask classes directly, or can be created +automatically from ShellCommandTask, when an optional argument +container_info is used when creating a Shell Task. The following two +types of syntax are equivalent:

    +
    DockerTask(executable="pwd", image="busybox")
    +
    +ShellCommandTask(executable="ls",
    +     container_info=("docker", "busybox"))
    +
    +
    +
  • +
+
+
+

Workflows

+
    +
  • Workflow - is a subclass of Task that provides support for creating Pydra +dataflows. As a subclass, a Workflow acts like a Task and has inputs, outputs, +is hashable, and is treated as a single unit. Unlike Tasks, workflows embed +a directed acyclic graph. Each node of the graph contains a Task of any type, +including another Workflow, and can be added to the Workflow simply by calling +the add method. The connections between Tasks are defined by using so +called Lazy Inputs or Lazy Outputs. These are special attributes that allow +assignment of values when a Workflow is executed rather than at the point of +assignment. The following example creates a Workflow from two Pydra Tasks.

    +
    # creating workflow with two input fields
    +wf = Workflow(input_spec=["x", "y"])
    +# adding a task and connecting task's input
    +# to the workflow input
    +wf.add(mult(name="mlt",
    +               x=wf.lzin.x, y=wf.lzin.y))
    +# adding another task and connecting
    +# task's input to the "mult" task's output
    +wf.add(add2(name="add", x=wf.mlt.lzout.out))
    +# setting workflow output
    +wf.set_output([("out", wf.add.lzout.out)])
    +
    +
    +
  • +
+
+
+

Task’s State

+

All Tasks, including Workflows, can have an optional attribute representing an instance of the State class. +This attribute controls the execution of a Task over different input parameter sets. +This class is at the heart of Pydra’s powerful Map-Reduce over arbitrary inputs of nested dataflows feature. +The State class formalizes how users can specify arbitrary combinations. +Its functionality is used to create and track different combinations of input parameters, +and optionally allow limited or complete recombinations. +In order to specify how the inputs should be split into parameter sets, and optionally combined after +the Task execution, the user can set splitter and combiner attributes of the State class.

+
task_with_state =
+      add2().split(x=[1, 5]).combine("x")
+
+
+

In this example, the State class is responsible for creating a list of two +separate inputs, [{x: 1}, {x:5}], each run of the Task should get one +element from the list. Note that in this case the value for x is set in the split() +method, not at the task’s initialisation. +The combine() method, specifies that the results are grouped back when returning the +result from the Task.

+

While this example illustrates mapping and grouping of results over a single parameter, +Pydra extends this to arbitrary combinations of input fields and downstream grouping +over nested dataflows. Details of how splitters and combiners power Pydra’s +scalable dataflows are described in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/genindex.html b/typing-bugfixes/genindex.html new file mode 100644 index 0000000000..62d6dd3948 --- /dev/null +++ b/typing-bugfixes/genindex.html @@ -0,0 +1,1512 @@ + + + + + + Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | U + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/index.html b/typing-bugfixes/index.html new file mode 100644 index 0000000000..c55c56c5ac --- /dev/null +++ b/typing-bugfixes/index.html @@ -0,0 +1,246 @@ + + + + + + + Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation! — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Welcome to Pydra: A simple dataflow engine with scalable semantics’s documentation!

+

Pydra is a new lightweight dataflow engine written in Python. +Pydra is developed as an open-source project in the neuroimaging community, +but it is designed as a general-purpose dataflow engine to support any scientific domain.

+

Scientific workflows often require sophisticated analyses that encompass a large collection +of algorithms. +The algorithms, that were originally not necessarily designed to work together, +and were written by different authors. +Some may be written in Python, while others might require calling external programs. +It is a common practice to create semi-manual workflows that require the scientists +to handle the files and interact with partial results from algorithms and external tools. +This approach is conceptually simple and easy to implement, but the resulting workflow +is often time consuming, error-prone and difficult to share with others. +Consistency, reproducibility and scalability demand scientific workflows +to be organized into fully automated pipelines. +This was the motivation behind Pydra - a new dataflow engine written in Python.

+

The Pydra package is a part of the second generation of the Nipype ecosystem +— an open-source framework that provides a uniform interface to existing neuroimaging +software and facilitates interaction between different software components. +The Nipype project was born in the neuroimaging community, and has been helping scientists +build workflows for a decade, providing a uniform interface to such neuroimaging packages +as FSL, ANTs, AFNI, FreeSurfer and SPM. +This flexibility has made it an ideal basis for popular preprocessing tools, +such as fMRIPrep and C-PAC. +The second generation of Nipype ecosystem is meant to provide additional flexibility +and is being developed with reproducibility, ease of use, and scalability in mind. +Pydra itself is a standalone project and is designed as a general-purpose dataflow engine +to support any scientific domain.

+

The goal of Pydra is to provide a lightweight dataflow engine for computational graph construction, +manipulation, and distributed execution, as well as ensuring reproducibility of scientific pipelines. +In Pydra, a dataflow is represented as a directed acyclic graph, where each node represents a Python +function, execution of an external tool, or another reusable dataflow. +The combination of several key features makes Pydra a customizable and powerful dataflow engine:

+
    +
  • Composable dataflows: Any node of a dataflow graph can be another dataflow, allowing for nested +dataflows of arbitrary depths and encouraging creating reusable dataflows.

  • +
  • Flexible semantics for creating nested loops over input sets: Any Task or dataflow can be run +over input parameter sets and the outputs can be recombined (similar concept to Map-Reduce model, +but Pydra extends this to graphs with nested dataflows).

  • +
  • A content-addressable global cache: Hash values are computed for each graph and each Task. +This supports reusing of previously computed and stored dataflows and Tasks.

  • +
  • Support for Python functions and external (shell) commands: Pydra can decorate and use existing +functions in Python libraries alongside external command line tools, allowing easy integration +of existing code and software.

  • +
  • Native container execution support: Any dataflow or Task can be executed in an associated container +(via Docker or Singularity) enabling greater consistency for reproducibility.

  • +
  • Auditing and provenance tracking: Pydra provides a simple JSON-LD-based message passing mechanism +to capture the dataflow execution activities as a provenance graph. These messages track inputs +and outputs of each task in a dataflow, and the resources consumed by the task.

  • +
+ +
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/input_spec.html b/typing-bugfixes/input_spec.html new file mode 100644 index 0000000000..a1137803e2 --- /dev/null +++ b/typing-bugfixes/input_spec.html @@ -0,0 +1,310 @@ + + + + + + + Input Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Input Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, more examples of the input specification will be provided.

+

Let’s start from the previous example:

+
bet_input_spec = SpecInfo(
+    name="Input",
+    fields=[
+    ( "in_file", File,
+      { "help_string": "input file ...",
+        "position": 1,
+        "mandatory": True } ),
+    ( "out_file", str,
+      { "help_string": "name of output ...",
+        "position": 2,
+        "output_file_template":
+                          "{in_file}_br" } ),
+    ( "mask", bool,
+      { "help_string": "create binary mask",
+        "argstr": "-m", } ) ],
+    bases=(ShellSpec,) )
+
+ShellCommandTask(executable="bet",
+                 input_spec=bet_input_spec)
+
+
+

In order to create an input specification, a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Input” for +the input specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate input field that is added to the specification. +In this example, three-elements tuples - with name, type and dictionary with additional +information - are used. +But this is only one of the supported syntax, more options will be described below.

+
+

Adding a New Field to the Spec

+

Pydra uses attr classes to represent the input specification, and the full syntax for each field +is:

+
field1 = ("field1_name", attr.ib(type=<'field1_type'>, metadata=<'dictionary with metadata'>)
+
+
+

However, we allow for shorter syntax, that does not include attr.ib:

+
    +
  • providing only name and the type

  • +
+
field1 = ("field1_name", <'field1_type'>)
+
+
+
    +
  • providing name, type and metadata (as in the example above)

  • +
+
field1 = ("field1_name", <'field1_type'>, <'dictionary with metadata'>))
+
+
+
    +
  • providing name, type and default value

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value'>)
+
+
+
    +
  • providing name, type, default value and metadata

  • +
+
field1 = ("field1_name", <'field1_type'>, <'default value', <'dictionary with metadata'>))
+
+
+

Each of the shorter versions will be converted to the (name, attr.ib(…).

+
+
+

Types

+

Type can be provided as a simple python type (e.g. str, int, float, etc.) +or can be more complex by using typing.List, typing.Dict and typing.Union.

+

There are also special types provided by Pydra:

+
    +
  • File and Directory - should be used in input_spec if the field is an existing file +or directory. +Pydra checks if the file or directory exists, and returns an error if it doesn’t exist.

  • +
  • MultiInputObj - a special type that takes a any value and if the value is not a list it +converts value to a 1-element list (it could be used together with MultiOutputObj +in the output_spec to reverse the conversion of the output values).

  • +
+
+
+

Metadata

+

In the example we used multiple keys in the metadata dictionary including help_string, +position, etc. In this section all allowed key will be described:

+
+
help_string (str, mandatory):

A short description of the input field.

+
+
mandatory (bool, default: False):

If True user has to provide a value for the field.

+
+
sep (str):

A separator if a list is provided as a value.

+
+
argstr (str):

A flag or string that is used in the command before the value, e.g. -v or -v {inp_field}, +but it could be and empty string, “”. +If are used, e.g. -v…, the flag is used before every element if a list is provided +as a value. +If no argstr is used the field is not part of the command.

+
+
position (int):

Position of the field in the command, could be nonnegative or negative integer. +If nothing is provided the field will be inserted between all fields with nonnegative positions +and fields with negative positions.

+
+
allowed_values (list):

List of allowed values for the field.

+
+
requires (list):

List of field names that are required together with the field.

+
+
xor (list):

List of field names that are mutually exclusive with the field.

+
+
copyfile (bool, default: False):

If True, a hard link is created for the input file in the output directory. +If hard link not possible, the file is copied to the output directory.

+
+
container_path (bool, default: False, only for ContainerTask):

If True a path will be consider as a path inside the container (and not as a local path).

+
+
output_file_template (str):

If provided, the field is treated also as an output field and it is added to the output spec. +The template can use other fields, e.g. {file1}. +Used in order to create an output specification.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +Used in order to create an output specification.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +Used in order to create an output specification.

+
+
readonly (bool, default: False):

If True the input field can’t be provided by the user but it aggregates other input fields +(for example the fields with argstr: -o {fldA} {fldB}).

+
+
formatter (function):

If provided the argstr of the field is created using the function. This function can for example +be used to combine several inputs into one command argument. +The function can take field (this input field will be passed to the function), +inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+

Validators

+

Pydra allows for using simple validator for types and allowev_values. +The validators are disabled by default, but can be enabled by calling +pydra.set_input_validator(flag=True).

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/objects.inv b/typing-bugfixes/objects.inv new file mode 100644 index 0000000000..8848e7458e Binary files /dev/null and b/typing-bugfixes/objects.inv differ diff --git a/typing-bugfixes/output_spec.html b/typing-bugfixes/output_spec.html new file mode 100644 index 0000000000..bce9edd953 --- /dev/null +++ b/typing-bugfixes/output_spec.html @@ -0,0 +1,234 @@ + + + + + + + Output Specification — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

Output Specification

+

As it was mentioned in Shell Command Tasks, the user can customize the input and output +for the ShellCommandTask. +In this section, the output specification will be covered.

+

Instead of using field with output_file_template in the customized input_spec to specify an output field, +a customized output_spec can be used, e.g.:

+
output_spec = SpecInfo(
+    name="Output",
+    fields=[
+        (
+            "out1",
+            attr.ib(
+                type=File,
+                metadata={
+                    "output_file_template": "{inp1}",
+                    "help_string": "output file",
+                    "requires": ["inp1", "inp2"]
+                },
+            ),
+        )
+    ],
+    bases=(ShellOutSpec,),
+)
+
+ShellCommandTask(executable=executable,
+                 output_spec=output_spec)
+
+
+

Similarly as for input_spec, in order to create an output specification, +a new SpecInfo object has to be created. +The field name specifies the type of the spec and it should be always “Output” for +the output specification. +The field bases specifies the “base specification” you want to use (can think about it as a +parent class) and it will usually contains ShellOutSpec only, unless you want to build on top of +your other specification (this will not be cover in this section). +The part that should be always customised is the fields part. +Each element of the fields is a separate output field that is added to the specification. +In this example, a three-elements tuple - with name, type and dictionary with additional +information - is used. +See Input Specification for other recognized syntax for specification’s fields +and possible types.

+
+

Metadata

+

The metadata dictionary for output_spec can include:

+
+
help_string (str, mandatory):

A short description of the input field. The same as in input_spec.

+
+
mandatory (bool, default: False):

If True the output file has to exist, otherwise an error will be raised.

+
+
output_file_template (str):

If provided the output file name (or list of file names) is created using the template. +The template can use other fields, e.g. {file1}. The same as in input_spec.

+
+
output_field_name (str, used together with output_file_template)

If provided the field is added to the output spec with changed name. +The same as in input_spec.

+
+
keep_extension (bool, default: True):

A flag that specifies if the file extension should be removed from the field value. +The same as in input_spec.

+
+
requires (list):

List of field names that are required to create a specific output. +The fields do not have to be a part of the output_file_template and +if any field from the list is not provided in the input, a NOTHING is returned for the specific output. +This has a different meaning than the requires form the input_spec.

+
+
callable (function):

If provided the output file name (or list of file names) is created using the function. +The function can take field (the specific output field will be passed to the function), +output_dir (task output_dir will be used), stdout, stderr (stdout and stderr of +the task will be sent) inputs (entire inputs will be passed) or any input field name +(a specific input field will be sent).

+
+
+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/py-modindex.html b/typing-bugfixes/py-modindex.html new file mode 100644 index 0000000000..9eb095f6c6 --- /dev/null +++ b/typing-bugfixes/py-modindex.html @@ -0,0 +1,275 @@ + + + + + + Python Module Index — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ pydra +
    + pydra.engine +
    + pydra.engine.audit +
    + pydra.engine.boutiques +
    + pydra.engine.core +
    + pydra.engine.environments +
    + pydra.engine.graph +
    + pydra.engine.helpers +
    + pydra.engine.helpers_file +
    + pydra.engine.helpers_state +
    + pydra.engine.run_pickled +
    + pydra.engine.specs +
    + pydra.engine.state +
    + pydra.engine.submitter +
    + pydra.engine.task +
    + pydra.engine.workers +
    + pydra.mark +
    + pydra.mark.functions +
    + pydra.tasks +
    + pydra.utils +
    + pydra.utils.hash +
    + pydra.utils.messenger +
    + pydra.utils.misc +
    + pydra.utils.profiler +
    + pydra.utils.typing +
+ + +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/search.html b/typing-bugfixes/search.html new file mode 100644 index 0000000000..33c6343a1f --- /dev/null +++ b/typing-bugfixes/search.html @@ -0,0 +1,155 @@ + + + + + + Search — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019 - 2020, The Nipype Developers team.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/typing-bugfixes/searchindex.js b/typing-bugfixes/searchindex.js new file mode 100644 index 0000000000..a5a8f3fb61 --- /dev/null +++ b/typing-bugfixes/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/pydra.engine", "api/pydra.engine.audit", "api/pydra.engine.boutiques", "api/pydra.engine.core", "api/pydra.engine.environments", "api/pydra.engine.graph", "api/pydra.engine.helpers", "api/pydra.engine.helpers_file", "api/pydra.engine.helpers_state", "api/pydra.engine.run_pickled", "api/pydra.engine.specs", "api/pydra.engine.state", "api/pydra.engine.submitter", "api/pydra.engine.task", "api/pydra.engine.workers", "api/pydra.mark", "api/pydra.mark.functions", "api/pydra.tasks", "api/pydra.utils", "api/pydra.utils.hash", "api/pydra.utils.messenger", "api/pydra.utils.misc", "api/pydra.utils.profiler", "api/pydra.utils.typing", "changes", "combiner", "components", "index", "input_spec", "output_spec", "state", "user_guide"], "filenames": ["api.rst", "api/pydra.engine.rst", "api/pydra.engine.audit.rst", "api/pydra.engine.boutiques.rst", "api/pydra.engine.core.rst", "api/pydra.engine.environments.rst", "api/pydra.engine.graph.rst", "api/pydra.engine.helpers.rst", "api/pydra.engine.helpers_file.rst", "api/pydra.engine.helpers_state.rst", "api/pydra.engine.run_pickled.rst", "api/pydra.engine.specs.rst", "api/pydra.engine.state.rst", "api/pydra.engine.submitter.rst", "api/pydra.engine.task.rst", "api/pydra.engine.workers.rst", "api/pydra.mark.rst", "api/pydra.mark.functions.rst", "api/pydra.tasks.rst", "api/pydra.utils.rst", "api/pydra.utils.hash.rst", "api/pydra.utils.messenger.rst", "api/pydra.utils.misc.rst", "api/pydra.utils.profiler.rst", "api/pydra.utils.typing.rst", "changes.rst", "combiner.rst", "components.rst", "index.rst", "input_spec.rst", "output_spec.rst", "state.rst", "user_guide.rst"], "titles": ["Library API (application programmer interface)", "pydra.engine package", "pydra.engine.audit module", "pydra.engine.boutiques module", "pydra.engine.core module", "pydra.engine.environments module", "pydra.engine.graph module", "pydra.engine.helpers module", "pydra.engine.helpers_file module", "pydra.engine.helpers_state module", "pydra.engine.run_pickled module", "pydra.engine.specs module", "pydra.engine.state module", "pydra.engine.submitter module", "pydra.engine.task module", "pydra.engine.workers module", "pydra.mark package", "pydra.mark.functions module", "pydra.tasks package", "pydra.utils package", "pydra.utils.hash module", "pydra.utils.messenger module", "pydra.utils.misc module", "pydra.utils.profiler module", "pydra.utils.typing module", "Release Notes", "Grouping Task\u2019s Output", "Dataflows Components: Task and Workflow", "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!", "Input Specification", "Output Specification", "State and Nested Loops over Input", "User Guide"], "terms": {"The": [0, 1, 2, 4, 7, 9, 11, 13, 18, 20, 21, 27, 28, 29, 30, 31], "pydra": [0, 25, 26, 27, 29, 31], "workflow": [0, 1, 4, 6, 7, 11, 13, 17, 25, 26, 28, 31, 32], "engin": [0, 23, 24, 25, 31], "i": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "rewrit": 0, "nipyp": [0, 8, 23, 25, 28], "map": [0, 1, 6, 12, 14, 20, 24, 27, 28, 31], "join": [0, 20], "first": [0, 20, 26], "class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25, 27, 29, 30], "oper": [0, 12, 20, 31], "It": [0, 4, 12, 26, 27, 28], "form": [0, 7, 9, 11, 12, 27, 30], "core": [0, 1, 11, 13, 23, 25], "2": [0, 1, 7, 13, 14, 16, 17, 20, 21, 27, 28, 29, 31], "0": [0, 1, 4, 7, 9, 13, 16, 17, 21, 28], "ecosystem": [0, 28], "auditflag": [0, 1, 3, 4, 14, 21, 28], "valu": [0, 1, 4, 7, 8, 9, 11, 12, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31], "name": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 25, 27, 29, 30], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 25], "modul": [0, 1, 16, 19, 28], "qualnam": [0, 1, 21], "type": [0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 25, 27, 30, 32], "start": [0, 1, 2, 6, 20, 21, 23, 29], "1": [0, 1, 4, 7, 8, 9, 13, 15, 20, 21, 27, 28, 29, 31], "boundari": [0, 1, 21], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 23, 24, 27, 28, 29, 30, 31], "flag": [0, 1, 2, 4, 21, 25, 27, 29, 30], "audit": [0, 1, 4, 14, 21, 25, 28], "all": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 25, 26, 27, 29, 31], "3": [0, 1, 7, 13, 21, 22, 28, 31], "track": [0, 1, 2, 11, 12, 14, 21, 23, 27, 28], "proven": [0, 1, 2, 14, 21, 28], "resourc": [0, 1, 2, 21, 23, 28], "util": [0, 1, 2, 8, 14], "do": [0, 1, 13, 20, 21, 30], "monitor": [0, 1, 2, 14, 21, 23], "prov": [0, 1, 21], "onli": [0, 1, 4, 7, 12, 13, 14, 21, 24, 26, 29, 30, 31], "shellcommandtask": [0, 1, 3, 14, 25, 27, 28, 29, 30], "audit_flag": [0, 1, 2, 3, 4, 14], "messeng": [0, 1, 2, 3, 4, 14, 19, 25], "cache_dir": [0, 1, 3, 4, 14], "input_spec": [0, 1, 4, 7, 8, 11, 14, 25, 27, 29, 30], "spec": [0, 1, 4, 7, 8, 9, 14, 15, 24, 25, 30, 32], "specinfo": [0, 1, 4, 11, 14, 27, 29, 30], "cont_dim": [0, 1, 4, 9, 12, 14, 25], "messenger_arg": [0, 1, 2, 3, 4, 14], "output_spec": [0, 1, 4, 7, 8, 14, 29, 30], "rerun": [0, 1, 3, 4, 7, 10, 13, 14, 15, 25], "fals": [0, 1, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 15, 22, 23, 24, 29, 30], "strip": [0, 1, 3, 7, 14, 24], "environ": [0, 1, 13, 14, 15, 27], "nativ": [0, 1, 5, 14, 28], "object": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 20, 21, 24, 27, 29, 30], "kwarg": [0, 1, 3, 4, 7, 8, 11, 13, 14, 15, 20, 21, 24], "taskbas": [0, 1, 4, 5, 7, 11, 13, 14, 27], "wrap": [0, 1, 4, 14], "shell": [0, 1, 3, 11, 14, 28, 29, 30, 32], "command": [0, 1, 3, 6, 7, 8, 14, 15, 28, 29, 30, 32], "task": [0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 15, 16, 17, 25, 28, 29, 30, 31, 32], "element": [0, 1, 4, 12, 14, 24, 25, 26, 27, 29, 30, 31], "default_copy_col": [0, 1, 4, 14], "properti": [0, 1, 4, 6, 11, 12, 14, 23, 24], "cmdline": [0, 1, 14, 25], "get": [0, 1, 4, 6, 7, 8, 9, 11, 12, 14, 21, 23, 24, 25, 27, 31], "actual": [0, 1, 14], "line": [0, 1, 7, 14, 27, 28], "submit": [0, 1, 14], "return": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 27, 29, 30], "list": [0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 24, 25, 26, 27, 29, 30, 31], "ha": [0, 1, 4, 6, 8, 12, 13, 14, 26, 27, 28, 29, 30, 31], "state": [0, 1, 4, 9, 11, 13, 14, 21, 25, 28, 32], "command_arg": [0, 1, 14, 25], "root": [0, 1, 5, 8, 14], "argument": [0, 1, 5, 14, 15, 20, 24, 27, 29], "get_bind": [0, 1, 14], "str": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 20, 21, 22, 24, 27, 29, 30], "dict": [0, 1, 2, 4, 8, 12, 14, 20, 21, 24, 29], "tupl": [0, 1, 4, 7, 8, 9, 11, 12, 14, 24, 25, 29, 30, 31], "bind": [0, 1, 5, 14, 25], "necessari": [0, 1, 14], "run": [0, 1, 4, 6, 7, 8, 11, 12, 13, 14, 15, 23, 25, 27, 28], "an": [0, 1, 4, 7, 8, 11, 14, 15, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31], "altern": [0, 1, 14], "thi": [0, 1, 4, 6, 7, 8, 9, 11, 13, 14, 15, 20, 23, 24, 26, 27, 28, 29, 30, 31], "primarili": [0, 1, 14], "intend": [0, 1, 14], "context": [0, 1, 14, 21], "when": [0, 1, 6, 8, 9, 11, 12, 14, 21, 24, 25, 26, 27, 31], "go": [0, 1, 14], "contain": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 14, 21, 24, 25, 28, 29, 30, 32], "mount": [0, 1, 5, 8, 14], "volum": [0, 1, 14], "paramet": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 21, 22, 23, 24, 27, 28, 31], "from": [0, 1, 4, 6, 7, 8, 9, 11, 12, 13, 14, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "path": [0, 1, 4, 5, 6, 7, 8, 11, 13, 14, 20, 21, 24, 25, 29], "host": [0, 1, 5, 8, 14], "target": [0, 1, 14, 24], "submitt": [0, 1, 7, 25, 28], "plugin": [0, 1, 7, 13], "worker": [0, 1, 13, 25], "cf": [0, 1, 13, 15], "send": [0, 1, 2, 13, 21], "execut": [0, 1, 5, 7, 11, 13, 15, 23, 27, 28, 29, 30, 31], "backend": [0, 1, 13], "close": [0, 1, 7, 13, 15, 20], "previous": [0, 1, 6, 11, 13, 24, 28], "loop": [0, 1, 7, 13, 15, 28, 32], "async": [0, 1, 7, 13, 15], "expand_runn": [0, 1, 13], "runnabl": [0, 1, 6, 13, 15, 27, 31], "wait": [0, 1, 13], "coroutin": [0, 1, 7, 13, 15], "handl": [0, 1, 2, 13, 24, 25, 28], "expans": [0, 1, 13], "remov": [0, 1, 5, 6, 8, 9, 12, 13, 25, 29, 30], "ani": [0, 1, 4, 6, 7, 8, 11, 13, 15, 23, 24, 27, 28, 29, 30], "If": [0, 1, 2, 4, 7, 8, 13, 15, 20, 24, 29, 30], "set": [0, 1, 4, 7, 8, 11, 12, 13, 15, 23, 24, 25, 26, 27, 28, 31], "default": [0, 1, 4, 11, 13, 15, 20, 29, 30], "aggreg": [0, 1, 13, 29], "them": [0, 1, 4, 6, 7, 13, 25], "true": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 15, 21, 24, 27, 29, 30], "complet": [0, 1, 13, 27], "error": [0, 1, 4, 7, 8, 9, 11, 13, 23, 24, 25, 28, 29, 30], "instanc": [0, 1, 4, 13, 24, 27], "bool": [0, 1, 2, 4, 6, 7, 8, 9, 11, 12, 13, 21, 24, 27, 29, 30], "await": [0, 1, 13, 15], "futur": [0, 1, 13, 15, 25], "befor": [0, 1, 4, 12, 13, 29], "expand_workflow": [0, 1, 13], "wf": [0, 1, 7, 11, 13, 25, 27], "expand": [0, 1, 13, 24, 25], "stateless": [0, 1, 13, 31], "method": [0, 1, 4, 5, 6, 13, 25, 26, 27, 31], "reach": [0, 1, 13], "_run_task": [0, 1, 13], "comput": [0, 1, 4, 13, 24, 28], "submit_from_cal": [0, 1, 13], "should": [0, 1, 8, 9, 11, 12, 13, 20, 24, 27, 29, 30], "call": [0, 1, 13, 20, 23, 26, 27, 28, 29, 31], "onc": [0, 1, 13, 24], "per": [0, 1, 13], "serv": [0, 1, 13, 27], "bridg": [0, 1, 13], "between": [0, 1, 6, 11, 12, 13, 20, 24, 27, 28, 29], "sync": [0, 1, 13], "land": [0, 1, 13], "There": [0, 1, 13, 27, 29], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 13, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31], "4": [0, 1, 13, 21, 28], "potenti": [0, 1, 13, 20, 24], "differ": [0, 1, 13, 27, 28, 30, 31], "than": [0, 1, 13, 27, 30], "without": [0, 1, 4, 6, 8, 12, 13, 27], "python": [0, 1, 5, 7, 13, 14, 15, 20, 22, 25, 27, 28, 29, 31], "10": [0, 1, 13], "minimum": [0, 1, 13], "probabl": [0, 1, 13], "refactor": [0, 1, 13, 25], "us": [0, 1, 4, 5, 7, 8, 9, 11, 12, 13, 15, 17, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31], "structur": [0, 1, 4, 6, 11, 13], "pattern": [0, 1, 13, 24], "match": [0, 1, 13, 22, 24], "cache_loc": [0, 1, 4, 7, 14, 25], "basespec": [0, 1, 4, 11, 14], "propagate_rerun": [0, 1, 4, 25], "A": [0, 1, 2, 4, 6, 7, 11, 12, 15, 20, 21, 23, 24, 27, 29, 30, 31], "composit": [0, 1, 4], "graph": [0, 1, 4, 13, 21, 25, 27, 28, 31], "add": [0, 1, 4, 5, 6, 22, 25, 27], "ad": [0, 1, 4, 6, 9, 25, 27, 30, 32], "checksum": [0, 1, 4, 7, 25], "calcul": [0, 1, 4, 6, 11, 12, 20, 25], "uniqu": [0, 1, 4, 7, 8, 20, 21], "creat": [0, 1, 2, 4, 6, 7, 8, 9, 12, 15, 18, 20, 25, 27, 28, 29, 30, 31], "specif": [0, 1, 4, 7, 11, 12, 15, 21, 23, 25, 26, 27, 28, 31, 32], "directori": [0, 1, 2, 4, 5, 7, 8, 14, 20, 25, 27, 29], "node": [0, 1, 4, 6, 9, 11, 12, 14, 23, 25, 27, 28, 31], "need": [0, 1, 4, 6, 11, 12, 26, 31], "have": [0, 1, 4, 7, 8, 9, 12, 20, 27, 30, 31], "input": [0, 1, 4, 6, 7, 8, 9, 11, 12, 25, 26, 27, 28, 30, 32], "etc": [0, 1, 4, 29], "create_connect": [0, 1, 4], "detail": [0, 1, 4, 6, 27], "connect": [0, 1, 4, 6, 9, 12, 27], "particular": [0, 1, 2, 4], "exist": [0, 1, 4, 27, 28, 29, 30], "add_edges_descript": [0, 1, 4, 6], "self": [0, 1, 2, 4, 6, 12], "descript": [0, 1, 4, 6, 25, 29, 30], "output": [0, 1, 2, 4, 5, 6, 7, 8, 11, 12, 21, 25, 27, 28, 29, 31, 32], "field": [0, 1, 4, 6, 7, 8, 9, 11, 12, 24, 25, 26, 27, 30, 31, 32], "create_dotfil": [0, 1, 4, 25], "simpl": [0, 1, 4, 6, 25, 27, 29], "export": [0, 1, 4, 6], "output_dir": [0, 1, 4, 8, 11, 30], "dotfil": [0, 1, 4, 6, 25], "option": [0, 1, 2, 4, 11, 12, 15, 21, 24, 27, 29, 31], "other": [0, 1, 4, 6, 9, 24, 25, 27, 28, 29, 30, 31], "format": [0, 1, 4, 6, 7, 21, 25], "graph_sort": [0, 1, 4], "sort": [0, 1, 4, 6, 7], "represent": [0, 1, 4, 12], "lzin": [0, 1, 4, 27], "set_output": [0, 1, 4, 27], "lazyfield": [0, 1, 4, 11, 24], "link": [0, 1, 4, 6, 21, 29], "lazi": [0, 1, 4, 11, 24, 27], "singl": [0, 1, 4, 7, 8, 12, 20, 21, 25, 26, 27], "packag": [0, 25, 27, 28], "submodul": 0, "audit_check": [0, 2], "audit_messag": [0, 2], "audit_task": [0, 2], "finalize_audit": [0, 2], "start_audit": [0, 2], "boutiqu": [0, 1, 25], "boshtask": [0, 3, 25], "supported_copy_mod": [0, 4], "can_resum": [0, 4], "checksum_st": [0, 4], "combin": [0, 4, 7, 9, 12, 25, 26, 27, 28, 29, 31], "done": [0, 4, 31], "generated_output_nam": [0, 4, 11], "get_input_el": [0, 4], "help": [0, 4, 27, 28], "lzout": [0, 4, 25, 27], "output_nam": [0, 4], "pickle_task": [0, 4], "result": [0, 2, 4, 7, 8, 11, 12, 25, 26, 27, 28], "set_stat": [0, 4], "split": [0, 4, 9, 11, 12, 14, 24, 26, 27, 31], "uid": [0, 4], "version": [0, 4, 24, 29], "is_lazi": [0, 4], "is_task": [0, 4], "is_workflow": [0, 4], "docker": [0, 5, 8, 14, 27, 28], "setup": [0, 5], "teardown": [0, 5], "singular": [0, 5, 14, 25, 27, 28], "digraph": [0, 6], "add_edg": [0, 6], "add_nod": [0, 6], "calculate_max_path": [0, 6], "copi": [0, 6, 7, 8, 11, 14, 24, 25, 29, 31], "create_dotfile_detail": [0, 6], "create_dotfile_nest": [0, 6], "create_dotfile_simpl": [0, 6], "edg": [0, 6], "edges_nam": [0, 6], "export_graph": [0, 6], "nodes_detail": [0, 6], "nodes_names_map": [0, 6], "remove_nod": [0, 6], "remove_nodes_connect": [0, 6], "remove_previous_connect": [0, 6], "remove_successors_nod": [0, 6], "sorted_nod": [0, 6], "sorted_nodes_nam": [0, 6], "helper": [0, 1], "pydrafilelock": [0, 7], "allowed_values_valid": [0, 7], "argstr_format": [0, 7], "copyfile_workflow": [0, 7], "create_checksum": [0, 7], "ensure_list": [0, 7, 8], "from_list_if_singl": [0, 7], "gather_runtime_info": [0, 7], "get_available_cpu": [0, 7, 25], "get_open_loop": [0, 7], "load_and_run": [0, 7, 25], "load_and_run_async": [0, 7], "load_result": [0, 7], "load_task": [0, 7], "make_klass": [0, 7], "output_from_inputfield": [0, 7], "parse_copyfil": [0, 7], "parse_format_str": [0, 7], "position_sort": [0, 7], "print_help": [0, 7], "read_and_displai": [0, 7], "read_and_display_async": [0, 7], "read_stream_and_displai": [0, 7], "record_error": [0, 7], "save": [0, 7], "helpers_fil": [0, 1], "mountindentifi": [0, 8], "generate_cifs_t": [0, 8], "get_mount": [0, 8], "get_mount_t": [0, 8], "on_cif": [0, 8], "on_same_mount": [0, 8], "parse_mount_t": [0, 8], "patch_tabl": [0, 8], "copy_nested_fil": [0, 8], "is_contain": [0, 8], "is_local_fil": [0, 8], "template_upd": [0, 8, 11], "template_update_singl": [0, 8], "helpers_st": [0, 1], "pydrastateerror": [0, 9, 25], "add_name_combin": [0, 9], "add_name_splitt": [0, 9], "combine_final_group": [0, 9], "converter_groups_to_input": [0, 9], "flatten": [0, 9], "input_shap": [0, 9], "inputs_types_to_dict": [0, 9], "iter_split": [0, 9], "map_split": [0, 9], "remove_inp_from_splitter_rpn": [0, 9], "rpn2splitter": [0, 9], "splits_group": [0, 9], "splitter2rpn": [0, 9], "unwrap_splitt": [0, 9], "run_pickl": [0, 1], "check_fields_input_spec": [0, 11], "check_metadata": [0, 11], "collect_additional_output": [0, 11], "copyfile_input": [0, 11], "hash": [0, 11, 14, 19, 25, 27, 28], "hash_chang": [0, 11], "retrieve_valu": [0, 11], "functionspec": [0, 11], "cast": [0, 11], "cast_from": [0, 11], "sanitize_splitt": [0, 11], "lazyin": [0, 11], "lazyinfield": [0, 11], "attr_typ": [0, 11], "get_valu": [0, 11], "lazyinterfac": [0, 11], "lazyout": [0, 11], "lazyoutfield": [0, 11], "multiinputobj": [0, 11, 24, 29], "multioutputtyp": [0, 11], "get_output_field": [0, 11], "runtim": [0, 7, 11], "cpu_peak_perc": [0, 11], "rss_peak_gb": [0, 11], "vms_peak_gb": [0, 11], "runtimespec": [0, 11], "network": [0, 11], "outdir": [0, 6, 11], "shelloutspec": [0, 11, 30], "return_cod": [0, 11], "stderr": [0, 11, 15, 30], "stdout": [0, 11, 30], "shellspec": [0, 11, 27, 29], "arg": [0, 4, 7, 11, 14, 15, 24, 27], "statearrai": [0, 4, 11, 24], "taskhook": [0, 11], "post_run": [0, 11], "post_run_task": [0, 11], "pre_run": [0, 11], "pre_run_task": [0, 11], "reset": [0, 11], "attr_field": [0, 11], "donoth": [0, 11], "path_to_str": [0, 11], "splitter": [0, 4, 9, 11, 12, 25, 26, 27, 32], "splitter_rpn_compact": [0, 12], "splitter_rpn": [0, 9, 12], "splitter_fin": [0, 12], "other_st": [0, 9, 12], "inner_input": [0, 9, 12], "states_ind": [0, 12], "states_v": [0, 12], "inputs_ind": [0, 12], "group_for_input": [0, 9, 12], "group_for_inputs_fin": [0, 12], "groups_stack_fin": [0, 12], "final_combined_ind_map": [0, 12], "combiner_valid": [0, 12], "current_combin": [0, 12], "current_combiner_al": [0, 12], "current_splitt": [0, 12], "current_splitter_rpn": [0, 12], "prepare_input": [0, 12], "prepare_st": [0, 12], "prepare_states_combined_ind": [0, 12], "prepare_states_ind": [0, 12], "prepare_states_v": [0, 12], "prev_state_combin": [0, 12], "prev_state_combiner_al": [0, 12], "prev_state_splitt": [0, 12], "prev_state_splitter_rpn": [0, 12], "prev_state_splitter_rpn_compact": [0, 12], "set_input_group": [0, 12], "splitter_rpn_fin": [0, 12], "splitter_valid": [0, 12], "update_connect": [0, 12], "get_runnable_task": [0, 13], "is_runn": [0, 13], "prepare_runnable_with_st": [0, 13], "functiontask": [0, 14, 16, 17, 25, 27], "split_cmd": [0, 14], "concurrentfutureswork": [0, 15], "exec_as_coro": [0, 15], "plugin_nam": [0, 15], "run_el": [0, 15], "daskwork": [0, 15], "exec_dask": [0, 15], "distributedwork": [0, 15], "fetch_finish": [0, 15], "max_job": [0, 15], "psijlocalwork": [0, 15], "subtyp": [0, 15, 24], "psijslurmwork": [0, 15], "psijwork": [0, 15], "exec_psij": [0, 15], "make_job": [0, 15], "make_spec": [0, 15], "sgework": [0, 15], "check_for_results_fil": [0, 15], "get_output_by_task_pkl": [0, 15], "get_tasks_to_run": [0, 15], "submit_array_job": [0, 15], "serialwork": [0, 15], "exec_seri": [0, 15], "slurmwork": [0, 15], "mark": [0, 6, 27], "annot": [0, 16, 17, 24, 27], "function": [0, 8, 9, 11, 16, 20, 23, 24, 25, 28, 29, 30, 32], "cach": [0, 4, 7, 20, 24, 28], "persist": [0, 20], "bytes_repr_mapping_cont": [0, 20], "bytes_repr_sequence_cont": [0, 20], "hash_funct": [0, 20], "hash_object": [0, 20], "hash_singl": [0, 20], "register_seri": [0, 20], "filemesseng": [0, 21], "printmesseng": [0, 21], "remoterestmesseng": [0, 21], "runtimehook": [0, 21], "resource_monitor_post_stop": [0, 21], "resource_monitor_pre_start": [0, 21], "task_execute_post_exit": [0, 21], "task_execute_pre_entri": [0, 21], "task_run_entri": [0, 21], "task_run_exit": [0, 21], "collect_messag": [0, 21], "gen_uuid": [0, 21], "make_messag": [0, 21], "now": [0, 5, 21, 25, 27], "send_messag": [0, 21], "misc": [0, 19], "add_exc_not": [0, 22], "exc_info_match": [0, 22], "profil": [0, 19], "resourcemonitor": [0, 23], "fname": [0, 7, 23], "stop": [0, 23], "get_max_resources_us": [0, 23], "get_system_total_memory_gb": [0, 23], "log_nodes_cb": [0, 23], "typepars": [0, 24], "coercible_default": [0, 24], "not_coercible_default": [0, 24], "apply_to_inst": [0, 24], "check_coerc": [0, 24], "check_typ": [0, 24], "check_type_coerc": [0, 24], "coerc": [0, 24], "coercibl": [0, 24], "contains_typ": [0, 24], "get_arg": [0, 24], "get_item_typ": [0, 24], "get_origin": [0, 24], "is_inst": [0, 24], "is_subclass": [0, 24], "label": [0, 24], "label_str": [0, 24], "match_any_of_union": [0, 24], "matches_typ": [0, 24], "not_coerc": [0, 24], "strip_split": [0, 24], "superclass_auto_cast": [0, 24], "tp": [0, 24], "keep": [2, 11, 12, 23, 24], "inform": [2, 7, 12, 21, 29, 30], "develop": [2, 28], "determin": [2, 8, 12], "whether": [2, 4, 8, 15, 24], "enabl": [2, 8, 24, 25, 28, 29], "obj": [2, 4, 6, 7, 13, 20, 21, 24], "check": [2, 4, 6, 7, 8, 11, 13, 24, 25, 29], "boolean": [2, 24], "AND": 2, "oudit_flag": 2, "messag": [2, 21, 24, 28], "json": [2, 14, 21, 23, 28], "ld": [2, 21, 28], "sent": [2, 29, 30], "end": [2, 5, 9, 20, 23, 31], "odir": 2, "record": [2, 21, 23], "until": [2, 7, 15], "case": [2, 7, 27], "insid": [2, 29], "o": [2, 7, 8, 11, 21, 24, 25, 29], "pathlik": [2, 7, 8, 21, 24], "zenodo_id": 3, "bosh_fil": 3, "input_spec_nam": 3, "output_spec_nam": 3, "descriptor": [3, 25], "basic": [4, 24, 26, 27], "process": [4, 7, 11, 12, 14, 21, 23, 25], "file": [4, 7, 8, 11, 14, 20, 21, 23, 24, 25, 27, 28, 29, 30], "gener": [4, 7, 9, 11, 20, 21, 24, 27, 28], "step": 4, "which": [4, 6, 7, 8, 9, 12, 20, 24], "both": [4, 27], "elementari": 4, "inherit": [4, 11, 27], "15": 4, "what": 4, "avail": [4, 5, 7, 11, 12, 25], "locat": 4, "sourc": [4, 24, 28], "accept": [4, 20, 23, 25], "checkpoint": 4, "restart": 4, "state_index": [4, 11], "replac": [4, 11], "recreat": 4, "todo": [4, 5, 7, 11, 21], "overwrit": 4, "parameter": 4, "one": [4, 9, 11, 15, 24, 26, 27, 29, 31], "more": [4, 24, 25, 27, 29, 31], "previou": [4, 9, 12, 26, 29], "thei": [4, 6, 7, 20, 24, 26, 31], "provid": [4, 7, 9, 11, 24, 26, 27, 28, 29, 30, 31], "refer": [4, 6, 11, 20, 24], "been": [4, 20, 28], "final": [4, 9, 12, 15, 20, 24, 26], "store": [4, 20, 28], "rais": [4, 15, 24, 25, 30], "doesn": [4, 12, 29], "t": [4, 11, 12, 24, 25, 29], "depend": [4, 9, 12, 24], "ind": [4, 7], "collect": [4, 7, 18, 21, 28], "requir": [4, 6, 8, 9, 11, 24, 25, 27, 28, 29, 30, 31], "returnhelp": 4, "print": [4, 7, 21], "filesystem": [4, 8], "where": [4, 7, 24, 26, 28, 31], "written": [4, 8, 26, 28], "": [4, 7, 9, 12, 15, 21, 25, 29, 30, 31, 32], "everyth": 4, "see": [4, 6, 11, 24, 30], "pickl": [4, 7, 25], "full": [4, 12, 25, 26, 29], "return_input": 4, "retriev": 4, "outcom": 4, "int": [4, 7, 8, 11, 16, 17, 20, 21, 23, 24, 29], "index": [4, 7, 11, 28], "multipl": [4, 8, 11, 20, 24, 25, 26, 29, 31], "val": [4, 9], "togeth": [4, 12, 26, 28, 29, 30], "indic": [4, 12, 25], "parametr": 4, "over": [4, 9, 11, 12, 27, 28, 32], "interpret": 4, "outer": [4, 12, 24, 26, 32], "product": 4, "inner": [4, 12, 24, 25, 26], "taken": 4, "keyword": [4, 7], "dimens": [4, 9, 12], "assum": [4, 5, 8, 9, 31], "so": [4, 20, 23, 25, 27, 31], "most": [4, 27, 31], "dim": 4, "split_input": 4, "automat": [4, 27], "pass": [4, 5, 8, 24, 25, 26, 27, 28, 29, 30], "id": [4, 23], "number": [4, 7, 9, 12, 15, 24, 25], "slurm": [4, 15, 25], "script": [4, 27], "look": [4, 7], "like": [4, 27], "imag": [5, 27], "tag": 5, "latest": 5, "mnt": 5, "xarg": 5, "union": [5, 24, 29], "extra": 5, "loc": 5, "mode": [5, 7, 25], "ro": 5, "right": [5, 25], "includ": [5, 6, 12, 20, 27, 29, 30], "e": [5, 7, 8, 9, 11, 12, 20, 21, 22, 24, 26, 27, 29, 30, 31], "current": [5, 6, 7, 11, 12, 25], "data": [6, 7, 11, 31], "support": [6, 7, 8, 24, 25, 26, 27, 28, 29, 31], "direct": [6, 27, 28], "new_edg": 6, "new": [6, 7, 8, 11, 12, 23, 28, 30, 32], "new_edge_detail": 6, "fill": 6, "_nodes_detail": 6, "new_nod": 6, "insert": [6, 29], "maximum": [6, 15], "histori": 6, "predecessor": 6, "duplic": 6, "dictionari": [6, 9, 12, 20, 21, 23, 29, 30], "same": [6, 8, 11, 12, 20, 24, 26, 30, 31], "graph_det": 6, "nest": [6, 8, 24, 25, 27, 28, 32], "pair": [6, 8, 9, 24], "ext": 6, "png": 6, "dot": [6, 25], "each": [6, 9, 12, 24, 26, 27, 28, 29, 30, 31], "check_readi": 6, "re": [6, 12], "doe": [6, 23, 29, 31], "remove_node_connect": 6, "_node_wip": 6, "readi": 6, "also": [6, 11, 12, 25, 26, 29, 31], "prune": 6, "follow": [6, 7, 20, 26, 27, 31], "presort": 6, "either": [6, 8, 24], "administr": 7, "framework": [7, 28], "lockfil": 7, "wrapper": [7, 15], "filelock": 7, "softfilelock": 7, "make": [7, 26, 28], "work": [7, 14, 25, 27, 28, 31], "asyncio": [7, 15], "_": 7, "attribut": [7, 15, 25, 27, 31], "allowed_valu": [7, 29], "argstr": [7, 27, 29], "value_upd": 7, "field_nam": [7, 11], "updat": [7, 8, 11, 12, 16, 17, 25], "wf_path": 7, "given": [7, 8, 23, 24], "string": [7, 8, 11, 14, 20, 23, 29], "tuple2list": 7, "whatev": 7, "exampl": [7, 16, 17, 20, 24, 26, 27, 29, 30, 31], "abc": 7, "b": [7, 9, 12, 20, 24], "c": [7, 9, 26, 28], "5": [7, 21, 23, 27, 28], "cmd": [7, 14, 15], "event": 7, "unless": [7, 29, 30], "alreadi": [7, 8, 20, 25], "convert": [7, 9, 11, 24, 25, 27, 29], "item": [7, 8, 20, 24], "length": [7, 8, 9, 31], "extract": [7, 27], "cpu": [7, 11, 25], "total": [7, 23], "system": [7, 8, 14, 15, 20, 23, 25], "n_proc": [7, 15], "eventloop": 7, "task_pkl": [7, 15], "load": [7, 25], "proper": [7, 25], "restor": 7, "identifi": [7, 8, 20, 21, 24], "order": [7, 8, 12, 26, 27, 29, 30, 31], "prioriti": 7, "names_onli": 7, "fld": 7, "default_col": 7, "copycol": 7, "copyfil": [7, 29], "fmtstr": 7, "pars": [7, 8, 11, 13], "posit": [7, 27, 29], "convent": [7, 20], "lowest": 7, "highest": 7, "unspecifi": 7, "neg": [7, 29], "d": 7, "f": [7, 8, 20], "visit": 7, "its": [7, 20, 31], "interfac": [7, 12, 15, 25, 28], "hide_displai": 7, "captur": [7, 28], "standard": [7, 9, 11, 21], "displai": 7, "arriv": 7, "stream": 7, "read": [7, 8, 14, 25], "eof": 7, "discuss": 7, "stackoverflow": 7, "error_path": 7, "write": [7, 14, 21], "task_path": 7, "name_prefix": 7, "port": 8, "after": [8, 12, 26, 27, 31], "part": [8, 12, 14, 20, 24, 28, 29, 30], "were": [8, 25, 28], "relat": [8, 12, 31], "py2": 8, "resid": 8, "featur": [8, 27, 28, 31], "can": [8, 9, 11, 12, 20, 24, 25, 26, 27, 28, 29, 30, 31], "g": [8, 11, 12, 20, 24, 27, 29, 30], "symlink": 8, "classmethod": [8, 11, 24], "construct": [8, 20, 27, 28], "revers": [8, 9, 29], "point": [8, 11, 21, 27], "fall": 8, "under": 8, "cif": 8, "precomput": 8, "allow": [8, 21, 24, 25, 26, 27, 28, 29], "effici": 8, "would": [8, 26, 31], "On": 8, "empti": [8, 15, 25, 29], "mount_point": 8, "sit": 8, "fstype": 8, "ext4": 8, "posix": 8, "window": [8, 25], "through": [8, 31], "share": [8, 27, 28], "minshal": 8, "french": 8, "text": [8, 24], "driver": 8, "expos": 8, "we": [8, 27, 29], "found": [8, 24], "concurr": [8, 15, 25], "access": [8, 11], "failur": [8, 25], "recent": 8, "lead": 8, "inconsist": 8, "behavior": 8, "filenotfounderror": 8, "disabl": [8, 29], "nb": 8, "sub": [8, 20, 24], "filemanip": 8, "adapt": [8, 25], "http": 8, "github": 8, "com": 8, "nipi": 8, "path1": 8, "path2": 8, "two": [8, 26, 27, 31], "logic": 8, "exit_cod": 8, "produc": [8, 20], "fs_type": 8, "separ": [8, 14, 18, 25, 27, 29, 30], "_generate_cifs_t": 8, "test": [8, 15, 25], "real": 8, "mount_tabl": 8, "patch": 8, "tabl": 8, "routin": 8, "dest_dir": 8, "supported_mod": 8, "copymod": 8, "within": [8, 13, 24, 26, 27], "destin": 8, "origin": [8, 9, 14, 28, 31], "note": [8, 22, 26, 27, 28], "differenti": [8, 11], "parent": [8, 27, 29, 30], "otherwis": [8, 23, 30], "clash": 8, "directli": [8, 20, 27], "onto": 8, "fileset": 8, "filenam": [8, 23], "state_ind": 8, "map_copyfil": 8, "templat": [8, 11, 18, 25, 27, 29, 30], "present": 8, "inputs_dict_st": 8, "spec_typ": 8, "inputs_dict": 8, "output_file_templ": [8, 27, 29, 30], "addit": [9, 11, 26, 27, 28, 29, 30, 31], "mostli": 9, "except": [9, 15, 22, 24, 25], "custom": [9, 20, 25, 27, 29, 30], "group": [9, 12, 27, 28, 32], "groups_stack": 9, "kei": [9, 12, 20, 27, 28, 29, 31], "axi": [9, 12], "ax": [9, 12], "specifi": [9, 12, 24, 25, 26, 27, 29, 30], "cur_depth": 9, "max_depth": 9, "inp": [9, 12], "shape": 9, "iter": [9, 11, 20, 24], "split_it": 9, "prescrib": 9, "inputs_to_remov": 9, "due": [9, 12], "mutat": 9, "polish": 9, "notat": [9, 12], "recurr": 9, "algorithm": [9, 28], "perform": [9, 23, 24, 31], "convers": [9, 29], "everi": [9, 12, 29], "time": [9, 11, 28], "stack": [9, 12], "state_field": [9, 12], "translat": 9, "user": [9, 20, 25, 26, 27, 28, 29, 30, 31], "impos": 9, "unwrap": [9, 12], "flat": 9, "ty": [9, 11, 24], "file_path": 10, "dataclass": [11, 25], "medatada": 11, "xor": [11, 29], "fulfil": 11, "mandatori": [11, 27, 29, 30], "metadata": [11, 27, 32], "detect": 11, "chang": [11, 25, 29, 30], "invok": 11, "_noth": [11, 20], "noth": [11, 20, 25, 29, 30], "implement": [11, 14, 15, 20, 25, 28], "promis": 11, "new_typ": 11, "cast_field": 11, "strip_previ": 11, "consist": [11, 28], "arrai": [11, 25], "sequenc": [11, 20, 24], "signifi": 11, "across": [11, 20], "append": [11, 21], "frozenset": 11, "resolv": 11, "regard": 11, "float": [11, 16, 17, 23, 24, 27, 29], "repres": [11, 12, 26, 27, 28, 29, 31], "peak": 11, "consumpt": 11, "physic": 11, "ram": [11, 23], "virtual": 11, "memori": [11, 23, 25], "cwl": 11, "inlinejavascriptrequir": 11, "schemadefrequir": 11, "dockerrequir": 11, "softwarerequir": 11, "initialworkdirrequir": 11, "envvarrequir": 11, "shellcommandrequir": 11, "resourcerequir": 11, "inlinescriptrequir": 11, "take": [11, 26, 29, 30], "account": 11, "exit": 11, "code": [11, 21, 25, 28], "least": 11, "callabl": [11, 14, 24, 30], "hook": [11, 21], "exclude_nam": 11, "reduc": [12, 27, 28, 31], "about": [12, 29, 30], "scalar": [12, 32], "rpn": 12, "compact": [12, 21], "_na": 12, "import": [12, 16, 17, 20, 26, 27], "relev": 12, "could": [12, 29], "partial": [12, 28], "associ": [12, 28], "valid": [12, 25, 32], "correct": 12, "propag": 12, "explicitli": [12, 24], "had": 12, "prepar": 12, "merg": [12, 31], "elements_to_remove_comb": 12, "hlpst": 12, "evalu": [12, 31], "prev": 12, "come": 12, "art": 12, "_nb": 12, "especi": [12, 24], "address": [12, 28], "variabl": [12, 14, 25], "new_other_st": 12, "new_combin": 12, "neurodock": 14, "conda": 14, "env": 14, "niceman": 14, "config": 14, "intern": [14, 15, 23], "extern": [14, 28], "callback": [14, 23], "resum": 14, "dmtcp": 14, "local": [14, 15, 20, 29], "fragment": 14, "remot": [14, 21], "server": 14, "isol": 14, "func": [14, 16, 17, 20, 24], "respect": [14, 27], "quot": 14, "thereof": 14, "parallel": 15, "pool": 15, "dask": [15, 25], "distribut": [15, 25, 28], "experiment": [15, 25], "limit": [15, 24, 25, 27], "finish": 15, "submiss": 15, "py": 15, "attr": [15, 24, 25, 29, 30], "pend": 15, "job": 15, "psi": 15, "j": 15, "machin": 15, "psij": 15, "jobspec": 15, "poll_delai": 15, "qsub_arg": 15, "write_output_fil": 15, "max_job_array_length": 15, "50": 15, "indirect_submit_host": 15, "max_thread": 15, "poll_for_result_fil": 15, "default_threads_per_task": 15, "polls_before_checking_evict": 15, "60": 15, "collect_jobs_delai": 15, "30": 15, "default_qsub_arg": 15, "max_mem_fre": 15, "jobid": 15, "threads_request": 15, "task_qsub_arg": 15, "mem_fre": 15, "sge": 15, "api": [15, 25, 28], "sarg": 15, "tasks_to_run": 15, "error_fil": 15, "linearli": 15, "serial": [15, 20], "sbatch_arg": 15, "def": [16, 17, 20, 27], "squar": [16, 17, 31], "promot": [16, 17], "decor": [17, 27, 28], "appli": [17, 24, 26], "namespac": [18, 25], "reserv": 18, "manag": [18, 25, 31], "To": 18, "pleas": 18, "fork": 18, "dispatch": 20, "persistentcach": 20, "avoid": 20, "infinit": 20, "recurs": 20, "caus": 20, "circular": 20, "recomput": 20, "concept": [20, 25, 26, 27, 28, 31], "extend": [20, 24, 27, 28, 31], "certain": [20, 23], "expens": 20, "For": [20, 24], "bytes_repr": 20, "overrid": [20, 24], "yield": 20, "mtime": 20, "byte": 20, "content": 20, "concaten": 20, "seq": 20, "m": [20, 27, 29], "persistent_cach": 20, "regist": 20, "scope": 20, "prevent": 20, "unsaf": 20, "reus": [20, 28], "cl": [20, 24], "recommend": 20, "qualifi": 20, "prefix": 20, "colon": 20, "open": [20, 21, 28], "bracket": [20, 31], "mai": [20, 26, 28], "consid": [20, 23, 29], "These": [20, 26, 27, 28, 31], "As": [20, 27, 29, 30], "defin": [20, 24, 27], "__class__": 20, "__module__": 20, "__name__": 20, "encod": 20, "__dict__": 20, "must": 20, "permit": 20, "redirect": 21, "truncat": 21, "abstract": 21, "rest": 21, "endpoint": 21, "statu": [21, 23], "request": 21, "post": 21, "intenum": 21, "6": [21, 28], "collected_path": 21, "message_path": 21, "ld_op": 21, "compil": 21, "place": 21, "pld": 21, "jsonld": 21, "build": [21, 28, 29, 30], "non": 21, "timestamp": 21, "nidm": 21, "log": [21, 23], "11": 22, "compat": 22, "wai": [22, 26, 31], "again": 22, "exc_info": 22, "regex": 22, "pid": 23, "interv": 23, "logdir": 23, "thread": 23, "frequenc": 23, "mem_mb": 23, "num_thread": 23, "pyfunc": 23, "integ": [23, 24, 29], "high": 23, "watermark": 23, "far": 23, "dure": 23, "mb": 23, "gb": 23, "statist": [23, 27], "pipelin": [23, 28], "being": [23, 24, 28], "info": 23, "logger": 23, "pathlib": 24, "fileformat": 24, "decim": 24, "criteria": 24, "initialis": [24, 27], "checker": 24, "against": 24, "correspond": 24, "appear": 24, "tree": 24, "complex": [24, 27, 29, 31], "exclud": 24, "you": [24, 29, 30], "carv": 24, "out": [24, 26, 27], "superclass": 24, "instead": [24, 25, 30], "subclass": [24, 27], "parser": 24, "necessarili": [24, 28], "target_typ": 24, "modif": 24, "repeat": 24, "guard": 24, "modifi": 24, "coercion": 24, "rule": 24, "typeerror": 24, "cannot": 24, "explicit": 24, "inclus": 24, "exclus": [24, 29], "member": 24, "type_": 24, "source_repr": 24, "object_": 24, "attempt": 24, "static": 24, "substitut": 24, "simplif": 24, "constructor": 24, "typevar": 24, "assert": 24, "sequence_typ": 24, "find": 24, "item_typ": 24, "unsubscript": 24, "liter": 24, "classvar": 24, "unsupport": 24, "p": 24, "paramspec": 24, "42": 24, "candid": 24, "built": 24, "isinst": 24, "klass": 24, "any_ok": 24, "issubclass": 24, "__init__": 24, "factor": 24, "outsid": 24, "depth": [24, 28], "wa": [24, 28, 29, 30, 31], "only_split": 24, "inner_typ": 24, "fix": 25, "issu": 25, "extens": [25, 29, 30], "guid": [25, 28], "docstr": 25, "syntax": [25, 27, 29, 30, 31], "newer": 25, "padra": 25, "improv": [25, 27], "better": 25, "switch": 25, "pkg_resourc": 25, "declare_namespac": 25, "stdlib": 25, "pkgutil": 25, "extend_path": 25, "move": 25, "readm": 25, "rst": 25, "declar": [25, 27], "ensur": [25, 28], "edit": 25, "instal": 25, "conflict": 25, "mention": [25, 29, 30], "txt": 25, "tutori": 25, "repo": 25, "codecov": 25, "_connect": 25, "numpi": [25, 27], "to_job": 25, "kept": 25, "standalon": [25, 27, 28], "create_pyscript": 25, "simplifi": 25, "report": 25, "fli": 25, "make_class": 25, "properli": 25, "hash_dir": 25, "azur": 25, "ci": 25, "etelementri": 25, "verbos": 25, "reorgan": 25, "small": 25, "some": [25, 28], "osx": 25, "sto": 25, "travi": 25, "test_rerun": 25, "dimension": [25, 26], "how": [25, 27], "much": 25, "sphinx": 25, "document": 25, "container_arg": 25, "contribut": 25, "md": 25, "fail": 25, "big": 25, "shelltask": 25, "dockertask": [25, 27], "singularitytask": [25, 27], "next": [25, 27, 31], "all_": 25, "dataflow": [25, 26, 31, 32], "creation": 25, "notebook": 25, "initi": 25, "In": [26, 27, 28, 29, 30, 31], "achiev": 26, "sens": 26, "x": [26, 27, 31], "x_1": [26, 31], "x_2": [26, 31], "x_n": [26, 31], "mapsto": [26, 31], "out_": 26, "comb": 26, "x_i": 26, "situat": 26, "variou": 26, "section": [26, 27, 29, 30, 31], "might": [26, 27, 28], "want": [26, 29, 30], "y": [26, 27, 31], "y1": 26, "y2": 26, "y_m": [26, 31], "longmapsto": [26, 31], "y_1": [26, 31], "howev": [26, 29], "One": [26, 27, 31], "mix": 26, "level": 26, "describ": [27, 29, 31], "thu": 27, "dual": 27, "sever": [27, 28, 29], "applic": [27, 28, 31], "librari": [27, 28], "interact": [27, 28], "termin": 27, "np": 27, "fft": 27, "ndarrai": 27, "fft_task": 27, "random": 27, "rand": 27, "512": 27, "anoth": [27, 28], "arbitrari": [27, 28, 31], "mean": [27, 30], "std": 27, "mean_dev": 27, "my_data": 27, "st": 27, "stdev": 27, "facilit": [27, 28], "downstream": 27, "pwd": 27, "l": 27, "my_dir": 27, "accommod": 27, "fsl": [27, 28], "bet": [27, 29], "brain": 27, "tool": [27, 28], "input_fil": 27, "output_fil": 27, "treat": [27, 29], "shown": 27, "even": 27, "out_fil": [27, 29], "bet_input_spec": [27, 29], "in_fil": [27, 29], "help_str": [27, 29, 30], "_br": [27, 29], "mask": [27, 29], "binari": [27, 29], "containertask": [27, 29], "child": 27, "softwar": [27, 28], "extrem": 27, "project": [27, 28], "encapsul": 27, "technologi": 27, "scientif": [27, 28], "reproduc": [27, 28], "behind": [27, 28], "container_info": 27, "equival": 27, "busybox": 27, "act": 27, "hashabl": 27, "unit": 27, "unlik": 27, "emb": 27, "acycl": [27, 28], "simpli": 27, "special": [27, 29, 31], "assign": 27, "rather": 27, "mult": 27, "mlt": 27, "add2": 27, "control": [27, 31], "heart": 27, "power": [27, 28], "formal": 27, "Its": 27, "recombin": [27, 28], "task_with_st": 27, "respons": 27, "back": 27, "while": [27, 28], "illustr": 27, "scalabl": 27, "lightweight": 28, "neuroimag": 28, "commun": 28, "design": 28, "purpos": 28, "domain": 28, "often": 28, "sophist": 28, "analys": 28, "encompass": 28, "larg": 28, "author": 28, "program": 28, "common": 28, "practic": 28, "semi": 28, "manual": 28, "scientist": 28, "approach": 28, "conceptu": 28, "easi": 28, "consum": 28, "prone": 28, "difficult": 28, "demand": 28, "organ": 28, "fulli": 28, "autom": 28, "motiv": 28, "second": [28, 31], "uniform": 28, "compon": [28, 32], "born": 28, "decad": 28, "ant": 28, "afni": 28, "freesurf": 28, "spm": 28, "flexibl": [28, 31], "made": 28, "ideal": 28, "basi": 28, "popular": 28, "preprocess": 28, "fmriprep": 28, "pac": 28, "meant": 28, "eas": 28, "mind": 28, "itself": 28, "goal": [28, 31], "manipul": 28, "well": 28, "reusabl": 28, "customiz": 28, "compos": 28, "encourag": 28, "similar": [28, 31], "model": 28, "global": 28, "alongsid": 28, "integr": 28, "via": 28, "greater": 28, "mechan": 28, "activ": 28, "releas": 28, "8": 28, "7": 28, "programm": 28, "subpackag": 28, "search": 28, "page": 28, "let": 29, "alwai": [29, 30], "think": [29, 30], "usual": [29, 30], "top": [29, 30], "your": [29, 30], "cover": [29, 30], "customis": [29, 30], "three": [29, 30], "But": 29, "below": 29, "field1": 29, "field1_nam": 29, "ib": [29, 30], "field1_typ": 29, "shorter": 29, "abov": 29, "multioutputobj": 29, "short": [29, 30], "sep": 29, "v": 29, "inp_field": 29, "nonneg": 29, "mutual": 29, "hard": 29, "possibl": [29, 30], "container_path": 29, "file1": [29, 30], "output_field_nam": [29, 30], "keep_extens": [29, 30], "readonli": 29, "flda": 29, "fldb": 29, "formatt": 29, "entir": [29, 30], "allowev_valu": 29, "set_input_valid": 29, "out1": 30, "inp1": [30, 31], "inp2": [30, 31], "similarli": 30, "recogn": 30, "main": 31, "distinguish": 31, "typic": 31, "involv": 31, "signific": 31, "overhead": 31, "up": 31, "simplest": 31, "therefor": 31, "diagram": 31, "colour": 31, "whenev": 31, "complic": 31, "wise": 31, "parenthesi": 31, "y_2": 31, "y_n": 31, "schemat": 31, "inp3": 31, "pairwis": 31, "explain": 31}, "objects": {"": [[0, 0, 0, "-", "pydra"]], "pydra": [[0, 1, 1, "", "AuditFlag"], [0, 1, 1, "", "ShellCommandTask"], [0, 1, 1, "", "Submitter"], [0, 1, 1, "", "Workflow"], [1, 0, 0, "-", "engine"], [16, 0, 0, "-", "mark"], [18, 0, 0, "-", "tasks"], [19, 0, 0, "-", "utils"]], "pydra.AuditFlag": [[0, 2, 1, "", "ALL"], [0, 2, 1, "", "NONE"], [0, 2, 1, "", "PROV"], [0, 2, 1, "", "RESOURCE"]], "pydra.ShellCommandTask": [[0, 2, 1, "", "DEFAULT_COPY_COLLATION"], [0, 3, 1, "", "cmdline"], [0, 4, 1, "", "command_args"], [0, 4, 1, "", "get_bindings"], [0, 2, 1, "", "input_spec"], [0, 2, 1, "", "output_spec"]], "pydra.Submitter": [[0, 4, 1, "", "close"], [0, 4, 1, "", "expand_runnable"], [0, 4, 1, "", "expand_workflow"], [0, 4, 1, "", "submit_from_call"]], "pydra.Workflow": [[0, 4, 1, "", "add"], [0, 3, 1, "", "checksum"], [0, 4, 1, "", "create_connections"], [0, 4, 1, "", "create_dotfile"], [0, 3, 1, "", "graph_sorted"], [0, 3, 1, "", "lzin"], [0, 3, 1, "", "nodes"], [0, 4, 1, "", "set_output"]], "pydra.engine": [[1, 1, 1, "", "AuditFlag"], [1, 1, 1, "", "ShellCommandTask"], [1, 1, 1, "", "Submitter"], [1, 1, 1, "", "Workflow"], [2, 0, 0, "-", "audit"], [3, 0, 0, "-", "boutiques"], [4, 0, 0, "-", "core"], [5, 0, 0, "-", "environments"], [6, 0, 0, "-", "graph"], [7, 0, 0, "-", "helpers"], [8, 0, 0, "-", "helpers_file"], [9, 0, 0, "-", "helpers_state"], [10, 0, 0, "-", "run_pickled"], [11, 0, 0, "-", "specs"], [12, 0, 0, "-", "state"], [13, 0, 0, "-", "submitter"], [14, 0, 0, "-", "task"], [15, 0, 0, "-", "workers"]], "pydra.engine.AuditFlag": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "NONE"], [1, 2, 1, "", "PROV"], [1, 2, 1, "", "RESOURCE"]], "pydra.engine.ShellCommandTask": [[1, 2, 1, "", "DEFAULT_COPY_COLLATION"], [1, 3, 1, "", "cmdline"], [1, 4, 1, "", "command_args"], [1, 4, 1, "", "get_bindings"], [1, 2, 1, "", "input_spec"], [1, 2, 1, "", "output_spec"]], "pydra.engine.Submitter": [[1, 4, 1, "", "close"], [1, 4, 1, "", "expand_runnable"], [1, 4, 1, "", "expand_workflow"], [1, 4, 1, "", "submit_from_call"]], "pydra.engine.Workflow": [[1, 4, 1, "", "add"], [1, 3, 1, "", "checksum"], [1, 4, 1, "", "create_connections"], [1, 4, 1, "", "create_dotfile"], [1, 3, 1, "", "graph_sorted"], [1, 3, 1, "", "lzin"], [1, 3, 1, "", "nodes"], [1, 4, 1, "", "set_output"]], "pydra.engine.audit": [[2, 1, 1, "", "Audit"]], "pydra.engine.audit.Audit": [[2, 4, 1, "", "audit_check"], [2, 4, 1, "", "audit_message"], [2, 4, 1, "", "audit_task"], [2, 4, 1, "", "finalize_audit"], [2, 4, 1, "", "monitor"], [2, 4, 1, "", "start_audit"]], "pydra.engine.boutiques": [[3, 1, 1, "", "BoshTask"]], "pydra.engine.core": [[4, 1, 1, "", "TaskBase"], [4, 1, 1, "", "Workflow"], [4, 5, 1, "", "is_lazy"], [4, 5, 1, "", "is_task"], [4, 5, 1, "", "is_workflow"]], "pydra.engine.core.TaskBase": [[4, 2, 1, "", "DEFAULT_COPY_COLLATION"], [4, 2, 1, "", "SUPPORTED_COPY_MODES"], [4, 2, 1, "", "audit_flags"], [4, 3, 1, "", "cache_dir"], [4, 3, 1, "", "cache_locations"], [4, 3, 1, "", "can_resume"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "checksum_states"], [4, 4, 1, "", "combine"], [4, 3, 1, "", "cont_dim"], [4, 3, 1, "", "done"], [4, 3, 1, "", "errored"], [4, 3, 1, "", "generated_output_names"], [4, 4, 1, "", "get_input_el"], [4, 4, 1, "", "help"], [4, 3, 1, "", "lzout"], [4, 3, 1, "", "output_dir"], [4, 3, 1, "", "output_names"], [4, 4, 1, "", "pickle_task"], [4, 4, 1, "", "result"], [4, 4, 1, "", "set_state"], [4, 4, 1, "", "split"], [4, 3, 1, "", "uid"], [4, 3, 1, "", "version"]], "pydra.engine.core.Workflow": [[4, 4, 1, "", "add"], [4, 3, 1, "", "checksum"], [4, 4, 1, "", "create_connections"], [4, 4, 1, "", "create_dotfile"], [4, 3, 1, "", "graph_sorted"], [4, 3, 1, "", "lzin"], [4, 3, 1, "", "nodes"], [4, 4, 1, "", "set_output"]], "pydra.engine.environments": [[5, 1, 1, "", "Container"], [5, 1, 1, "", "Docker"], [5, 1, 1, "", "Environment"], [5, 1, 1, "", "Native"], [5, 1, 1, "", "Singularity"]], "pydra.engine.environments.Container": [[5, 4, 1, "", "bind"]], "pydra.engine.environments.Docker": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Environment": [[5, 4, 1, "", "execute"], [5, 4, 1, "", "setup"], [5, 4, 1, "", "teardown"]], "pydra.engine.environments.Native": [[5, 4, 1, "", "execute"]], "pydra.engine.environments.Singularity": [[5, 4, 1, "", "execute"]], "pydra.engine.graph": [[6, 1, 1, "", "DiGraph"]], "pydra.engine.graph.DiGraph": [[6, 4, 1, "", "add_edges"], [6, 4, 1, "", "add_edges_description"], [6, 4, 1, "", "add_nodes"], [6, 4, 1, "", "calculate_max_paths"], [6, 4, 1, "", "copy"], [6, 4, 1, "", "create_dotfile_detailed"], [6, 4, 1, "", "create_dotfile_nested"], [6, 4, 1, "", "create_dotfile_simple"], [6, 3, 1, "", "edges"], [6, 3, 1, "", "edges_names"], [6, 4, 1, "", "export_graph"], [6, 3, 1, "", "nodes"], [6, 3, 1, "", "nodes_details"], [6, 3, 1, "", "nodes_names_map"], [6, 4, 1, "", "remove_nodes"], [6, 4, 1, "", "remove_nodes_connections"], [6, 4, 1, "", "remove_previous_connections"], [6, 4, 1, "", "remove_successors_nodes"], [6, 3, 1, "", "sorted_nodes"], [6, 3, 1, "", "sorted_nodes_names"], [6, 4, 1, "", "sorting"]], "pydra.engine.helpers": [[7, 1, 1, "", "PydraFileLock"], [7, 5, 1, "", "allowed_values_validator"], [7, 5, 1, "", "argstr_formatting"], [7, 5, 1, "", "copyfile_workflow"], [7, 5, 1, "", "create_checksum"], [7, 5, 1, "", "ensure_list"], [7, 5, 1, "", "execute"], [7, 5, 1, "", "from_list_if_single"], [7, 5, 1, "", "gather_runtime_info"], [7, 5, 1, "", "get_available_cpus"], [7, 5, 1, "", "get_open_loop"], [7, 5, 1, "", "load_and_run"], [7, 5, 1, "", "load_and_run_async"], [7, 5, 1, "", "load_result"], [7, 5, 1, "", "load_task"], [7, 5, 1, "", "make_klass"], [7, 5, 1, "", "output_from_inputfields"], [7, 5, 1, "", "parse_copyfile"], [7, 5, 1, "", "parse_format_string"], [7, 5, 1, "", "position_sort"], [7, 5, 1, "", "print_help"], [7, 5, 1, "", "read_and_display"], [7, 5, 1, "", "read_and_display_async"], [7, 5, 1, "", "read_stream_and_display"], [7, 5, 1, "", "record_error"], [7, 5, 1, "", "save"]], "pydra.engine.helpers_file": [[8, 1, 1, "", "MountIndentifier"], [8, 5, 1, "", "copy_nested_files"], [8, 5, 1, "", "ensure_list"], [8, 5, 1, "", "is_container"], [8, 5, 1, "", "is_local_file"], [8, 5, 1, "", "template_update"], [8, 5, 1, "", "template_update_single"]], "pydra.engine.helpers_file.MountIndentifier": [[8, 4, 1, "", "generate_cifs_table"], [8, 4, 1, "", "get_mount"], [8, 4, 1, "", "get_mount_table"], [8, 4, 1, "", "on_cifs"], [8, 4, 1, "", "on_same_mount"], [8, 4, 1, "", "parse_mount_table"], [8, 4, 1, "", "patch_table"]], "pydra.engine.helpers_state": [[9, 6, 1, "", "PydraStateError"], [9, 5, 1, "", "add_name_combiner"], [9, 5, 1, "", "add_name_splitter"], [9, 5, 1, "", "combine_final_groups"], [9, 5, 1, "", "converter_groups_to_input"], [9, 5, 1, "", "flatten"], [9, 5, 1, "", "input_shape"], [9, 5, 1, "", "inputs_types_to_dict"], [9, 5, 1, "", "iter_splits"], [9, 5, 1, "", "map_splits"], [9, 5, 1, "", "remove_inp_from_splitter_rpn"], [9, 5, 1, "", "rpn2splitter"], [9, 5, 1, "", "splits_groups"], [9, 5, 1, "", "splitter2rpn"], [9, 5, 1, "", "unwrap_splitter"]], "pydra.engine.run_pickled": [[10, 5, 1, "", "run_pickled"]], "pydra.engine.specs": [[11, 1, 1, "", "BaseSpec"], [11, 1, 1, "", "FunctionSpec"], [11, 1, 1, "", "LazyField"], [11, 1, 1, "", "LazyIn"], [11, 1, 1, "", "LazyInField"], [11, 1, 1, "", "LazyInterface"], [11, 1, 1, "", "LazyOut"], [11, 1, 1, "", "LazyOutField"], [11, 1, 1, "", "MultiInputObj"], [11, 1, 1, "", "MultiOutputType"], [11, 1, 1, "", "Result"], [11, 1, 1, "", "Runtime"], [11, 1, 1, "", "RuntimeSpec"], [11, 1, 1, "", "ShellOutSpec"], [11, 1, 1, "", "ShellSpec"], [11, 1, 1, "", "SpecInfo"], [11, 1, 1, "", "StateArray"], [11, 1, 1, "", "TaskHook"], [11, 5, 1, "", "attr_fields"], [11, 5, 1, "", "donothing"], [11, 5, 1, "", "path_to_string"]], "pydra.engine.specs.BaseSpec": [[11, 4, 1, "", "check_fields_input_spec"], [11, 4, 1, "", "check_metadata"], [11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "copyfile_input"], [11, 3, 1, "", "hash"], [11, 4, 1, "", "hash_changes"], [11, 4, 1, "", "retrieve_values"], [11, 4, 1, "", "template_update"]], "pydra.engine.specs.FunctionSpec": [[11, 4, 1, "", "check_metadata"]], "pydra.engine.specs.LazyField": [[11, 4, 1, "", "cast"], [11, 2, 1, "", "cast_from"], [11, 2, 1, "", "field"], [11, 2, 1, "", "name"], [11, 4, 1, "", "sanitize_splitter"], [11, 4, 1, "", "split"], [11, 2, 1, "", "splits"], [11, 2, 1, "", "type"]], "pydra.engine.specs.LazyInField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.LazyOutField": [[11, 2, 1, "", "attr_type"], [11, 4, 1, "", "get_value"]], "pydra.engine.specs.Result": [[11, 2, 1, "", "errored"], [11, 4, 1, "", "get_output_field"], [11, 2, 1, "", "output"], [11, 2, 1, "", "runtime"]], "pydra.engine.specs.Runtime": [[11, 2, 1, "", "cpu_peak_percent"], [11, 2, 1, "", "rss_peak_gb"], [11, 2, 1, "", "vms_peak_gb"]], "pydra.engine.specs.RuntimeSpec": [[11, 2, 1, "", "container"], [11, 2, 1, "", "network"], [11, 2, 1, "", "outdir"]], "pydra.engine.specs.ShellOutSpec": [[11, 4, 1, "", "collect_additional_outputs"], [11, 4, 1, "", "generated_output_names"], [11, 2, 1, "", "return_code"], [11, 2, 1, "", "stderr"], [11, 2, 1, "", "stdout"]], "pydra.engine.specs.ShellSpec": [[11, 2, 1, "", "args"], [11, 4, 1, "", "check_metadata"], [11, 2, 1, "", "executable"], [11, 4, 1, "", "retrieve_values"]], "pydra.engine.specs.SpecInfo": [[11, 2, 1, "", "bases"], [11, 2, 1, "", "fields"], [11, 2, 1, "", "name"]], "pydra.engine.specs.TaskHook": [[11, 2, 1, "", "post_run"], [11, 2, 1, "", "post_run_task"], [11, 2, 1, "", "pre_run"], [11, 2, 1, "", "pre_run_task"], [11, 4, 1, "", "reset"]], "pydra.engine.state": [[12, 1, 1, "", "State"]], "pydra.engine.state.State": [[12, 3, 1, "id0", "combiner"], [12, 4, 1, "", "combiner_validation"], [12, 3, 1, "", "current_combiner"], [12, 3, 1, "", "current_combiner_all"], [12, 3, 1, "", "current_splitter"], [12, 3, 1, "", "current_splitter_rpn"], [12, 2, 1, "", "final_combined_ind_mapping"], [12, 2, 1, "", "group_for_inputs"], [12, 2, 1, "", "group_for_inputs_final"], [12, 2, 1, "", "groups_stack_final"], [12, 3, 1, "id1", "inner_inputs"], [12, 2, 1, "", "inputs_ind"], [12, 2, 1, "", "name"], [12, 3, 1, "id2", "other_states"], [12, 4, 1, "", "prepare_inputs"], [12, 4, 1, "", "prepare_states"], [12, 4, 1, "", "prepare_states_combined_ind"], [12, 4, 1, "", "prepare_states_ind"], [12, 4, 1, "", "prepare_states_val"], [12, 3, 1, "", "prev_state_combiner"], [12, 3, 1, "", "prev_state_combiner_all"], [12, 3, 1, "", "prev_state_splitter"], [12, 3, 1, "", "prev_state_splitter_rpn"], [12, 3, 1, "", "prev_state_splitter_rpn_compact"], [12, 4, 1, "", "set_input_groups"], [12, 4, 1, "", "splits"], [12, 3, 1, "id3", "splitter"], [12, 3, 1, "id4", "splitter_final"], [12, 3, 1, "id5", "splitter_rpn"], [12, 3, 1, "id6", "splitter_rpn_compact"], [12, 3, 1, "", "splitter_rpn_final"], [12, 4, 1, "", "splitter_validation"], [12, 2, 1, "", "states_ind"], [12, 2, 1, "", "states_val"], [12, 4, 1, "", "update_connections"]], "pydra.engine.submitter": [[13, 1, 1, "", "Submitter"], [13, 5, 1, "", "get_runnable_tasks"], [13, 5, 1, "", "is_runnable"], [13, 5, 1, "", "prepare_runnable_with_state"]], "pydra.engine.submitter.Submitter": [[13, 4, 1, "", "close"], [13, 4, 1, "", "expand_runnable"], [13, 4, 1, "", "expand_workflow"], [13, 4, 1, "", "submit_from_call"]], "pydra.engine.task": [[14, 1, 1, "", "FunctionTask"], [14, 1, 1, "", "ShellCommandTask"], [14, 5, 1, "", "split_cmd"]], "pydra.engine.task.ShellCommandTask": [[14, 2, 1, "", "DEFAULT_COPY_COLLATION"], [14, 3, 1, "", "cmdline"], [14, 4, 1, "", "command_args"], [14, 4, 1, "", "get_bindings"], [14, 2, 1, "", "input_spec"], [14, 2, 1, "", "output_spec"]], "pydra.engine.workers": [[15, 1, 1, "", "ConcurrentFuturesWorker"], [15, 1, 1, "", "DaskWorker"], [15, 1, 1, "", "DistributedWorker"], [15, 1, 1, "", "PsijLocalWorker"], [15, 1, 1, "", "PsijSlurmWorker"], [15, 1, 1, "", "PsijWorker"], [15, 1, 1, "", "SGEWorker"], [15, 1, 1, "", "SerialWorker"], [15, 1, 1, "", "SlurmWorker"], [15, 1, 1, "", "Worker"]], "pydra.engine.workers.ConcurrentFuturesWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_as_coro"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DaskWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_dask"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.DistributedWorker": [[15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "max_jobs"]], "pydra.engine.workers.PsijLocalWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijSlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 2, 1, "", "subtype"]], "pydra.engine.workers.PsijWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_psij"], [15, 4, 1, "", "make_job"], [15, 4, 1, "", "make_spec"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SGEWorker": [[15, 4, 1, "", "check_for_results_files"], [15, 4, 1, "", "get_output_by_task_pkl"], [15, 4, 1, "", "get_tasks_to_run"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"], [15, 4, 1, "", "submit_array_job"]], "pydra.engine.workers.SerialWorker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "exec_serial"], [15, 4, 1, "", "fetch_finished"], [15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.SlurmWorker": [[15, 2, 1, "", "plugin_name"], [15, 4, 1, "", "run_el"]], "pydra.engine.workers.Worker": [[15, 4, 1, "", "close"], [15, 4, 1, "", "fetch_finished"], [15, 4, 1, "", "run_el"]], "pydra.mark": [[16, 5, 1, "", "annotate"], [17, 0, 0, "-", "functions"], [16, 5, 1, "", "task"]], "pydra.mark.functions": [[17, 5, 1, "", "annotate"], [17, 5, 1, "", "task"]], "pydra.utils": [[20, 0, 0, "-", "hash"], [21, 0, 0, "-", "messenger"], [22, 0, 0, "-", "misc"], [23, 0, 0, "-", "profiler"], [24, 0, 0, "-", "typing"]], "pydra.utils.hash": [[20, 1, 1, "", "Cache"], [20, 5, 1, "", "bytes_repr_mapping_contents"], [20, 5, 1, "", "bytes_repr_sequence_contents"], [20, 5, 1, "", "hash_function"], [20, 5, 1, "", "hash_object"], [20, 5, 1, "", "hash_single"], [20, 5, 1, "", "register_serializer"]], "pydra.utils.hash.Cache": [[20, 2, 1, "", "persistent"]], "pydra.utils.messenger": [[21, 1, 1, "", "AuditFlag"], [21, 1, 1, "", "FileMessenger"], [21, 1, 1, "", "Messenger"], [21, 1, 1, "", "PrintMessenger"], [21, 1, 1, "", "RemoteRESTMessenger"], [21, 1, 1, "", "RuntimeHooks"], [21, 5, 1, "", "collect_messages"], [21, 5, 1, "", "gen_uuid"], [21, 5, 1, "", "make_message"], [21, 5, 1, "", "now"], [21, 5, 1, "", "send_message"]], "pydra.utils.messenger.AuditFlag": [[21, 2, 1, "", "ALL"], [21, 2, 1, "", "NONE"], [21, 2, 1, "", "PROV"], [21, 2, 1, "", "RESOURCE"]], "pydra.utils.messenger.FileMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.Messenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.PrintMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RemoteRESTMessenger": [[21, 4, 1, "", "send"]], "pydra.utils.messenger.RuntimeHooks": [[21, 2, 1, "", "resource_monitor_post_stop"], [21, 2, 1, "", "resource_monitor_pre_start"], [21, 2, 1, "", "task_execute_post_exit"], [21, 2, 1, "", "task_execute_pre_entry"], [21, 2, 1, "", "task_run_entry"], [21, 2, 1, "", "task_run_exit"]], "pydra.utils.misc": [[22, 5, 1, "", "add_exc_note"], [22, 5, 1, "", "exc_info_matches"]], "pydra.utils.profiler": [[23, 1, 1, "", "ResourceMonitor"], [23, 5, 1, "", "get_max_resources_used"], [23, 5, 1, "", "get_system_total_memory_gb"], [23, 5, 1, "", "log_nodes_cb"]], "pydra.utils.profiler.ResourceMonitor": [[23, 3, 1, "", "fname"], [23, 4, 1, "", "run"], [23, 4, 1, "", "stop"]], "pydra.utils.typing": [[24, 1, 1, "", "TypeParser"]], "pydra.utils.typing.TypeParser": [[24, 2, 1, "", "COERCIBLE_DEFAULT"], [24, 2, 1, "", "NOT_COERCIBLE_DEFAULT"], [24, 4, 1, "", "apply_to_instances"], [24, 4, 1, "", "check_coercible"], [24, 4, 1, "", "check_type"], [24, 4, 1, "", "check_type_coercible"], [24, 4, 1, "", "coerce"], [24, 2, 1, "", "coercible"], [24, 4, 1, "", "contains_type"], [24, 4, 1, "", "get_args"], [24, 4, 1, "", "get_item_type"], [24, 4, 1, "", "get_origin"], [24, 4, 1, "", "is_instance"], [24, 4, 1, "", "is_subclass"], [24, 2, 1, "", "label"], [24, 3, 1, "", "label_str"], [24, 2, 1, "", "match_any_of_union"], [24, 4, 1, "", "matches"], [24, 4, 1, "", "matches_type"], [24, 2, 1, "", "not_coercible"], [24, 4, 1, "", "strip_splits"], [24, 2, 1, "", "superclass_auto_cast"], [24, 2, 1, "", "tp"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:property", "4": "py:method", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "property", "Python property"], "4": ["py", "method", "Python method"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"librari": 0, "api": 0, "applic": 0, "programm": 0, "interfac": 0, "subpackag": 0, "pydra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 28], "engin": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 28], "packag": [1, 16, 18, 19], "submodul": [1, 16, 19], "audit": 2, "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 24], "boutiqu": 3, "core": 4, "environ": 5, "graph": 6, "helper": 7, "helpers_fil": 8, "helpers_st": 9, "run_pickl": 10, "spec": [11, 29], "state": [12, 27, 31], "submitt": 13, "task": [14, 18, 26, 27], "note": [14, 25], "worker": 15, "mark": [16, 17], "function": [17, 27], "util": [19, 20, 21, 22, 23, 24], "hash": 20, "messeng": 21, "misc": 22, "profil": 23, "type": [24, 29, 31], "releas": 25, "0": 25, "8": 25, "7": 25, "6": 25, "2": 25, "1": 25, "5": 25, "4": 25, "3": 25, "group": 26, "": [26, 27, 28], "output": [26, 30], "dataflow": [27, 28], "compon": 27, "workflow": 27, "shell": 27, "command": 27, "contain": 27, "welcom": 28, "A": 28, "simpl": 28, "scalabl": 28, "semant": 28, "document": 28, "content": 28, "indic": 28, "tabl": 28, "input": [29, 31], "specif": [29, 30], "ad": 29, "new": 29, "field": 29, "metadata": [29, 30], "valid": 29, "nest": 31, "loop": 31, "over": 31, "splitter": 31, "scalar": 31, "outer": 31, "user": 32, "guid": 32}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Library API (application programmer interface)": [[0, "module-pydra"]], "Subpackages": [[0, "subpackages"]], "pydra.engine package": [[1, "module-pydra.engine"]], "Submodules": [[1, "submodules"], [16, "submodules"], [19, "submodules"]], "pydra.engine.audit module": [[2, "module-pydra.engine.audit"]], "pydra.engine.boutiques module": [[3, "module-pydra.engine.boutiques"]], "pydra.engine.core module": [[4, "module-pydra.engine.core"]], "pydra.engine.environments module": [[5, "module-pydra.engine.environments"]], "pydra.engine.graph module": [[6, "module-pydra.engine.graph"]], "pydra.engine.helpers module": [[7, "module-pydra.engine.helpers"]], "pydra.engine.helpers_file module": [[8, "module-pydra.engine.helpers_file"]], "pydra.engine.helpers_state module": [[9, "module-pydra.engine.helpers_state"]], "pydra.engine.run_pickled module": [[10, "module-pydra.engine.run_pickled"]], "pydra.engine.specs module": [[11, "module-pydra.engine.specs"]], "pydra.engine.state module": [[12, "module-pydra.engine.state"]], "pydra.engine.submitter module": [[13, "module-pydra.engine.submitter"]], "pydra.engine.task module": [[14, "module-pydra.engine.task"]], "Notes:": [[14, null]], "pydra.engine.workers module": [[15, "module-pydra.engine.workers"]], "pydra.mark package": [[16, "module-pydra.mark"]], "pydra.mark.functions module": [[17, "module-pydra.mark.functions"]], "pydra.tasks package": [[18, "module-pydra.tasks"]], "pydra.utils package": [[19, "module-pydra.utils"]], "pydra.utils.hash module": [[20, "module-pydra.utils.hash"]], "pydra.utils.messenger module": [[21, "module-pydra.utils.messenger"]], "pydra.utils.misc module": [[22, "module-pydra.utils.misc"]], "pydra.utils.profiler module": [[23, "module-pydra.utils.profiler"]], "pydra.utils.typing module": [[24, "module-pydra.utils.typing"]], "Release Notes": [[25, "release-notes"]], "0.8.0": [[25, "id1"]], "0.7.0": [[25, "id2"]], "0.6.2": [[25, "id3"]], "0.6.1": [[25, "id4"]], "0.6": [[25, "id5"]], "0.5": [[25, "id6"]], "0.4": [[25, "id7"]], "0.3.1": [[25, "id8"]], "0.3": [[25, "id9"]], "0.2.2": [[25, "id10"]], "0.2.1": [[25, "id11"]], "0.2": [[25, "id12"]], "0.1": [[25, "id13"]], "0.0.1": [[25, "id14"]], "Grouping Task\u2019s Output": [[26, "grouping-task-s-output"]], "Dataflows Components: Task and Workflow": [[27, "dataflows-components-task-and-workflow"]], "Function Tasks": [[27, "function-tasks"]], "Shell Command Tasks": [[27, "shell-command-tasks"]], "Container Tasks": [[27, "container-tasks"]], "Workflows": [[27, "workflows"]], "Task\u2019s State": [[27, "task-s-state"]], "Welcome to Pydra: A simple dataflow engine with scalable semantics\u2019s documentation!": [[28, "welcome-to-pydra-a-simple-dataflow-engine-with-scalable-semantics-s-documentation"]], "Contents:": [[28, null]], "Indices and tables": [[28, "indices-and-tables"]], "Input Specification": [[29, "input-specification"]], "Adding a New Field to the Spec": [[29, "adding-a-new-field-to-the-spec"]], "Types": [[29, "types"]], "Metadata": [[29, "metadata"], [30, "metadata"]], "Validators": [[29, "validators"]], "Output Specification": [[30, "output-specification"]], "State and Nested Loops over Input": [[31, "state-and-nested-loops-over-input"]], "Types of Splitter": [[31, "types-of-splitter"]], "Scalar Splitter": [[31, "scalar-splitter"]], "Outer Splitter": [[31, "outer-splitter"]], "User Guide": [[32, "user-guide"]]}, "indexentries": {"all (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.ALL"]], "auditflag (class in pydra)": [[0, "pydra.AuditFlag"]], "default_copy_collation (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.NONE"]], "prov (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.PROV"]], "resource (pydra.auditflag attribute)": [[0, "pydra.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra)": [[0, "pydra.ShellCommandTask"]], "submitter (class in pydra)": [[0, "pydra.Submitter"]], "workflow (class in pydra)": [[0, "pydra.Workflow"]], "add() (pydra.workflow method)": [[0, "pydra.Workflow.add"]], "checksum (pydra.workflow property)": [[0, "pydra.Workflow.checksum"]], "close() (pydra.submitter method)": [[0, "pydra.Submitter.close"]], "cmdline (pydra.shellcommandtask property)": [[0, "pydra.ShellCommandTask.cmdline"]], "command_args() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.command_args"]], "create_connections() (pydra.workflow method)": [[0, "pydra.Workflow.create_connections"]], "create_dotfile() (pydra.workflow method)": [[0, "pydra.Workflow.create_dotfile"]], "expand_runnable() (pydra.submitter method)": [[0, "pydra.Submitter.expand_runnable"]], "expand_workflow() (pydra.submitter method)": [[0, "pydra.Submitter.expand_workflow"]], "get_bindings() (pydra.shellcommandtask method)": [[0, "pydra.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.workflow property)": [[0, "pydra.Workflow.graph_sorted"]], "input_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.input_spec"]], "lzin (pydra.workflow property)": [[0, "pydra.Workflow.lzin"]], "module": [[0, "module-pydra"], [1, "module-pydra.engine"], [2, "module-pydra.engine.audit"], [3, "module-pydra.engine.boutiques"], [4, "module-pydra.engine.core"], [5, "module-pydra.engine.environments"], [6, "module-pydra.engine.graph"], [7, "module-pydra.engine.helpers"], [8, "module-pydra.engine.helpers_file"], [9, "module-pydra.engine.helpers_state"], [10, "module-pydra.engine.run_pickled"], [11, "module-pydra.engine.specs"], [12, "module-pydra.engine.state"], [13, "module-pydra.engine.submitter"], [14, "module-pydra.engine.task"], [15, "module-pydra.engine.workers"], [16, "module-pydra.mark"], [17, "module-pydra.mark.functions"], [18, "module-pydra.tasks"], [19, "module-pydra.utils"], [20, "module-pydra.utils.hash"], [21, "module-pydra.utils.messenger"], [22, "module-pydra.utils.misc"], [23, "module-pydra.utils.profiler"], [24, "module-pydra.utils.typing"]], "nodes (pydra.workflow property)": [[0, "pydra.Workflow.nodes"]], "output_spec (pydra.shellcommandtask attribute)": [[0, "pydra.ShellCommandTask.output_spec"]], "pydra": [[0, "module-pydra"]], "set_output() (pydra.workflow method)": [[0, "pydra.Workflow.set_output"]], "submit_from_call() (pydra.submitter method)": [[0, "pydra.Submitter.submit_from_call"]], "all (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.ALL"]], "auditflag (class in pydra.engine)": [[1, "pydra.engine.AuditFlag"]], "default_copy_collation (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "none (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.NONE"]], "prov (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.PROV"]], "resource (pydra.engine.auditflag attribute)": [[1, "pydra.engine.AuditFlag.RESOURCE"]], "shellcommandtask (class in pydra.engine)": [[1, "pydra.engine.ShellCommandTask"]], "submitter (class in pydra.engine)": [[1, "pydra.engine.Submitter"]], "workflow (class in pydra.engine)": [[1, "pydra.engine.Workflow"]], "add() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.add"]], "checksum (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.checksum"]], "close() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.close"]], "cmdline (pydra.engine.shellcommandtask property)": [[1, "pydra.engine.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.command_args"]], "create_connections() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_connections"]], "create_dotfile() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.create_dotfile"]], "expand_runnable() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.expand_workflow"]], "get_bindings() (pydra.engine.shellcommandtask method)": [[1, "pydra.engine.ShellCommandTask.get_bindings"]], "graph_sorted (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.graph_sorted"]], "input_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.input_spec"]], "lzin (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.lzin"]], "nodes (pydra.engine.workflow property)": [[1, "pydra.engine.Workflow.nodes"]], "output_spec (pydra.engine.shellcommandtask attribute)": [[1, "pydra.engine.ShellCommandTask.output_spec"]], "pydra.engine": [[1, "module-pydra.engine"]], "set_output() (pydra.engine.workflow method)": [[1, "pydra.engine.Workflow.set_output"]], "submit_from_call() (pydra.engine.submitter method)": [[1, "pydra.engine.Submitter.submit_from_call"]], "audit (class in pydra.engine.audit)": [[2, "pydra.engine.audit.Audit"]], "audit_check() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_check"]], "audit_message() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_message"]], "audit_task() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.audit_task"]], "finalize_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.finalize_audit"]], "monitor() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.monitor"]], "pydra.engine.audit": [[2, "module-pydra.engine.audit"]], "start_audit() (pydra.engine.audit.audit method)": [[2, "pydra.engine.audit.Audit.start_audit"]], "boshtask (class in pydra.engine.boutiques)": [[3, "pydra.engine.boutiques.BoshTask"]], "pydra.engine.boutiques": [[3, "module-pydra.engine.boutiques"]], "default_copy_collation (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.DEFAULT_COPY_COLLATION"]], "supported_copy_modes (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.SUPPORTED_COPY_MODES"]], "taskbase (class in pydra.engine.core)": [[4, "pydra.engine.core.TaskBase"]], "workflow (class in pydra.engine.core)": [[4, "pydra.engine.core.Workflow"]], "add() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.add"]], "audit_flags (pydra.engine.core.taskbase attribute)": [[4, "pydra.engine.core.TaskBase.audit_flags"]], "cache_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_dir"]], "cache_locations (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cache_locations"]], "can_resume (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.can_resume"]], "checksum (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.checksum"]], "checksum (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.checksum"]], "checksum_states() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.checksum_states"]], "combine() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.combine"]], "cont_dim (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.cont_dim"]], "create_connections() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_connections"]], "create_dotfile() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.create_dotfile"]], "done (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.done"]], "errored (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.errored"]], "generated_output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.generated_output_names"]], "get_input_el() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.get_input_el"]], "graph_sorted (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.graph_sorted"]], "help() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.help"]], "is_lazy() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_lazy"]], "is_task() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_task"]], "is_workflow() (in module pydra.engine.core)": [[4, "pydra.engine.core.is_workflow"]], "lzin (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.lzin"]], "lzout (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.lzout"]], "nodes (pydra.engine.core.workflow property)": [[4, "pydra.engine.core.Workflow.nodes"]], "output_dir (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_dir"]], "output_names (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.output_names"]], "pickle_task() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.pickle_task"]], "pydra.engine.core": [[4, "module-pydra.engine.core"]], "result() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.result"]], "set_output() (pydra.engine.core.workflow method)": [[4, "pydra.engine.core.Workflow.set_output"]], "set_state() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.set_state"]], "split() (pydra.engine.core.taskbase method)": [[4, "pydra.engine.core.TaskBase.split"]], "uid (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.uid"]], "version (pydra.engine.core.taskbase property)": [[4, "pydra.engine.core.TaskBase.version"]], "container (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Container"]], "docker (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Docker"]], "environment (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Environment"]], "native (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Native"]], "singularity (class in pydra.engine.environments)": [[5, "pydra.engine.environments.Singularity"]], "bind() (pydra.engine.environments.container method)": [[5, "pydra.engine.environments.Container.bind"]], "execute() (pydra.engine.environments.docker method)": [[5, "pydra.engine.environments.Docker.execute"]], "execute() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.execute"]], "execute() (pydra.engine.environments.native method)": [[5, "pydra.engine.environments.Native.execute"]], "execute() (pydra.engine.environments.singularity method)": [[5, "pydra.engine.environments.Singularity.execute"]], "pydra.engine.environments": [[5, "module-pydra.engine.environments"]], "setup() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.setup"]], "teardown() (pydra.engine.environments.environment method)": [[5, "pydra.engine.environments.Environment.teardown"]], "digraph (class in pydra.engine.graph)": [[6, "pydra.engine.graph.DiGraph"]], "add_edges() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges"]], "add_edges_description() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_edges_description"]], "add_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.add_nodes"]], "calculate_max_paths() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.calculate_max_paths"]], "copy() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.copy"]], "create_dotfile_detailed() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_detailed"]], "create_dotfile_nested() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_nested"]], "create_dotfile_simple() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.create_dotfile_simple"]], "edges (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges"]], "edges_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.edges_names"]], "export_graph() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.export_graph"]], "nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes"]], "nodes_details (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_details"]], "nodes_names_map (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.nodes_names_map"]], "pydra.engine.graph": [[6, "module-pydra.engine.graph"]], "remove_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes"]], "remove_nodes_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_nodes_connections"]], "remove_previous_connections() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_previous_connections"]], "remove_successors_nodes() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.remove_successors_nodes"]], "sorted_nodes (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes"]], "sorted_nodes_names (pydra.engine.graph.digraph property)": [[6, "pydra.engine.graph.DiGraph.sorted_nodes_names"]], "sorting() (pydra.engine.graph.digraph method)": [[6, "pydra.engine.graph.DiGraph.sorting"]], "pydrafilelock (class in pydra.engine.helpers)": [[7, "pydra.engine.helpers.PydraFileLock"]], "allowed_values_validator() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.allowed_values_validator"]], "argstr_formatting() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.argstr_formatting"]], "copyfile_workflow() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.copyfile_workflow"]], "create_checksum() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.create_checksum"]], "ensure_list() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.ensure_list"]], "execute() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.execute"]], "from_list_if_single() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.from_list_if_single"]], "gather_runtime_info() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.gather_runtime_info"]], "get_available_cpus() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_available_cpus"]], "get_open_loop() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.get_open_loop"]], "load_and_run() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run"]], "load_and_run_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_and_run_async"]], "load_result() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_result"]], "load_task() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.load_task"]], "make_klass() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.make_klass"]], "output_from_inputfields() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.output_from_inputfields"]], "parse_copyfile() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_copyfile"]], "parse_format_string() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.parse_format_string"]], "position_sort() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.position_sort"]], "print_help() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.print_help"]], "pydra.engine.helpers": [[7, "module-pydra.engine.helpers"]], "read_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display"]], "read_and_display_async() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_and_display_async"]], "read_stream_and_display() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.read_stream_and_display"]], "record_error() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.record_error"]], "save() (in module pydra.engine.helpers)": [[7, "pydra.engine.helpers.save"]], "mountindentifier (class in pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.MountIndentifier"]], "copy_nested_files() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.copy_nested_files"]], "ensure_list() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.ensure_list"]], "generate_cifs_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.generate_cifs_table"]], "get_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount"]], "get_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.get_mount_table"]], "is_container() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_container"]], "is_local_file() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.is_local_file"]], "on_cifs() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_cifs"]], "on_same_mount() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.on_same_mount"]], "parse_mount_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.parse_mount_table"]], "patch_table() (pydra.engine.helpers_file.mountindentifier class method)": [[8, "pydra.engine.helpers_file.MountIndentifier.patch_table"]], "pydra.engine.helpers_file": [[8, "module-pydra.engine.helpers_file"]], "template_update() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update"]], "template_update_single() (in module pydra.engine.helpers_file)": [[8, "pydra.engine.helpers_file.template_update_single"]], "pydrastateerror": [[9, "pydra.engine.helpers_state.PydraStateError"]], "add_name_combiner() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_combiner"]], "add_name_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.add_name_splitter"]], "combine_final_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.combine_final_groups"]], "converter_groups_to_input() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.converter_groups_to_input"]], "flatten() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.flatten"]], "input_shape() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.input_shape"]], "inputs_types_to_dict() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.inputs_types_to_dict"]], "iter_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.iter_splits"]], "map_splits() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.map_splits"]], "pydra.engine.helpers_state": [[9, "module-pydra.engine.helpers_state"]], "remove_inp_from_splitter_rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.remove_inp_from_splitter_rpn"]], "rpn2splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.rpn2splitter"]], "splits_groups() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splits_groups"]], "splitter2rpn() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.splitter2rpn"]], "unwrap_splitter() (in module pydra.engine.helpers_state)": [[9, "pydra.engine.helpers_state.unwrap_splitter"]], "pydra.engine.run_pickled": [[10, "module-pydra.engine.run_pickled"]], "run_pickled() (in module pydra.engine.run_pickled)": [[10, "pydra.engine.run_pickled.run_pickled"]], "basespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.BaseSpec"]], "functionspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.FunctionSpec"]], "lazyfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyField"]], "lazyin (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyIn"]], "lazyinfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInField"]], "lazyinterface (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyInterface"]], "lazyout (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOut"]], "lazyoutfield (class in pydra.engine.specs)": [[11, "pydra.engine.specs.LazyOutField"]], "multiinputobj (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiInputObj"]], "multioutputtype (class in pydra.engine.specs)": [[11, "pydra.engine.specs.MultiOutputType"]], "result (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Result"]], "runtime (class in pydra.engine.specs)": [[11, "pydra.engine.specs.Runtime"]], "runtimespec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.RuntimeSpec"]], "shelloutspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellOutSpec"]], "shellspec (class in pydra.engine.specs)": [[11, "pydra.engine.specs.ShellSpec"]], "specinfo (class in pydra.engine.specs)": [[11, "pydra.engine.specs.SpecInfo"]], "statearray (class in pydra.engine.specs)": [[11, "pydra.engine.specs.StateArray"]], "taskhook (class in pydra.engine.specs)": [[11, "pydra.engine.specs.TaskHook"]], "args (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.args"]], "attr_fields() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.attr_fields"]], "attr_type (pydra.engine.specs.lazyinfield attribute)": [[11, "pydra.engine.specs.LazyInField.attr_type"]], "attr_type (pydra.engine.specs.lazyoutfield attribute)": [[11, "pydra.engine.specs.LazyOutField.attr_type"]], "bases (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.bases"]], "cast() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.cast"]], "cast_from (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.cast_from"]], "check_fields_input_spec() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_fields_input_spec"]], "check_metadata() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.functionspec method)": [[11, "pydra.engine.specs.FunctionSpec.check_metadata"]], "check_metadata() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.check_metadata"]], "collect_additional_outputs() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.collect_additional_outputs"]], "collect_additional_outputs() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.collect_additional_outputs"]], "container (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.container"]], "copyfile_input() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.copyfile_input"]], "cpu_peak_percent (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.cpu_peak_percent"]], "donothing() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.donothing"]], "errored (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.errored"]], "executable (pydra.engine.specs.shellspec attribute)": [[11, "pydra.engine.specs.ShellSpec.executable"]], "field (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.field"]], "fields (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.fields"]], "generated_output_names() (pydra.engine.specs.shelloutspec method)": [[11, "pydra.engine.specs.ShellOutSpec.generated_output_names"]], "get_output_field() (pydra.engine.specs.result method)": [[11, "pydra.engine.specs.Result.get_output_field"]], "get_value() (pydra.engine.specs.lazyinfield method)": [[11, "pydra.engine.specs.LazyInField.get_value"]], "get_value() (pydra.engine.specs.lazyoutfield method)": [[11, "pydra.engine.specs.LazyOutField.get_value"]], "hash (pydra.engine.specs.basespec property)": [[11, "pydra.engine.specs.BaseSpec.hash"]], "hash_changes() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.hash_changes"]], "name (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.name"]], "name (pydra.engine.specs.specinfo attribute)": [[11, "pydra.engine.specs.SpecInfo.name"]], "network (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.network"]], "outdir (pydra.engine.specs.runtimespec attribute)": [[11, "pydra.engine.specs.RuntimeSpec.outdir"]], "output (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.output"]], "path_to_string() (in module pydra.engine.specs)": [[11, "pydra.engine.specs.path_to_string"]], "post_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run"]], "post_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.post_run_task"]], "pre_run (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run"]], "pre_run_task (pydra.engine.specs.taskhook attribute)": [[11, "pydra.engine.specs.TaskHook.pre_run_task"]], "pydra.engine.specs": [[11, "module-pydra.engine.specs"]], "reset() (pydra.engine.specs.taskhook method)": [[11, "pydra.engine.specs.TaskHook.reset"]], "retrieve_values() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.retrieve_values"]], "retrieve_values() (pydra.engine.specs.shellspec method)": [[11, "pydra.engine.specs.ShellSpec.retrieve_values"]], "return_code (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.return_code"]], "rss_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.rss_peak_gb"]], "runtime (pydra.engine.specs.result attribute)": [[11, "pydra.engine.specs.Result.runtime"]], "sanitize_splitter() (pydra.engine.specs.lazyfield class method)": [[11, "pydra.engine.specs.LazyField.sanitize_splitter"]], "split() (pydra.engine.specs.lazyfield method)": [[11, "pydra.engine.specs.LazyField.split"]], "splits (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.splits"]], "stderr (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stderr"]], "stdout (pydra.engine.specs.shelloutspec attribute)": [[11, "pydra.engine.specs.ShellOutSpec.stdout"]], "template_update() (pydra.engine.specs.basespec method)": [[11, "pydra.engine.specs.BaseSpec.template_update"]], "type (pydra.engine.specs.lazyfield attribute)": [[11, "pydra.engine.specs.LazyField.type"]], "vms_peak_gb (pydra.engine.specs.runtime attribute)": [[11, "pydra.engine.specs.Runtime.vms_peak_gb"]], "state (class in pydra.engine.state)": [[12, "pydra.engine.state.State"]], "combiner (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.combiner"]], "combiner (pydra.engine.state.state property)": [[12, "id0"]], "combiner_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.combiner_validation"]], "current_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner"]], "current_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_combiner_all"]], "current_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter"]], "current_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.current_splitter_rpn"]], "final_combined_ind_mapping (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.final_combined_ind_mapping"]], "group_for_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs"]], "group_for_inputs_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.group_for_inputs_final"]], "groups_stack_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.groups_stack_final"]], "inner_inputs (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inner_inputs"]], "inner_inputs (pydra.engine.state.state property)": [[12, "id1"]], "inputs_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.inputs_ind"]], "name (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.name"]], "other_states (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.other_states"]], "other_states (pydra.engine.state.state property)": [[12, "id2"]], "prepare_inputs() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_inputs"]], "prepare_states() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states"]], "prepare_states_combined_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_combined_ind"]], "prepare_states_ind() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_ind"]], "prepare_states_val() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.prepare_states_val"]], "prev_state_combiner (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner"]], "prev_state_combiner_all (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_combiner_all"]], "prev_state_splitter (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter"]], "prev_state_splitter_rpn (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn"]], "prev_state_splitter_rpn_compact (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.prev_state_splitter_rpn_compact"]], "pydra.engine.state": [[12, "module-pydra.engine.state"]], "set_input_groups() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.set_input_groups"]], "splits() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splits"]], "splitter (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter"]], "splitter (pydra.engine.state.state property)": [[12, "id3"]], "splitter_final (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_final"]], "splitter_final (pydra.engine.state.state property)": [[12, "id4"]], "splitter_rpn (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn"]], "splitter_rpn (pydra.engine.state.state property)": [[12, "id5"]], "splitter_rpn_compact (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.splitter_rpn_compact"]], "splitter_rpn_compact (pydra.engine.state.state property)": [[12, "id6"]], "splitter_rpn_final (pydra.engine.state.state property)": [[12, "pydra.engine.state.State.splitter_rpn_final"]], "splitter_validation() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.splitter_validation"]], "states_ind (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_ind"]], "states_val (pydra.engine.state.state attribute)": [[12, "pydra.engine.state.State.states_val"]], "update_connections() (pydra.engine.state.state method)": [[12, "pydra.engine.state.State.update_connections"]], "submitter (class in pydra.engine.submitter)": [[13, "pydra.engine.submitter.Submitter"]], "close() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.close"]], "expand_runnable() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_runnable"]], "expand_workflow() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.expand_workflow"]], "get_runnable_tasks() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.get_runnable_tasks"]], "is_runnable() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.is_runnable"]], "prepare_runnable_with_state() (in module pydra.engine.submitter)": [[13, "pydra.engine.submitter.prepare_runnable_with_state"]], "pydra.engine.submitter": [[13, "module-pydra.engine.submitter"]], "submit_from_call() (pydra.engine.submitter.submitter method)": [[13, "pydra.engine.submitter.Submitter.submit_from_call"]], "default_copy_collation (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.DEFAULT_COPY_COLLATION"]], "functiontask (class in pydra.engine.task)": [[14, "pydra.engine.task.FunctionTask"]], "shellcommandtask (class in pydra.engine.task)": [[14, "pydra.engine.task.ShellCommandTask"]], "cmdline (pydra.engine.task.shellcommandtask property)": [[14, "pydra.engine.task.ShellCommandTask.cmdline"]], "command_args() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.command_args"]], "get_bindings() (pydra.engine.task.shellcommandtask method)": [[14, "pydra.engine.task.ShellCommandTask.get_bindings"]], "input_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.input_spec"]], "output_spec (pydra.engine.task.shellcommandtask attribute)": [[14, "pydra.engine.task.ShellCommandTask.output_spec"]], "pydra.engine.task": [[14, "module-pydra.engine.task"]], "split_cmd() (in module pydra.engine.task)": [[14, "pydra.engine.task.split_cmd"]], "concurrentfuturesworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker"]], "daskworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DaskWorker"]], "distributedworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.DistributedWorker"]], "psijlocalworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijLocalWorker"]], "psijslurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijSlurmWorker"]], "psijworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.PsijWorker"]], "sgeworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SGEWorker"]], "serialworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SerialWorker"]], "slurmworker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.SlurmWorker"]], "worker (class in pydra.engine.workers)": [[15, "pydra.engine.workers.Worker"]], "check_for_results_files() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.check_for_results_files"]], "close() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.close"]], "close() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.close"]], "close() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.close"]], "close() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.close"]], "close() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.close"]], "exec_as_coro() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.exec_as_coro"]], "exec_dask() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.exec_dask"]], "exec_psij() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.exec_psij"]], "exec_serial() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.exec_serial"]], "fetch_finished() (pydra.engine.workers.distributedworker method)": [[15, "pydra.engine.workers.DistributedWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.fetch_finished"]], "fetch_finished() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.fetch_finished"]], "get_output_by_task_pkl() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_output_by_task_pkl"]], "get_tasks_to_run() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.get_tasks_to_run"]], "make_job() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_job"]], "make_spec() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.make_spec"]], "max_jobs (pydra.engine.workers.distributedworker attribute)": [[15, "pydra.engine.workers.DistributedWorker.max_jobs"]], "plugin_name (pydra.engine.workers.concurrentfuturesworker attribute)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.plugin_name"]], "plugin_name (pydra.engine.workers.daskworker attribute)": [[15, "pydra.engine.workers.DaskWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.plugin_name"]], "plugin_name (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.plugin_name"]], "plugin_name (pydra.engine.workers.sgeworker attribute)": [[15, "pydra.engine.workers.SGEWorker.plugin_name"]], "plugin_name (pydra.engine.workers.serialworker attribute)": [[15, "pydra.engine.workers.SerialWorker.plugin_name"]], "plugin_name (pydra.engine.workers.slurmworker attribute)": [[15, "pydra.engine.workers.SlurmWorker.plugin_name"]], "pydra.engine.workers": [[15, "module-pydra.engine.workers"]], "run_el() (pydra.engine.workers.concurrentfuturesworker method)": [[15, "pydra.engine.workers.ConcurrentFuturesWorker.run_el"]], "run_el() (pydra.engine.workers.daskworker method)": [[15, "pydra.engine.workers.DaskWorker.run_el"]], "run_el() (pydra.engine.workers.psijworker method)": [[15, "pydra.engine.workers.PsijWorker.run_el"]], "run_el() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.run_el"]], "run_el() (pydra.engine.workers.serialworker method)": [[15, "pydra.engine.workers.SerialWorker.run_el"]], "run_el() (pydra.engine.workers.slurmworker method)": [[15, "pydra.engine.workers.SlurmWorker.run_el"]], "run_el() (pydra.engine.workers.worker method)": [[15, "pydra.engine.workers.Worker.run_el"]], "submit_array_job() (pydra.engine.workers.sgeworker method)": [[15, "pydra.engine.workers.SGEWorker.submit_array_job"]], "subtype (pydra.engine.workers.psijlocalworker attribute)": [[15, "pydra.engine.workers.PsijLocalWorker.subtype"]], "subtype (pydra.engine.workers.psijslurmworker attribute)": [[15, "pydra.engine.workers.PsijSlurmWorker.subtype"]], "annotate() (in module pydra.mark)": [[16, "pydra.mark.annotate"]], "pydra.mark": [[16, "module-pydra.mark"]], "task() (in module pydra.mark)": [[16, "pydra.mark.task"]], "annotate() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.annotate"]], "pydra.mark.functions": [[17, "module-pydra.mark.functions"]], "task() (in module pydra.mark.functions)": [[17, "pydra.mark.functions.task"]], "pydra.tasks": [[18, "module-pydra.tasks"]], "pydra.utils": [[19, "module-pydra.utils"]], "cache (class in pydra.utils.hash)": [[20, "pydra.utils.hash.Cache"]], "bytes_repr_mapping_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_mapping_contents"]], "bytes_repr_sequence_contents() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.bytes_repr_sequence_contents"]], "hash_function() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_function"]], "hash_object() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_object"]], "hash_single() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.hash_single"]], "persistent (pydra.utils.hash.cache attribute)": [[20, "pydra.utils.hash.Cache.persistent"]], "pydra.utils.hash": [[20, "module-pydra.utils.hash"]], "register_serializer() (in module pydra.utils.hash)": [[20, "pydra.utils.hash.register_serializer"]], "all (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.ALL"]], "auditflag (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.AuditFlag"]], "filemessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.FileMessenger"]], "messenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.Messenger"]], "none (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.NONE"]], "prov (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.PROV"]], "printmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.PrintMessenger"]], "resource (pydra.utils.messenger.auditflag attribute)": [[21, "pydra.utils.messenger.AuditFlag.RESOURCE"]], "remoterestmessenger (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RemoteRESTMessenger"]], "runtimehooks (class in pydra.utils.messenger)": [[21, "pydra.utils.messenger.RuntimeHooks"]], "collect_messages() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.collect_messages"]], "gen_uuid() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.gen_uuid"]], "make_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.make_message"]], "now() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.now"]], "pydra.utils.messenger": [[21, "module-pydra.utils.messenger"]], "resource_monitor_post_stop (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_post_stop"]], "resource_monitor_pre_start (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.resource_monitor_pre_start"]], "send() (pydra.utils.messenger.filemessenger method)": [[21, "pydra.utils.messenger.FileMessenger.send"]], "send() (pydra.utils.messenger.messenger method)": [[21, "pydra.utils.messenger.Messenger.send"]], "send() (pydra.utils.messenger.printmessenger method)": [[21, "pydra.utils.messenger.PrintMessenger.send"]], "send() (pydra.utils.messenger.remoterestmessenger method)": [[21, "pydra.utils.messenger.RemoteRESTMessenger.send"]], "send_message() (in module pydra.utils.messenger)": [[21, "pydra.utils.messenger.send_message"]], "task_execute_post_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_post_exit"]], "task_execute_pre_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_execute_pre_entry"]], "task_run_entry (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_entry"]], "task_run_exit (pydra.utils.messenger.runtimehooks attribute)": [[21, "pydra.utils.messenger.RuntimeHooks.task_run_exit"]], "add_exc_note() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.add_exc_note"]], "exc_info_matches() (in module pydra.utils.misc)": [[22, "pydra.utils.misc.exc_info_matches"]], "pydra.utils.misc": [[22, "module-pydra.utils.misc"]], "resourcemonitor (class in pydra.utils.profiler)": [[23, "pydra.utils.profiler.ResourceMonitor"]], "fname (pydra.utils.profiler.resourcemonitor property)": [[23, "pydra.utils.profiler.ResourceMonitor.fname"]], "get_max_resources_used() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_max_resources_used"]], "get_system_total_memory_gb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.get_system_total_memory_gb"]], "log_nodes_cb() (in module pydra.utils.profiler)": [[23, "pydra.utils.profiler.log_nodes_cb"]], "pydra.utils.profiler": [[23, "module-pydra.utils.profiler"]], "run() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.run"]], "stop() (pydra.utils.profiler.resourcemonitor method)": [[23, "pydra.utils.profiler.ResourceMonitor.stop"]], "coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.COERCIBLE_DEFAULT"]], "not_coercible_default (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.NOT_COERCIBLE_DEFAULT"]], "typeparser (class in pydra.utils.typing)": [[24, "pydra.utils.typing.TypeParser"]], "apply_to_instances() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.apply_to_instances"]], "check_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_coercible"]], "check_type() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type"]], "check_type_coercible() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.check_type_coercible"]], "coerce() (pydra.utils.typing.typeparser method)": [[24, "pydra.utils.typing.TypeParser.coerce"]], "coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.coercible"]], "contains_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.contains_type"]], "get_args() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_args"]], "get_item_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.get_item_type"]], "get_origin() (pydra.utils.typing.typeparser static method)": [[24, "pydra.utils.typing.TypeParser.get_origin"]], "is_instance() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_instance"]], "is_subclass() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.is_subclass"]], "label (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.label"]], "label_str (pydra.utils.typing.typeparser property)": [[24, "pydra.utils.typing.TypeParser.label_str"]], "match_any_of_union (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.match_any_of_union"]], "matches() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches"]], "matches_type() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.matches_type"]], "not_coercible (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.not_coercible"]], "pydra.utils.typing": [[24, "module-pydra.utils.typing"]], "strip_splits() (pydra.utils.typing.typeparser class method)": [[24, "pydra.utils.typing.TypeParser.strip_splits"]], "superclass_auto_cast (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.superclass_auto_cast"]], "tp (pydra.utils.typing.typeparser attribute)": [[24, "pydra.utils.typing.TypeParser.tp"]]}}) \ No newline at end of file diff --git a/typing-bugfixes/state.html b/typing-bugfixes/state.html new file mode 100644 index 0000000000..c3a93cf97f --- /dev/null +++ b/typing-bugfixes/state.html @@ -0,0 +1,230 @@ + + + + + + + State and Nested Loops over Input — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + + + + + + +

Warning: This document is for the development version of Pydra: A simple dataflow engine with scalable semantics. The main version is master.

+
+

State and Nested Loops over Input

+

One of the main goals of creating Pydra was to support flexible evaluation of a Task or a Workflow +over combinations of input parameters. +This is the key feature that distinguishes it from most other dataflow engines. +This is similar to the concept of the Map-Reduce, but extends it to work over arbitrary nested graphs. +In complex dataflows, this would typically involve significant overhead for data management +and use of multiple nested loops. +In Pydra, this is controlled by setting specific State related attributes through Task methods. +In order to set input splitting (or mapping), Pydra requires setting up a splitter. +This is done using Task’s split method. +The simplest example would be a Task that has one field x in the input, and therefore there +is only one way of splitting its input. +Assuming that the user provides a list as a value of x, Pydra splits the list, so each copy +of the Task will get one element of the list. +This can be represented as follow:

+
+\[S = x: x=[x_1, x_2, ..., x_n] \longmapsto x=x_1, x=x_2, ..., x=x_n~,\]
+

where S represents the splitter, and x is the input field. +This is also represented in the diagram, where \(x=[1, 2, 3]\) as an example, and the coloured +nodes represent stateless copies of the original Task after splitting the input, +(these are the runnables that are executed).

+_images/nd_spl_1.png +
+

Types of Splitter

+

Whenever a Task has more complicated inputs, +i.e. multiple fields, there are two ways of creating the mapping, +each one is used for different application. +These splitters are called scalar splitter and outer splitter. +They use a special, but Python-based syntax as described next.

+
+
+

Scalar Splitter

+

A scalar splitter performs element-wise mapping and requires that the lists of +values for two or more fields to have the same length. The scalar splitter uses +Python tuples and its operation is therefore represented by a parenthesis, ():

+
+\[S = (x, y) : x=[x_1, x_2, .., x_n],~y=[y_1, y_2, .., y_n] \mapsto (x, y)=(x_1, y_1),..., (x, y)=(x_n, y_n),\]
+

where S represents the splitter, x and y are the input fields. +This is also represented as a diagram:

+
+_images/nd_spl_4.png +
+
+
+

Outer Splitter

+

The second option of mapping the input, when there are multiple fields, is +provided by the outer splitter. The outer splitter creates all combination +of the input values and does not require the lists to have the same lengths. +The outer splitter uses Python’s list syntax and is represented by square +brackets, []:

+
+\[\begin{split}S = [x, y] &:& x=[x_1, x_2, ..., x_n],~~ y=[y_1, y_2, ..., y_m], \\ +&\mapsto& (x, y)=(x_1, y_1), (x, y)=(x_1, y_2)..., (x, y)=(x_n, y_m).\end{split}\]
+

The outer splitter for a node with two input fields is schematically represented in the diagram:

+
+_images/nd_spl_3.png +
+

Different types of splitters can be combined over inputs such as +[inp1, (inp2, inp3)]. In this example an outer splitter provides all +combinations of values of inp1 with pairwise combinations of values of inp2 +and inp3. This can be extended to arbitrary complexity. +In additional, the output can be merge at the end if needed. +This will be explained in the next section.

+
+
+ + +
+
+ +
+
+
+
+ +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/typing-bugfixes/user_guide.html b/typing-bugfixes/user_guide.html new file mode 100644 index 0000000000..48f30aff09 --- /dev/null +++ b/typing-bugfixes/user_guide.html @@ -0,0 +1,190 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + Other Versions + v: typing-bugfixes + + + +
+ + + + \ No newline at end of file diff --git a/user_guide.html b/user_guide.html new file mode 100644 index 0000000000..d5527adf25 --- /dev/null +++ b/user_guide.html @@ -0,0 +1,187 @@ + + + + + + + User Guide — Pydra: A simple dataflow engine with scalable semantics 0.24.dev17+g873f8a0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file