From efdb499919148852422748c281ac93920180ca20 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 17 Sep 2024 07:49:15 +0200 Subject: [PATCH 01/19] docs: finalized docstrings and API documentation --- docs/examples/case_a.rst | 32 +++++++++++++++++--------------- docs/examples/case_b.rst | 8 ++++---- docs/examples/case_c.rst | 4 ++-- docs/examples/case_d.rst | 8 ++++---- docs/examples/case_e.rst | 8 ++++---- docs/examples/case_g.rst | 31 ++++++++++++++++++++----------- docs/index.rst | 8 +------- 7 files changed, 52 insertions(+), 47 deletions(-) diff --git a/docs/examples/case_a.rst b/docs/examples/case_a.rst index d3b8fea..5e71c49 100644 --- a/docs/examples/case_a.rst +++ b/docs/examples/case_a.rst @@ -17,22 +17,21 @@ A - Simple Model and Catalog After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ---------- +Experiment Components +--------------------- -The following example shows the definition of a testing experiment of a simple -forecast against a simple catalog. The input structure of the experiment is: +The following example shows the definition of a testing experiment of a single **time-independent** forecast against a catalog. The example files are found in ``floatcsep/examples/case_a``. The input structure of the experiment is: :: case_a + ├── region.txt ├── catalog.csep - ├── config.yml ├── best_model.dat - └── region.txt + └── config.yml -* The testing region consists of a grid with two 1ºx1º bins, whose bottom-left nodes are defined in the file `region.txt`. The grid spacing is obtained automatically. The nodes are: +* The testing region ``region.txt`` consists of a grid with two 1ºx1º bins, defined by its bottom-left nodes. The grid spacing is obtained automatically. The nodes are: .. literalinclude:: ../../examples/case_a/region.txt @@ -40,18 +39,21 @@ forecast against a simple catalog. The input structure of the experiment is: .. literalinclude:: ../../examples/case_a/catalog.csep -* The forecast ``best_model.dat`` to be evaluated is written in the ``.dat`` format (see :doc:`pycsep:concepts/forecasts`). Forecast formats are detected automatically (see :class:`floatcsep.readers`) +* The forecast ``best_model.dat`` to be evaluated is written in the ``.dat`` format (see :doc:`pycsep:concepts/forecasts`). Forecast formats are detected automatically (see :mod:`floatcsep.utils.readers.ForecastParsers`) .. literalinclude:: ../../examples/case_a/best_model.dat -.. important:: - - Every file path should be relative to the ``config.yml`` file. Configuration ------------- -The experiment is defined by a time-, region-, model- and test-configurations. In this example, they are written together in the ``config.yml`` file. +The experiment is defined by a time-, region-, model- and test-configurations, as well as a catalog and a region. In this example, they are written together in the ``config.yml`` file. + + +.. important:: + + Every file path (e.g., of a catalog) specified in the ``config.yml`` file should be relative to the directory containing the configuration file. + Time @@ -72,7 +74,7 @@ Time Region ~~~~~~ - The region - a file path or :class:`csep` function (e.g. :obj:`csep.core.regions.italy_csep_region`) -, the depth limits and magnitude discretization are defined in the ``region_config`` inset. + The region - a file path or a :mod:`pycsep` function, such as :obj:`~csep.core.regions.italy_csep_region` (check the available regions in :mod:`csep.core.regions`) -, the depth limits and magnitude discretization are defined in the ``region_config`` inset. .. literalinclude:: ../../examples/case_a/config.yml :language: yaml @@ -82,7 +84,7 @@ Region Catalog ~~~~~~~ - It is defined in the ``catalog`` inset. This should only make reference to a catalog file or a catalog query function (e.g. ``query_comcat``). ``floatcsep`` will automatically filter the catalog to the experiment time, spatial and magnitude frames: + It is defined in the ``catalog`` inset. This should only make reference to a catalog file or a catalog query function (e.g. :func:`~csep.query_comcat`). ``floatcsep`` will automatically filter the catalog to the experiment time, spatial and magnitude frames: .. literalinclude:: ../../examples/case_a/config.yml :language: yaml @@ -160,6 +162,6 @@ Results Advanced -------- -The experiment run logic can be seen in the file ``case_a.py``, which executes the same example but in python source code. The run logic of the terminal commands ``run``, ``plot`` and ``reproduce`` can be found in :class:`floatcsep.cmd.main` +The experiment run logic can be seen in the file ``case_a.py``, which executes the same example but in python source code. The run logic of the terminal commands ``run``, ``plot`` and ``reproduce`` can be found in :mod:`floatcsep.commands.main` diff --git a/docs/examples/case_b.rst b/docs/examples/case_b.rst index 6e07d7b..8c30099 100644 --- a/docs/examples/case_b.rst +++ b/docs/examples/case_b.rst @@ -17,15 +17,15 @@ B - Multiple Models and Tests After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ----------------------- +Experiment Components +--------------------- -The following example is an experiment including multiple forecasts and evaluations. The input structure of the experiment is: +The following example is an experiment including **multiple** time-independent forecasts and evaluations. The input structure of the experiment is: :: case_b - └── models + └── models ├── model_a.csv ├── model_b.csv ├── model_c.csv diff --git a/docs/examples/case_c.rst b/docs/examples/case_c.rst index e603646..e7d4a39 100644 --- a/docs/examples/case_c.rst +++ b/docs/examples/case_c.rst @@ -17,8 +17,8 @@ C - Multiple Time Windows After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ---------- +Experiment Components +--------------------- The following example shows an experiment with multiple time windows. The input structure of the experiment is: diff --git a/docs/examples/case_d.rst b/docs/examples/case_d.rst index 01f270a..bbf7445 100644 --- a/docs/examples/case_d.rst +++ b/docs/examples/case_d.rst @@ -17,8 +17,8 @@ D - Catalog Queries and Model Repositories After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ---------- +Experiment Components +--------------------- The following example shows an experiment whose forecasts are retrieved from a repository (Zenodo - https://zenodo.org) and the testing catalog from an authoritative source web service (namely the gCMT catalog from the ISC - http://www.isc.ac.uk). The initial structure is: @@ -57,7 +57,7 @@ Configuration Catalog ~~~~~~~ - The ``catalog`` inset from ``config.yml`` now makes reference to a catalog query function, in this case :func:`~floatcsep.accessors.query_isc_gcmt`. + The ``catalog`` inset from ``config.yml`` now makes reference to a catalog query function, in this case :func:`~pycsep.query_gcmt`. .. literalinclude:: ../../examples/case_d/config.yml :language: yaml @@ -67,7 +67,7 @@ Catalog .. note:: - Query functions exist in both ``pycsep`` and ``floatcsep`` (e.g. :func:`csep.query_comcat`, :func:`csep.query_bsi`, :func:`~csep.query_gcmt`, :func:`~csep.query_gns`). Only the name of the function is needed to retrieve the catalog. Refer to :obj:`csep` and :class:`floatcsep.accessors`. + Query functions are located in ``pycsep`` (e.g. :func:`csep.query_comcat`, :func:`csep.query_bsi`, :func:`csep.query_gcmt`, :func:`csep.query_gns`). Only the name of the function is needed to retrieve the catalog. Refer to :obj:`csep` API reference. Models ~~~~~~ diff --git a/docs/examples/case_e.rst b/docs/examples/case_e.rst index 92d3093..acb93ba 100644 --- a/docs/examples/case_e.rst +++ b/docs/examples/case_e.rst @@ -17,8 +17,8 @@ E - A Realistic Time-independent Experiment After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ---------- +Experiment Components +--------------------- This example shows how to run a realistic testing experiment in Italy (based on https://doi.org/10.4401/ag-4844), summarizing the concepts of previous examples. The example has only a subset of the original models and evaluations. The input structure of the experiment is: @@ -92,13 +92,13 @@ Post-Process :language: yaml :lines: 21-34 - See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plot options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top. + The forecasts are plotted and stored in ``examples/case_e/results/{timewindow}/forecasts/``. See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plot options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top. Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_a`` folder in the terminal and typing. + The experiment can be run by simply navigating to the ``examples/case_e`` folder in the terminal and typing. .. code-block:: console diff --git a/docs/examples/case_g.rst b/docs/examples/case_g.rst index 203f7b8..58de35b 100644 --- a/docs/examples/case_g.rst +++ b/docs/examples/case_g.rst @@ -17,8 +17,9 @@ G - Time-Dependent, Catalog-Based Model (from Source Code) After the calculation is complete, the results will be summarized in ``results/report.md``. -Artifacts ---------- +Experiment Components +--------------------- + This example shows how a time-dependent model should be set up for a time-dependent experiment :: @@ -35,40 +36,48 @@ This example shows how a time-dependent model should be set up for a time-depend ├── models.yml └── tests.yml -* The model to be evaluated (``pymock``) is a source code that generates forecast for multiple time windows. +* The model to be evaluated (``pymock``) is a source code that generates forecasts for multiple time windows. -* The testing catalog `catalog.csv` works also as the input catalog, by being filtered until the starting test_date and allocated in `pymock/input` dynamically (before the model is run) +* The testing catalog ``catalog.csv`` works also as the input catalog, by being filtered until the starting test_date and allocated in `pymock/input` dynamically (before the model is run) Model ----- -The experiment's complexity increases from time-independent to dependent, since we now need a **Model** (source code) that is able to generate forecast that changes every window. The model should be conceptualized as a **black-box**, whose only interface/interaction with the ``floatcsep`` system is to receive an input (i.e. input catalog) and generates an output (i.e. the forecasts). +The experiment's complexity increases from time-independent to dependent, since we now need a **Model** (source code) that is able to generate forecast that changes every window. The model should be conceptualized as a **black-box**, whose only interface/interaction with the ``floatcsep`` system is to receive an input (i.e., input catalog and arguments) and generates an output (the forecasts). -* Input: The input consists in input **data** and **arguments**. +* **Input**: The input consists in input **data** and **arguments**. - 1. The input data is, at the least, a catalog filtered until the forecast beginning, which is automatically allocated by ``fecsep`` in the `{model}/input` prior to each model's run. It is stored inside the model in ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). + 1. The **input data** is, at the least, a catalog filtered until the forecast beginning, which is automatically allocated by ``floatcsep`` in the `{model}/input` prior to each model's run. It is stored inside the model in ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). .. literalinclude:: ../../examples/case_g/catalog.csv :lines: 1-2 - 2. The input arguments controls how the source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will read `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`' before the model is run. Additional arguments can be set by convenience, such as ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. + 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will read `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. + +* **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT -* Output: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT +* **Model build**: Inside the model source code, there are multiple options to build it. A standard python ``setup.cfg`` is given, which can be built inside a python ``venv`` or ``conda`` managers. This is created and built automatically by ``floatCSEP``, as long as the the model build instructions are correctly set up. -* Model run: The model should be run with a simple command to which only ``arguments`` should be passed. For this example, is +* **Model run**: The model should be run with a simple command to which only ``arguments`` should be passed. For this example, is .. code-block:: console $ python pymock/run.py input/args.txt -or using a binary (see ``pymock/setup.cfg:entry_point``) + or using a binary (see ``pymock/setup.cfg:entry_point``) .. code-block:: console $ pymock input/args.txt + It can also be run simply by + + .. code-block:: console + + $ pymock + as long as it internally reads the ``input/args.txt`` and ``input/catalog.csv`` files. Configuration diff --git a/docs/index.rst b/docs/index.rst index d4db04a..82ab549 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,3 @@ -.. floatCSEP documentation master file, created by - sphinx-quickstart on Wed Nov 16 09:56:55 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - - floatCSEP: Floating Experiments =============================== @@ -19,7 +13,7 @@ Preliminary documentation. .. toctree:: :maxdepth: 1 - :caption: Example Experiments + :caption: Tutorial Experiments examples/case_a.rst examples/case_b.rst From 7698f47d2443dd5fe64b90492a05bc7ff28b2476 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 17 Sep 2024 18:54:27 +0200 Subject: [PATCH 02/19] docs: Added tutorial for case_f (time-dependent model with only forecast files). --- docs/examples/case_f.rst | 103 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 docs/examples/case_f.rst diff --git a/docs/examples/case_f.rst b/docs/examples/case_f.rst new file mode 100644 index 0000000..fad63fa --- /dev/null +++ b/docs/examples/case_f.rst @@ -0,0 +1,103 @@ +G - Time-Dependent, Catalog-Based Model (from existing files) +========================================================== + +.. currentmodule:: floatcsep + +.. contents:: + :local: + +.. admonition:: **TL; DR** + + In a terminal, navigate to ``floatcsep/examples/case_f`` and type: + + .. code-block:: console + + $ floatcsep run config.yml + + After the calculation is complete, the results will be summarized in ``results/report.md``. + + +Experiment Components +--------------------- + + +This example shows how set up a time-dependent model, whose files are already existing, and experiment. The model structure is as follows: +:: + + case_f + └── etas + ├── forecasts + ├── etas_2016-11-14_2016-11-15.csv (forecast files) + ... + └── etas_2016-11-20_2016-11-21.csv + ├── catalog.csv + ├── config.yml + ├── models.yml + └── tests.yml + +* The model to be evaluated (``etas``) is a collection of daily forecasts from ``2016-11-14`` until ``2016-11-21``. + +* The forecasts are located in a folder ``forecasts`` inside the model, to be consistent with models based on source codes (see the subsequent examples). + + +Model +----- + +The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. For this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (https://doi.org/10.1785/0220200231 +), with which the experiment has no interface. This means that we only the forecast files are required. We leave the handling of a model source code for subsequent examples. + + + +Configuration +------------- + + +Time +~~~~ + + The configuration is identical to time-independent models with multiple time-windows (e.g., case C), with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` + + .. literalinclude:: ../../examples/case_f/config.yml + :language: yaml + :lines: 3-7 + +Catalog +~~~~~~~ + + The catalog was obtained ``previous to the experiment`` using ``query_geonet`` and it was filtered to the testing period. + +Models +~~~~~~ + + Some additional arguments should be passed to a time-dependent model + + .. literalinclude:: ../../examples/case_f/models.yml + :language: yaml + :lines: 1-4 + + For consistency with time-dependent models that will create forecasts from a source code, the ``path`` should point to the folder of the model. The path folder should contain a sub-folder named ``{path}/forecasts`` where the files are located. Note that fore catalog-based forecasts, the number of simulations should be explicit. + +Tests +~~~~~ + + With time-dependent models, now catalog evaluations found in :obj:`csep.core.catalog_evaluations` can be used. + + + .. literalinclude:: ../../examples/case_f/tests.yml + :language: yaml + + .. note:: + It is possible to assign two plotting functions to a test, whose ``plot_args`` and ``plot_kwargs`` can be placed indented beneath + + +Running the experiment +---------------------- + + The experiment can be run by simply navigating to the ``examples/case_h`` folder in the terminal and typing. + + .. code-block:: console + + $ floatcsep run config.yml + + This will automatically set all the calculation paths (testing catalogs, evaluation results, figures) and will create a summarized report in ``results/report.md``. + From 7e020458e9c326f52a1e1b08cc0e27d81c90ea88 Mon Sep 17 00:00:00 2001 From: pciturri Date: Wed, 18 Sep 2024 18:18:42 +0200 Subject: [PATCH 03/19] docs: Finalized example tutoriales for cases a-f. fix: the configuration for plot_forecasts now accept `catalog: True` instead of a dictionary. --- docs/examples/case_a.rst | 47 ++++---- docs/examples/case_b.rst | 26 +++-- docs/examples/case_c.rst | 41 ++++--- docs/examples/case_d.rst | 24 +++-- docs/examples/case_e.rst | 63 ++++++++--- docs/examples/case_f.rst | 49 ++++++--- docs/examples/case_g.rst | 28 ++++- docs/examples/case_h.rst | 148 ++++++++++++++++++++++++++ docs/guide/postprocess_config.rst | 4 + docs/index.rst | 4 +- examples/case_a/best_model.dat | 3 +- examples/case_a/config.yml | 4 + examples/case_d/config.yml | 3 - examples/case_e/config.yml | 1 + examples/case_f/config.yml | 2 +- examples/case_g/custom_plot_script.py | 6 +- examples/case_h/config.yml | 4 +- examples/case_h/custom_report.py | 11 ++ examples/case_h/models.yml | 2 +- floatcsep/postprocess/plot_handler.py | 2 + 20 files changed, 365 insertions(+), 107 deletions(-) create mode 100644 docs/examples/case_h.rst create mode 100644 docs/guide/postprocess_config.rst diff --git a/docs/examples/case_a.rst b/docs/examples/case_a.rst index 5e71c49..93978dd 100644 --- a/docs/examples/case_a.rst +++ b/docs/examples/case_a.rst @@ -1,10 +1,9 @@ A - Simple Model and Catalog ============================ -.. currentmodule:: floatcsep +The following example shows the definition of a testing experiment of a single **time-independent** forecast against a catalog. -.. contents:: - :local: +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,11 +15,15 @@ A - Simple Model and Catalog After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + :depth: 2 + Experiment Components --------------------- -The following example shows the definition of a testing experiment of a single **time-independent** forecast against a catalog. The example files are found in ``floatcsep/examples/case_a``. The input structure of the experiment is: +The source code can be found in the ``examples/case_a`` folder or in `GitHub `_. The directory structure of the experiment is: :: @@ -34,14 +37,17 @@ The following example shows the definition of a testing experiment of a single * * The testing region ``region.txt`` consists of a grid with two 1ºx1º bins, defined by its bottom-left nodes. The grid spacing is obtained automatically. The nodes are: .. literalinclude:: ../../examples/case_a/region.txt + :caption: examples/case_a/region.txt * The testing catalog ``catalog.csep`` contains only one event and is formatted in the :meth:`~pycsep.utils.readers.csep_ascii` style (see :doc:`pycsep:concepts/catalogs`). Catalog formats are detected automatically .. literalinclude:: ../../examples/case_a/catalog.csep + :caption: examples/case_a/catalog.csep * The forecast ``best_model.dat`` to be evaluated is written in the ``.dat`` format (see :doc:`pycsep:concepts/forecasts`). Forecast formats are detected automatically (see :mod:`floatcsep.utils.readers.ForecastParsers`) .. literalinclude:: ../../examples/case_a/best_model.dat + :caption: examples/case_a/best_model.dat Configuration @@ -62,6 +68,7 @@ Time The time configuration is manifested in the ``time_config`` inset. The simplest definition is to set only the start and end dates of the experiment. These are always UTC date-times in isoformat (``%Y-%m-%dT%H:%M:%S.%f`` - ISO861): .. literalinclude:: ../../examples/case_a/config.yml + :caption: examples/case_a/config.yml :language: yaml :lines: 3-5 @@ -77,6 +84,7 @@ Region The region - a file path or a :mod:`pycsep` function, such as :obj:`~csep.core.regions.italy_csep_region` (check the available regions in :mod:`csep.core.regions`) -, the depth limits and magnitude discretization are defined in the ``region_config`` inset. .. literalinclude:: ../../examples/case_a/config.yml + :caption: examples/case_a/config.yml :language: yaml :lines: 7-13 @@ -84,9 +92,10 @@ Region Catalog ~~~~~~~ - It is defined in the ``catalog`` inset. This should only make reference to a catalog file or a catalog query function (e.g. :func:`~csep.query_comcat`). ``floatcsep`` will automatically filter the catalog to the experiment time, spatial and magnitude frames: + It is defined in the ``catalog`` inset. This should only make reference to a catalog **file** or a catalog **query function** (e.g. :func:`~csep.query_comcat`). **floatCSEP** will automatically filter the catalog to the experiment time, spatial and magnitude frames: .. literalinclude:: ../../examples/case_a/config.yml + :caption: examples/case_a/config.yml :language: yaml :lines: 15-15 @@ -95,6 +104,7 @@ Models The model configuration is set in the ``models`` inset with a list of model names, which specify their file paths (and other attributes). Here, we just set the path as ``best_model.dat``, whose format is automatically detected. .. literalinclude:: ../../examples/case_a/config.yml + :caption: examples/case_a/config.yml :language: yaml :lines: 17-19 @@ -107,6 +117,7 @@ Evaluations The experiment's evaluations are defined in the ``tests`` inset. It should be a list of test names, making reference to their function and plotting function. These can be either defined in ``pycsep`` (see :doc:`pycsep:concepts/evaluations`) or manually. In this example, we employ the consistency N-test: its function is :func:`csep.core.poisson_evaluations.number_test`, whereas its plotting function correspond to :func:`csep.utils.plots.plot_poisson_consistency_test` .. literalinclude:: ../../examples/case_a/config.yml + :caption: examples/case_a/config.yml :language: yaml :lines: 21-24 @@ -127,26 +138,8 @@ Run command .. note:: - The command ``floatcsep run `` can be called from any working directory, as long as the specified file paths (e.g. region, models) are relative to the ``config.yml`` file. - - -Plot command -~~~~~~~~~~~~ - - If only the result plots are desired, when the calculation was already completed, you can type: - - .. code-block:: console - - $ floatcsep plot config.yml - - This can be used, for example, when an additional plot is desired. Try adding to ``config.yml`` the following lines - - .. code-block:: yaml - - postproc_config: - plot_forecasts: True + The command ``floatcsep run {config_file}`` can be called from any working directory, as long as the specified file paths (e.g. region, models) are relative to the ``config.yml`` file. - and re-run with the ``plot`` command. A forecast figure will appear in ``results/{window}/forecasts`` Results ~~~~~~~ @@ -155,13 +148,13 @@ Results * The testing catalog of the window is stored in ``results/{window}/catalog`` in ``json`` format. This is a subset of the global testing catalog. * Human-readable results are found in ``results/{window}/evaluations`` - * Catalog and evaluation results figures in ``results/{window}/figures``. + * Catalog, forecasts and evaluation results figures in ``results/{window}/figures``. * The complete results are summarized in ``results/report.md`` Advanced --------- +~~~~~~~~ -The experiment run logic can be seen in the file ``case_a.py``, which executes the same example but in python source code. The run logic of the terminal commands ``run``, ``plot`` and ``reproduce`` can be found in :mod:`floatcsep.commands.main` +The experiment run logic can be seen in the file ``case_a.py``, which executes the same example but in python source code. The run logic of the terminal commands ``run``, ``plot`` and ``reproduce`` can be found in :mod:`floatcsep.commands.main`, and can be customized by creating a script similar to ``case_a.py``. diff --git a/docs/examples/case_b.rst b/docs/examples/case_b.rst index 8c30099..700019f 100644 --- a/docs/examples/case_b.rst +++ b/docs/examples/case_b.rst @@ -1,10 +1,9 @@ B - Multiple Models and Tests ============================= -.. currentmodule:: floatcsep +The following example is an experiment including **multiple** time-independent forecasts and **multiple** evaluations. -.. contents:: - :local: +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,11 +15,15 @@ B - Multiple Models and Tests After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + :depth: 2 + Experiment Components --------------------- -The following example is an experiment including **multiple** time-independent forecasts and evaluations. The input structure of the experiment is: +The source code can be found in the ``examples/case_b`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -36,11 +39,11 @@ The following example is an experiment including **multiple** time-independent f ├── tests.yml └── region.txt - -The testing catalog is now defined in ``json`` format, which is the default catalog used by ``floatcsep``, as it allows the storage of metadata. +.. important:: + Although not necessary, the testing catalog is here defined in the ``.json`` format, which is the default catalog used by ``floatcsep``, as it allows the storage of metadata. .. note:: - An user-defined catalog can be saved as ``json`` with :meth:`CSEPCatalog.write_json() ` using ``pycsep`` + A catalog can be stored as ``.json`` with :meth:`CSEPCatalog.write_json() ` using ``pycsep`` Configuration @@ -49,10 +52,11 @@ Configuration In this example, the time, region and catalog specifications are written in the ``config.yml`` file. .. literalinclude:: ../../examples/case_b/config.yml + :caption: examples/case_b/config.yml :language: yaml :lines: 3-15 -whereas the models' and tests' configurations are referred to external files for readability +whereas the models' and tests' configurations are referred to external files for better readability .. literalinclude:: ../../examples/case_b/config.yml :language: yaml @@ -64,6 +68,7 @@ Models The model configuration is now set in the ``models.yml`` file, where a list of model names specify their file paths. .. literalinclude:: ../../examples/case_b/models.yml + :caption: examples/case_b/models.yml :language: yaml Evaluations @@ -72,11 +77,12 @@ Evaluations .. literalinclude:: ../../examples/case_b/tests.yml :language: yaml + :caption: examples/case_b/tests.yml .. note:: Plotting keyword arguments can be set in the ``plot_kwargs`` option - see :func:`~csep.utils.plots.plot_poisson_consistency_test` and :func:`~csep.utils.plots.plot_comparison_test` -. - .. note:: + .. important:: Comparison tests (such as the ``paired_t_test``) requires a reference model, whose name should be set in ``ref_model`` at the given test configuration. Running the experiment @@ -87,7 +93,7 @@ The experiment can be run by simply navigating to the ``examples/case_b`` folder .. code-block:: console - floatcsep run config.yml + $ floatcsep run config.yml This will automatically set all the file paths of the calculation (testing catalogs, evaluation results, figures) and will display a summarized report in ``results/report.md``. diff --git a/docs/examples/case_c.rst b/docs/examples/case_c.rst index e7d4a39..8368ca7 100644 --- a/docs/examples/case_c.rst +++ b/docs/examples/case_c.rst @@ -1,10 +1,9 @@ C - Multiple Time Windows ========================= -.. currentmodule:: floatcsep +The following example shows an experiment with **multiple time windows**. -.. contents:: - :local: +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,11 +15,15 @@ C - Multiple Time Windows After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + + Experiment Components --------------------- -The following example shows an experiment with multiple time windows. The input structure of the experiment is: +The source code can be found in the ``examples/case_c`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -42,11 +45,12 @@ Configuration Time ~~~~ - The time configuration now set the time intervals between the start and end dates. + The time configuration now sets a sequence of time intervals between the start and end dates. .. literalinclude:: ../../examples/case_c/config.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_c/config.yml + :language: yaml + :lines: 3-7 .. note:: @@ -58,25 +62,32 @@ Time Evaluations ~~~~~~~~~~~ - The experiment's evaluations are defined in ``tests.yml``, which can now include temporal evaluations (see :func:`~floatcsep.extras.sequential_likelihood`, :func:`~floatcsep.extras.sequential_information_gain`, :func:`~floatcsep.utils.plot_sequential_likelihood`). + The experiment's evaluations are defined in ``tests.yml``, which can now include temporal evaluations (see :func:`~floatcsep.utils.helpers.sequential_likelihood`, :func:`~floatcsep.utils.helpers.sequential_information_gain`, :func:`~floatcsep.utils.helpers.plot_sequential_likelihood`). .. literalinclude:: ../../examples/case_c/tests.yml - :language: yaml + :language: yaml + :caption: examples/case_c/tests.yml .. note:: - Plot arguments (title, labels, font sizes, axes limits, etc.) can be passed as a dictionary in ``plot_args`` (see details in :func:`~csep.utils.plots.plot_poisson_consistency_test`) + Plot arguments (title, labels, font sizes, axes limits, etc.) can be passed as a dictionary in ``plot_args`` (see the arguments details in :func:`~csep.utils.plots.plot_poisson_consistency_test`) Results ------- -The :obj:`~floatcsep.cmd.main.run` command creates the result path tree for all time windows. +The :obj:`~floatcsep.cmd.main.run` command + +.. code-block:: console + + $ floatcsep run config.yml + +now creates the result path tree for all time windows. -* The testing catalog of the window is stored in ``results/{window}/catalog`` in ``json`` format. This is a subset of the global testing catalog. -* Human-readable results are found in ``results/{window}/evaluations`` -* Catalog and evaluation results figures in ``results/{window}/figures``. +* The testing catalog of the window is stored in ``results/{time_window}/catalog`` in ``json`` format. This is a subset of the global testing catalog. +* Human-readable results are found in ``results/{time_window}/evaluations`` +* Catalog and evaluation results figures in ``results/{time_window}/figures``. * The complete results are summarized in ``results/report.md`` -The report now shows the temporal evaluations for all time-windows, whereas the discrete evaluations are shown only for the last time window. +The report shows the temporal evaluations for all time-windows, whereas the discrete evaluations are shown only for the last time window. diff --git a/docs/examples/case_d.rst b/docs/examples/case_d.rst index bbf7445..ef9c9c9 100644 --- a/docs/examples/case_d.rst +++ b/docs/examples/case_d.rst @@ -1,10 +1,11 @@ D - Catalog Queries and Model Repositories ========================================== -.. currentmodule:: floatcsep +The following example shows an experiment whose forecasts are **retrieved from a repository** (Zenodo - https://zenodo.org) and the testing **catalog** from an authoritative source **web service** (namely the gCMT catalog from the International Seismological Centre - http://www.isc.ac.uk). + -.. contents:: - :local: + +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,11 +17,14 @@ D - Catalog Queries and Model Repositories After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + Experiment Components --------------------- -The following example shows an experiment whose forecasts are retrieved from a repository (Zenodo - https://zenodo.org) and the testing catalog from an authoritative source web service (namely the gCMT catalog from the ISC - http://www.isc.ac.uk). The initial structure is: +The source code can be found in the ``examples/case_d`` folder or in `GitHub `_. The **initial** input structure of the experiment is: :: @@ -60,8 +64,9 @@ Catalog The ``catalog`` inset from ``config.yml`` now makes reference to a catalog query function, in this case :func:`~pycsep.query_gcmt`. .. literalinclude:: ../../examples/case_d/config.yml - :language: yaml - :lines: 14-14 + :caption: examples/case_d/config.yml + :language: yaml + :lines: 14-14 ``floatcsep`` will automatically filter the catalog to the experiment time, spatial and magnitude windows of the experiment. @@ -74,14 +79,15 @@ Models The model configuration is set in ``models.yml``. .. literalinclude:: ../../examples/case_d/models.yml - :language: yaml + :caption: examples/case_d/models.yml + :language: yaml * The option ``zenodo_id`` makes reference to the zenodo **record id**. The model ``team`` is found in https://zenodo.org/record/6289795, whereas the model ``wheel`` in https://zenodo.org/record/6255575. - * The option ``flavours`` allows multiple model sub-classes to be quickly instantiated. - * The ``zenodo`` (or ``git``) repositories could contain multiple files, each of which can be assigned to a flavour. + * The option ``flavours`` allows multiple model sub-classes to be quickly instantiated. + * When multiple flavours are passed, ``path`` refers to the folder where the models would be downloaded. * If a single file of the repository is needed (without specifying model flavours), ``path`` can reference to the file itself. For example, you can try replacing the whole WHEEL inset in ``models.yml`` to: diff --git a/docs/examples/case_e.rst b/docs/examples/case_e.rst index acb93ba..53c37be 100644 --- a/docs/examples/case_e.rst +++ b/docs/examples/case_e.rst @@ -1,10 +1,9 @@ E - A Realistic Time-independent Experiment =========================================== -.. currentmodule:: floatcsep +This example shows how to run a realistic testing experiment (based on https://doi.org/10.4401/ag-4844) while summarizing the concepts from the previous examples. -.. contents:: - :local: +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,11 +15,15 @@ E - A Realistic Time-independent Experiment After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + + Experiment Components --------------------- -This example shows how to run a realistic testing experiment in Italy (based on https://doi.org/10.4401/ag-4844), summarizing the concepts of previous examples. The example has only a subset of the original models and evaluations. The input structure of the experiment is: +The source code can be found in the ``examples/case_e`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -33,6 +36,9 @@ This example shows how to run a realistic testing experiment in Italy (based on ├── models.yml └── tests.yml +.. note:: + This experiment has only a subset of the original models and evaluations. + Configuration ------------- @@ -44,8 +50,9 @@ Time The time configuration is manifested in the ``time-config`` inset. .. literalinclude:: ../../examples/case_e/config.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_e/config.yml + :language: yaml + :lines: 3-7 Region ~~~~~~ @@ -53,8 +60,9 @@ Region The testing region is the official Italy CSEP Region obtained from :obj:`csep.core.regions.italy_csep_region`. .. literalinclude:: ../../examples/case_e/config.yml - :language: yaml - :lines: 9-15 + :caption: examples/case_e/config.yml + :language: yaml + :lines: 9-15 Catalog @@ -63,21 +71,23 @@ Catalog The catalog is obtained from an authoritative source, namely the Bollettino Sismico Italiano (http://terremoti.ingv.it/en/bsi ), using the function :func:`csep.query_bsi` .. literalinclude:: ../../examples/case_e/config.yml - :language: yaml - :lines: 17-17 + :caption: examples/case_e/config.yml + :language: yaml + :lines: 17-17 Models ~~~~~~ The models are set in ``models.yml``. For simplicity, there are only three of the nineteen models originally submitted to the Italy Experiment. .. literalinclude:: ../../examples/case_e/models.yml - :language: yaml + :caption: examples/case_e/models.yml + :language: yaml The ``.xml`` format is automatically detected and parsed by ``floatcsep`` readers. - .. note:: + .. important:: - The forecasts are defined in ``[Earthquakes / 10-years]``, specified with the ``forecast_unit`` option. + The forecasts are defined in ``[Earthquakes / 10-years]``, which is specified with the ``forecast_unit`` option (The default is `forecast_unit: 1`). .. note:: @@ -86,23 +96,42 @@ Models Post-Process ~~~~~~~~~~~~ - Additional options for post-processing can set using the ``postprocess`` option. + Additional options for post-processing can set using the ``postprocess`` option. Here, we customize the forecasts plotting with: .. literalinclude:: ../../examples/case_e/config.yml :language: yaml :lines: 21-34 - The forecasts are plotted and stored in ``examples/case_e/results/{timewindow}/forecasts/``. See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plot options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top. + The forecasts are plotted and stored in ``examples/case_e/results/{timewindow}/forecasts/``. See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plotting options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top of those plots. Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_e`` folder in the terminal and typing. + The experiment can be run by navigating to the ``examples/case_e`` folder in the terminal and typing. .. code-block:: console - floatcsep run config.yml + $ floatcsep run config.yml This will automatically set all the calculation paths (testing catalogs, evaluation results, figures) and will create a summarized report in ``results/report.md``. + +Plot command +~~~~~~~~~~~~ + + If only the result plots are desired when the calculation was already completed before, you can type: + + .. code-block:: console + + $ floatcsep plot config.yml + + This can be used, for example, when an additional plot is desired without re-running the entire experiment. Try adding the following line to the ``postprocess`` inset of the ``config.yml`` file. + + .. code-block:: yaml + + postprocess: + plot_forecasts: + colormap: magma + + and re-run with the ``plot`` command. A forecast figure will re-appear in ``results/{window}/forecasts`` with a different colormap. Additional forecast and catalog plotting options can be found in the :func:`csep.utils.plots.plot_spatial_dataset` and :func:`csep.utils.plots.plot_catalog` ``pycsep`` functions. diff --git a/docs/examples/case_f.rst b/docs/examples/case_f.rst index fad63fa..858d9ad 100644 --- a/docs/examples/case_f.rst +++ b/docs/examples/case_f.rst @@ -1,10 +1,9 @@ -G - Time-Dependent, Catalog-Based Model (from existing files) -========================================================== +F - Time-Dependent Catalog-Based Model (from existing files) +============================================================= -.. currentmodule:: floatcsep +This example shows how set up an experiment with a **time-dependent** model, whose forecast files already exist. -.. contents:: - :local: +.. currentmodule:: floatcsep .. admonition:: **TL; DR** @@ -16,12 +15,16 @@ G - Time-Dependent, Catalog-Based Model (from existing files) After the calculation is complete, the results will be summarized in ``results/report.md``. +.. contents:: + :local: + Experiment Components --------------------- -This example shows how set up a time-dependent model, whose files are already existing, and experiment. The model structure is as follows: +The source files can be found in the ``examples/case_e`` folder or in `GitHub `_. The experiment structure is as follows: + :: case_f @@ -37,13 +40,14 @@ This example shows how set up a time-dependent model, whose files are already ex * The model to be evaluated (``etas``) is a collection of daily forecasts from ``2016-11-14`` until ``2016-11-21``. -* The forecasts are located in a folder ``forecasts`` inside the model, to be consistent with models based on source codes (see the subsequent examples). +.. important:: + The forecasts must be located in a folder ``forecasts`` inside the model folder. This is meant for consistency with models based on source codes (see subsequent examples). Model ----- -The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. For this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (https://doi.org/10.1785/0220200231 +The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. In this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (https://doi.org/10.1785/0220200231 ), with which the experiment has no interface. This means that we only the forecast files are required. We leave the handling of a model source code for subsequent examples. @@ -55,27 +59,40 @@ Configuration Time ~~~~ - The configuration is identical to time-independent models with multiple time-windows (e.g., case C), with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` + The configuration is identical to time-independent models with multiple time-windows (e.g., case C) with the exception that a ``horizon`` could be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td``. .. literalinclude:: ../../examples/case_f/config.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_f/config.yml + :language: yaml + :lines: 3-7 + +.. note:: + **floatCSEP** is flexible with the definition of time windows/deltas. Alternative string inputs for ``horizon`` can be ``1-day``, ``1 day``, ``1d``, etc. Catalog ~~~~~~~ - The catalog was obtained ``previous to the experiment`` using ``query_geonet`` and it was filtered to the testing period. + The catalog ``catalog.json`` was obtained *previously* by using ``query_geonet`` and it was filtered to the testing period. However, it can be re-queried by changing its definition to: + + .. code-block:: yaml + + catalog: query_geonet Models ~~~~~~ - Some additional arguments should be passed to a time-dependent model + Some additional arguments should be passed to a **time-dependent** model, such as its class ('td' for time-dependent) and the number of simulations. .. literalinclude:: ../../examples/case_f/models.yml - :language: yaml - :lines: 1-4 + :caption: examples/case_f/config.yml + :language: yaml + :lines: 1-4 + +.. note:: + For consistency with time-dependent models that will create forecasts from a source code, the ``path`` should point to the folder of the model, which itself should contain a sub-folder named ``{path}/forecasts`` where the files are located. - For consistency with time-dependent models that will create forecasts from a source code, the ``path`` should point to the folder of the model. The path folder should contain a sub-folder named ``{path}/forecasts`` where the files are located. Note that fore catalog-based forecasts, the number of simulations should be explicit. +.. important:: + Note that for catalog-based forecasts, the model should explicit the number of simulations. This is meant for forecast files that contain synthetic catalogs with zero-event simulations, and therefore do not contain the total number of synthetic catalogs used. Tests ~~~~~ diff --git a/docs/examples/case_g.rst b/docs/examples/case_g.rst index 58de35b..f901df6 100644 --- a/docs/examples/case_g.rst +++ b/docs/examples/case_g.rst @@ -20,8 +20,8 @@ G - Time-Dependent, Catalog-Based Model (from Source Code) Experiment Components --------------------- - This example shows how a time-dependent model should be set up for a time-dependent experiment + :: case_g @@ -53,7 +53,7 @@ The experiment's complexity increases from time-independent to dependent, since .. literalinclude:: ../../examples/case_g/catalog.csv :lines: 1-2 - 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will read `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. + 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will access `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. * **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT @@ -126,6 +126,30 @@ Tests It is possible to assign two plotting functions to a test, whose ``plot_args`` and ``plot_kwargs`` can be placed indented beneath +Custom Post-Process +~~~~~~~~~~~~~~~~~~~ + + Additional to the default :func:`~floatcsep.postprocess.plot_handler.plot_results`, :func:`~floatcsep.postprocess.plot_handler.plot_catalogs`, :func:`~floatcsep.postprocess.plot_handler.plot_forecasts` functions, a custom plotting function(s) can be set within the ``postprocess`` configuration + + .. literalinclude:: ../../examples/case_g/config.yml + :language: yaml + :lines: 22-23 + + This option provides `hook` for a python script and a function within as: + + .. code-block:: console + + {python_sript}:{function_name} + + The requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as argument + + .. literalinclude:: ../../examples/case_g/custom_plot_script.py + :language: yaml + :lines: 6-9 + + In this way, the plot function use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_g/custom_plot_script.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment artifacts. + + Running the experiment ---------------------- diff --git a/docs/examples/case_h.rst b/docs/examples/case_h.rst new file mode 100644 index 0000000..d0a5134 --- /dev/null +++ b/docs/examples/case_h.rst @@ -0,0 +1,148 @@ +H - Multiple Catalog-Based Models +================================= + +.. currentmodule:: floatcsep + +.. contents:: + :local: + :depth: 1 + +.. admonition:: **TL; DR** + + In a terminal, navigate to ``floatcsep/examples/case_h`` and type: + + .. code-block:: console + + $ floatcsep run config.yml + + After the calculation is complete, the results will be summarized in ``results/report.md``. + + +Experiment Components +--------------------- + +This example shows how to run an experiment that access, downloads, containerize and execute multiple time-dependent models. The experiment input files are: + +:: + + case_h + ├── catalog.csv + ├── config.yml + ├── models.yml + └── tests.yml + +* The ``models.yml`` contains the instructions to clone and build the source codes from software repositories (e.g., gitlab, Github) + + +Models +------ + +As in Example G, the complexity increases because each **Model** requires to build and execute a source code to generate forecast for multilpe time-windows. The instructions for each model are located within ``models.yml``. The URL and specific version (e.g., commit hash, tag, release) are specified as: + + + .. literalinclude:: ../../examples/case_h/models.yml + :lines: 1-3 + +The model source code requires to be synchronized with the experiment interface, in such a way that is able to read the inputs (catalog and argument file) from an ``{model_path}/input`` folder and store the forecast outputs from a folder ``{model_path}/forecasts``. + + .. literalinclude:: ../../examples/case_h/models.yml + :lines: 4-6 + +The ``func`` parameter indicates how the model should be invoked from a terminal (e.g, a python virtual environment, docker container, etc.). The type of container is set with the parameter ``build`` (``floatcsep`` supports ``conda``, ``venv`` and ``Dockerfile``). Note that we specify to ``floatcsep`` which arguments file will be read from the module. In this case, the ETAS model uses ``args.json`` file (``floatcsep`` suports ``.json`` and ``.txt`` files). ``floatcsep`` will dynamically modify the ``start_time`` and ``end_time`` for each time window run, and statically (i.e., for all time-windows) allocate the parameters set as: + + .. literalinclude:: ../../examples/case_h/models.yml + :lines: 7-9 + +Same as Example G, the repositories should follow the following: + + +* **Input**: The input consists in input **data** and **arguments**. + + 1. The **input data** is, at the least, a catalog filtered until the forecast beginning, which is automatically allocated by ``floatcsep`` in the `{model}/input` prior to each model's run. It is stored inside the model in ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). + + .. literalinclude:: ../../examples/case_h/catalog.csv + :lines: 1-2 + + 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will access `{model}/input/args.json` and change the values of ``"start_date": "{datetime}"`` and ``"end_date": "{datetime}"`` before the model is run. Additional arguments can be set by convenience, such as ``n_sims`` (number of synthetic catalogs), ``m_c`` for the cutoff magnitude and a random ``seed`` for reproducibility. + +* **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT + +* **Model build**: Inside the model source code, there are multiple options to build it. A standard python ``setup.cfg`` is given, which can be built inside a python ``venv`` or ``conda`` managers. This is created and built automatically by ``floatCSEP``, as long as the the model build instructions are correctly set up. + +* **Model run**: The model should be run with a simple command to which only ``arguments`` should be passed. For this example, is + + .. code-block:: console + + $ etas-run + + + as long as it internally reads the ``input/args.json`` and ``input/catalog.csv`` files. + + +Configuration +------------- + + +Time +~~~~ + + The configuration is identical to time-independent models, with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` + + .. literalinclude:: ../../examples/case_h/config.yml + :language: yaml + :lines: 3-7 + +Catalog +~~~~~~~ + + The catalog was obtained ``previous to the experiment`` using ``query_bsi``, but it was filtered from 2006 onwards, so it has enough data for the model calibration. + + +Tests +~~~~~ + + With time-dependent models, now catalog evaluations found in :obj:`csep.core.catalog_evaluations` can be used. + + + .. literalinclude:: ../../examples/case_h/tests.yml + :language: yaml + + .. note:: + It is possible to assign two plotting functions to a test, whose ``plot_args`` and ``plot_kwargs`` can be placed indented beneath + + +Custom Post-Process +~~~~~~~~~~~~~~~~~~~ + + A custom reporting function can be set within the ``postprocess`` configuration to replace the :func:`~floatcsep.postprocess.reporting.generate_report`: + + .. literalinclude:: ../../examples/case_h/config.yml + :language: yaml + :lines: 22-23 + + This option provides `hook` for a python script and a function within as: + + .. code-block:: console + + {python_sript}:{function_name} + + The requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as argument + + .. literalinclude:: ../../examples/case_h/custom_report.py + :language: yaml + :lines: 5-11 + + In this way, the report function use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_h/custom_report.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment artifacts. + + +Running the experiment +---------------------- + + The experiment can be run by simply navigating to the ``examples/case_h`` folder in the terminal and typing. + + .. code-block:: console + + $ floatcsep run config.yml + + This will automatically set all the calculation paths (testing catalogs, evaluation results, figures) and will create a summarized report in ``results/report.md``. + diff --git a/docs/guide/postprocess_config.rst b/docs/guide/postprocess_config.rst new file mode 100644 index 0000000..025b590 --- /dev/null +++ b/docs/guide/postprocess_config.rst @@ -0,0 +1,4 @@ +Post-process options +==================== + +TBI \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 82ab549..40a4956 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,8 +20,9 @@ Preliminary documentation. examples/case_c.rst examples/case_d.rst examples/case_e.rst + examples/case_f.rst examples/case_g.rst - + examples/case_h.rst .. toctree:: :maxdepth: 2 @@ -32,6 +33,7 @@ Preliminary documentation. guide/region_config.rst guide/model_config.rst guide/tests_config.rst + guide/postprocess_config.rst .. toctree:: :maxdepth: 2 diff --git a/examples/case_a/best_model.dat b/examples/case_a/best_model.dat index a5b5003..55957d9 100644 --- a/examples/case_a/best_model.dat +++ b/examples/case_a/best_model.dat @@ -1,4 +1,3 @@ # lon_min lon_max lat_min lat_max depth_min depth_max mag_min mag_max rate mask 0 1 0 1 0 70 6 7 5e-1 1 -1 2 0 1 0 70 6 7 5e-1 0.1 - +1 2 0 1 0 70 6 7 5e-1 0.1 \ No newline at end of file diff --git a/examples/case_a/config.yml b/examples/case_a/config.yml index 1835b0d..ceab9a3 100644 --- a/examples/case_a/config.yml +++ b/examples/case_a/config.yml @@ -23,3 +23,7 @@ tests: func: poisson_evaluations.number_test plot_func: plot_poisson_consistency_test +postprocess: + plot_forecasts: + cmap: magma + catalog: True diff --git a/examples/case_d/config.yml b/examples/case_d/config.yml index dd2726b..a4d4917 100644 --- a/examples/case_d/config.yml +++ b/examples/case_d/config.yml @@ -14,6 +14,3 @@ region_config: catalog: query_gcmt models: models.yml test_config: tests.yml - -postprocess: - plot_forecasts: True \ No newline at end of file diff --git a/examples/case_e/config.yml b/examples/case_e/config.yml index 1f235e5..5fc86c9 100644 --- a/examples/case_e/config.yml +++ b/examples/case_e/config.yml @@ -20,6 +20,7 @@ test_config: tests.yml postprocess: plot_forecasts: + cmap: magma region_border: True basemap: stock_img clabel_fontsize: 14 diff --git a/examples/case_f/config.yml b/examples/case_f/config.yml index 68adf11..d62af88 100644 --- a/examples/case_f/config.yml +++ b/examples/case_f/config.yml @@ -1,4 +1,4 @@ -name: case_g +name: case_f time_config: start_date: 2016-11-14T00:00:00 diff --git a/examples/case_g/custom_plot_script.py b/examples/case_g/custom_plot_script.py index 6f9d62f..c19c656 100644 --- a/examples/case_g/custom_plot_script.py +++ b/examples/case_g/custom_plot_script.py @@ -5,7 +5,11 @@ def main(experiment): """ - Example custom plot function + Example custom plot function (Observed vs. forecast rates in time) + + Args: + experiment: a floatcsep.experiment.Experiment class + """ # Get all the timewindows diff --git a/examples/case_h/config.yml b/examples/case_h/config.yml index ca5c7f9..3d93d70 100644 --- a/examples/case_h/config.yml +++ b/examples/case_h/config.yml @@ -1,4 +1,4 @@ -name: case_f +name: case_h time_config: start_date: 2016-8-25T00:00:00 @@ -20,5 +20,5 @@ model_config: models.yml test_config: tests.yml postprocess: + report: custom_report.py:main plot_catalog: False - report: custom_report.py:main \ No newline at end of file diff --git a/examples/case_h/custom_report.py b/examples/case_h/custom_report.py index 2d4d0cf..d705d5d 100644 --- a/examples/case_h/custom_report.py +++ b/examples/case_h/custom_report.py @@ -3,10 +3,19 @@ def main(experiment): + """ + Args: + experiment: a floatcsep.experiment.Experiment class + + """ + # Access the last time-window timewindow = experiment.timewindows[-1] + + # Convert the time-window to a string timestr = timewindow2str(timewindow) + # Instantiates a Report object and adds a title and objectives report = MarkdownReport() report.add_title(f"Experiment Report - {experiment.name}", "") report.add_heading("Objectives", level=2) @@ -17,6 +26,7 @@ def main(experiment): ] report.add_list(objs) + # Adds an input figure report.add_figure( f"Input catalog", [ @@ -44,4 +54,5 @@ def main(experiment): width=200, ) + # Stores the report report.save(experiment.registry.abs(experiment.registry.run_dir)) diff --git a/examples/case_h/models.yml b/examples/case_h/models.yml index e2c99f7..fb3a607 100644 --- a/examples/case_h/models.yml +++ b/examples/case_h/models.yml @@ -1,8 +1,8 @@ - etas: giturl: https://git.gfz-potsdam.de/csep/it_experiment/models/vetas.git repo_hash: v3.2 - args_file: input/args.json path: models/etas + args_file: input/args.json func: etas-run func_kwargs: n_sims: 100 diff --git a/floatcsep/postprocess/plot_handler.py b/floatcsep/postprocess/plot_handler.py index c8d0671..f6531c4 100644 --- a/floatcsep/postprocess/plot_handler.py +++ b/floatcsep/postprocess/plot_handler.py @@ -96,6 +96,8 @@ def plot_forecasts(experiment: "Experiment") -> None: # If catalog option is passed, catalog is plotted on top of the forecast if plot_forecast_config.get("catalog"): cat_args = plot_forecast_config.get("catalog", {}) + if cat_args is True: + cat_args = {} experiment.catalog_repo.get_test_cat(window).plot( ax=ax, extent=ax.get_extent(), From 91dad5c0792f60fc0048bbc498d995eb6843af8d Mon Sep 17 00:00:00 2001 From: pciturri Date: Sun, 22 Sep 2024 23:39:07 +0200 Subject: [PATCH 04/19] docs: Finalized tutorials G and H. Reworked local TOC for all examples. --- docs/examples/case_a.rst | 2 +- docs/examples/case_b.rst | 2 +- docs/examples/case_c.rst | 2 +- docs/examples/case_d.rst | 2 +- docs/examples/case_e.rst | 2 +- docs/examples/case_f.rst | 7 +- docs/examples/case_g.rst | 111 ++++++++++++++++++++---------- docs/examples/case_h.rst | 137 +++++++++++++++++++++++++++---------- docs/index.rst | 11 +-- examples/case_h/models.yml | 6 +- 10 files changed, 194 insertions(+), 88 deletions(-) diff --git a/docs/examples/case_a.rst b/docs/examples/case_a.rst index 93978dd..f8d218c 100644 --- a/docs/examples/case_a.rst +++ b/docs/examples/case_a.rst @@ -15,7 +15,7 @@ The following example shows the definition of a testing experiment of a single * After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: :depth: 2 diff --git a/docs/examples/case_b.rst b/docs/examples/case_b.rst index 700019f..2a5897f 100644 --- a/docs/examples/case_b.rst +++ b/docs/examples/case_b.rst @@ -15,7 +15,7 @@ The following example is an experiment including **multiple** time-independent f After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: :depth: 2 diff --git a/docs/examples/case_c.rst b/docs/examples/case_c.rst index 8368ca7..5410ae0 100644 --- a/docs/examples/case_c.rst +++ b/docs/examples/case_c.rst @@ -15,7 +15,7 @@ The following example shows an experiment with **multiple time windows**. After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: diff --git a/docs/examples/case_d.rst b/docs/examples/case_d.rst index ef9c9c9..90ddff3 100644 --- a/docs/examples/case_d.rst +++ b/docs/examples/case_d.rst @@ -17,7 +17,7 @@ The following example shows an experiment whose forecasts are **retrieved from a After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: diff --git a/docs/examples/case_e.rst b/docs/examples/case_e.rst index 53c37be..dda7f5f 100644 --- a/docs/examples/case_e.rst +++ b/docs/examples/case_e.rst @@ -15,7 +15,7 @@ This example shows how to run a realistic testing experiment (based on https://d After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: diff --git a/docs/examples/case_f.rst b/docs/examples/case_f.rst index 858d9ad..a2856a4 100644 --- a/docs/examples/case_f.rst +++ b/docs/examples/case_f.rst @@ -15,7 +15,7 @@ This example shows how set up an experiment with a **time-dependent** model, who After the calculation is complete, the results will be summarized in ``results/report.md``. -.. contents:: +.. contents:: Contents :local: @@ -47,8 +47,7 @@ The source files can be found in the ``examples/case_e`` folder or in `GitHub < Model ----- -The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. In this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (https://doi.org/10.1785/0220200231 -), with which the experiment has no interface. This means that we only the forecast files are required. We leave the handling of a model source code for subsequent examples. +The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. In this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (`doi:10.1785/0220200231 `_), with which the experiment has no interface. This means that we use **only the forecast files** and no source code. We leave the handling of a model source code for subsequent examples. @@ -59,7 +58,7 @@ Configuration Time ~~~~ - The configuration is identical to time-independent models with multiple time-windows (e.g., case C) with the exception that a ``horizon`` could be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td``. + The configuration is analogous to time-independent models with multiple time-windows (e.g., case C) with the exception that a ``horizon`` could be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td``. .. literalinclude:: ../../examples/case_f/config.yml :caption: examples/case_f/config.yml diff --git a/docs/examples/case_g.rst b/docs/examples/case_g.rst index f901df6..448e7ce 100644 --- a/docs/examples/case_g.rst +++ b/docs/examples/case_g.rst @@ -1,10 +1,9 @@ +.. _example_g: + G - Time-Dependent, Catalog-Based Model (from Source Code) ========================================================== -.. currentmodule:: floatcsep - -.. contents:: - :local: +Here, we set up a time-dependent model from its **source code** for an experiment. .. admonition:: **TL; DR** @@ -17,67 +16,95 @@ G - Time-Dependent, Catalog-Based Model (from Source Code) After the calculation is complete, the results will be summarized in ``results/report.md``. +.. currentmodule:: floatcsep + +.. contents:: Contents + :local: + + + Experiment Components --------------------- -This example shows how a time-dependent model should be set up for a time-dependent experiment +The example folder contains also, along with the already known components (configurations, catalog), a sub-folder for the **source code** of the model ``pymock``. The components of the experiment (and model) are: :: case_g - └── pymock - ├── input - ├── args.txt (model arguments) - └── catalog.csv (dynamically allocated catalog) - ├── pymock (model source code) - └── forecasts (where forecasts will be stored) + └── pymock (Model's source code) + ├── input (input interface to floatcsep) + ├── args.txt (model arguments) + └── catalog.csv (dynamically allocated catalog) + ├── pymock + ├── libs.py (helper functions) + └── main.py (main routines) + └── forecasts (output interface to floatcsep) + ... (forecasts should be stored here when the model is run) + ├── run.py (One of the possibilities to run the model) + ├── pyproject.toml (Build instructions) + ├── setup.cfg (Build instructions) + ├── setup.py (Build instructions) + ├── requirements.txt(Build instructions) + ├── Dockerfile (Build instructions) + └── README.md (Information) + ├── catalog.csv ├── config.yml ├── models.yml + ├── custom_plot_script.py └── tests.yml * The model to be evaluated (``pymock``) is a source code that generates forecasts for multiple time windows. -* The testing catalog ``catalog.csv`` works also as the input catalog, by being filtered until the starting test_date and allocated in `pymock/input` dynamically (before the model is run) +* The testing catalog ``catalog.csv`` works also as the input catalog, by being filtered until the testing ``start_date`` and allocated in `pymock/input` dynamically (before each time the model is run) +.. _Model: Model ----- -The experiment's complexity increases from time-independent to dependent, since we now need a **Model** (source code) that is able to generate forecast that changes every window. The model should be conceptualized as a **black-box**, whose only interface/interaction with the ``floatcsep`` system is to receive an input (i.e., input catalog and arguments) and generates an output (the forecasts). +The experiment's complexity increases from time-independent to dependent mostly because we now need a **Model** (source code) to generate forecasts that changes for every time-window. The model main components are: + * **Input**: The input consists in input **data** and **arguments**. - 1. The **input data** is, at the least, a catalog filtered until the forecast beginning, which is automatically allocated by ``floatcsep`` in the `{model}/input` prior to each model's run. It is stored inside the model in ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). + 1. The **input data** is, at the very least, a catalog filtered until the forecast beginning. The catalog will be automatically allocated by ``floatcsep`` prior to each model's run (e.g., a single forecast run) in the `{model}/input` folder. It is stored in the ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). .. literalinclude:: ../../examples/case_g/catalog.csv + :caption: examples/case_g/catalog.csv :lines: 1-2 - 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will access `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. + 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model are the forecast ``start_date`` and ``end_date``, which will be modified dynamically during an experiment with multiple time-windows. The experiment system will access `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as (not limited to) ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. -* **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT +* **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv` by the source code after each rone. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folows the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT * **Model build**: Inside the model source code, there are multiple options to build it. A standard python ``setup.cfg`` is given, which can be built inside a python ``venv`` or ``conda`` managers. This is created and built automatically by ``floatCSEP``, as long as the the model build instructions are correctly set up. -* **Model run**: The model should be run with a simple command to which only ``arguments`` should be passed. For this example, is +* **Model run**: The model should be run with a simple command, e.g. **entrypoint**, to which only ``arguments`` could be passed if desired. The ``pymock`` model contains multiple example of entrypoints, but the modeler should use only one for clarity. + + 1. A `python` call with arguments .. code-block:: console - $ python pymock/run.py input/args.txt + $ python run.py input/args.txt - or using a binary (see ``pymock/setup.cfg:entry_point``) + 2. Using a binary entrypoint with arguments (for instance, defined in the python build instructions: ``pymock/setup.cfg:entry_point``) .. code-block:: console $ pymock input/args.txt - It can also be run simply by + 3. A single binary entrypoint without arguments . .. code-block:: console $ pymock - as long as it internally reads the ``input/args.txt`` and ``input/catalog.csv`` files. + This means that the source code should internally read the input data and arguments, ``input/catalog.csv`` and ``input/args.txt`` files respectively. + +.. important:: + + The model should be conceptualized as a **black-box**, whose only interface/interaction with the ``floatcsep`` system is to receive an input (i.e., input catalog and arguments) and generates an output (the forecasts). Configuration @@ -90,13 +117,14 @@ Time The configuration is identical to time-independent models, with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` .. literalinclude:: ../../examples/case_g/config.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_g/config.yml + :language: yaml + :lines: 3-7 Catalog ~~~~~~~ - The catalog was obtained ``previous to the experiment`` using ``query_bsi``, but it was filtered from 2006 onwards, so it has enough data for the model calibration. + The catalog was obtained `previous to the experiment` using ``query_bsi``, but it was filtered from 2006 onwards, so it has enough data for the model calibration. Models ~~~~~~ @@ -104,14 +132,22 @@ Models Additional arguments should be passed to time-independent models. .. literalinclude:: ../../examples/case_g/models.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_g/models.yml + :language: yaml + :lines: 1-7 - Now ``path`` points to the folder where the source is installed. Input and forecasts should be in ``{path}/input`` and ``{path}/forecasts``. The ``func`` option is the shell command with which the model is run (the shell will be run from the model's directory). Note that ``python run.py`` can be changed to ``pymock`` (see entry_point in ``pymock/setup.cfg``). In practice, the model will be run as + 1. Now ``path`` points to the folder where the source is installed. Therefore, the input and the forecasts should be allocated ``{path}/input`` and ``{path}/forecasts``, respectively. + 2. The ``func`` option is the shell command with which the model is run. As seen in the `Model`_ section, this could be either ``pymock``, ``pymock input/args.txt`` or ``python run.py input/args``. We use the simplest option ``pymock``, but you are welcome to try different entrypoints. - .. code-block:: console + .. note:: + The ``func`` command will be run from the model's directory and a model containerization (e.g., ``Dockerfile``, ``conda``). + + 3. The ``func_kwargs`` are extra arguments that will annotated to the ``input/args.txt`` file every time the model is run, or will be passed as extra arguments to the ``func`` call (Note that the two options are identical). This is useful to define sub-classes of models (or flavours) that uses the same source code, but a different instantiation. + 4. The ``build`` option defines the style of container within which the model will be placed. Currently in **floatCSEP**, only the python module ``venv``, the package manager ``conda`` and the containerization manager ``Docker`` are currently supported. + + .. important:: + For these examples, we use ``venv`` sub-environments, but we recommend ``Docker`` to set up real experiments. - $ python {path}/run.py {path}/input/args.txt Tests ~~~~~ @@ -120,7 +156,8 @@ Tests .. literalinclude:: ../../examples/case_g/tests.yml - :language: yaml + :caption: examples/case_g/tests.yml + :language: yaml .. note:: It is possible to assign two plotting functions to a test, whose ``plot_args`` and ``plot_kwargs`` can be placed indented beneath @@ -132,8 +169,9 @@ Custom Post-Process Additional to the default :func:`~floatcsep.postprocess.plot_handler.plot_results`, :func:`~floatcsep.postprocess.plot_handler.plot_catalogs`, :func:`~floatcsep.postprocess.plot_handler.plot_forecasts` functions, a custom plotting function(s) can be set within the ``postprocess`` configuration .. literalinclude:: ../../examples/case_g/config.yml - :language: yaml - :lines: 22-23 + :caption: examples/case_g/config.yml + :language: yaml + :lines: 22-23 This option provides `hook` for a python script and a function within as: @@ -144,10 +182,13 @@ Custom Post-Process The requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as argument .. literalinclude:: ../../examples/case_g/custom_plot_script.py - :language: yaml - :lines: 6-9 + :caption: examples/case_g/custom_plot_script.py + :language: python + :lines: 6-13 + + - In this way, the plot function use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_g/custom_plot_script.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment artifacts. + In this way, the plot function can use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_g/custom_plot_script.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment data in runtime. Running the experiment diff --git a/docs/examples/case_h.rst b/docs/examples/case_h.rst index d0a5134..4628c3b 100644 --- a/docs/examples/case_h.rst +++ b/docs/examples/case_h.rst @@ -1,11 +1,7 @@ H - Multiple Catalog-Based Models ================================= -.. currentmodule:: floatcsep - -.. contents:: - :local: - :depth: 1 +Here, we run an experiment that access, containerize and execute multiple **time-dependent models**, and then proceeds to evaluate the forecasts once they are created. .. admonition:: **TL; DR** @@ -17,70 +13,136 @@ H - Multiple Catalog-Based Models After the calculation is complete, the results will be summarized in ``results/report.md``. +.. currentmodule:: floatcsep + +.. contents:: Contents + :local: + + Experiment Components --------------------- -This example shows how to run an experiment that access, downloads, containerize and execute multiple time-dependent models. The experiment input files are: +The experiment input files are: :: case_h ├── catalog.csv ├── config.yml - ├── models.yml - └── tests.yml + ├── tests.yml + └── models.yml -* The ``models.yml`` contains the instructions to clone and build the source codes from software repositories (e.g., gitlab, Github) +* The ``models.yml`` contains the instructions to clone and build the source codes from software repositories (e.g., gitlab, Github), and how to interface them with **floatCSEP**. Once downloaded and built, the experiment structure should look like: +:: + + case_h + ├── models + ├── etas + └── ... (ETAS source code) + ├── pymock_poisson + └── ... (Poisson-PyMock source code) + └── pymock_nb + └── ... (Negative-Binomial-PyMock source code) + ├── catalog.csv + ├── config.yml + ├── tests.yml + ├── custom_report.py + └── models.yml + +Configuration +------------- Models ------- +~~~~~~ -As in Example G, the complexity increases because each **Model** requires to build and execute a source code to generate forecast for multilpe time-windows. The instructions for each model are located within ``models.yml``. The URL and specific version (e.g., commit hash, tag, release) are specified as: +As in :ref:`Tutorial G`, each **Model** requires to build and execute a source code to generate forecasts. The instructions for each model are located within ``models.yml``, which we further explain here: +.. note:: + The ``models.yml`` will define how to interface **floatCSEP** to each Model, implying that a Model should be developed, or adapted to ensure the interface requirements specified below. + +1. The repository URL of each model and their specific versions (e.g., commit hash, tag, release) are specified as: .. literalinclude:: ../../examples/case_h/models.yml - :lines: 1-3 + :caption: examples/case_h/models.yml + :language: yaml + :lines: 1-3, 11-13, 21-23 -The model source code requires to be synchronized with the experiment interface, in such a way that is able to read the inputs (catalog and argument file) from an ``{model_path}/input`` folder and store the forecast outputs from a folder ``{model_path}/forecasts``. +2. A ``path`` needs to be indicated for each model, to both download the repository contents therein and from where the source code will be executed. .. literalinclude:: ../../examples/case_h/models.yml - :lines: 4-6 + :caption: examples/case_h/models.yml + :language: yaml + :lines: 1-4 + :emphasize-lines: 4 + :lineno-match: + + .. important:: + The implies that the inputs (catalog and argument file) should be read by the model from a ``{path}/input`` folder, and the forecast outputs stored into a folder ``{path}/forecasts``. -The ``func`` parameter indicates how the model should be invoked from a terminal (e.g, a python virtual environment, docker container, etc.). The type of container is set with the parameter ``build`` (``floatcsep`` supports ``conda``, ``venv`` and ``Dockerfile``). Note that we specify to ``floatcsep`` which arguments file will be read from the module. In this case, the ETAS model uses ``args.json`` file (``floatcsep`` suports ``.json`` and ``.txt`` files). ``floatcsep`` will dynamically modify the ``start_time`` and ``end_time`` for each time window run, and statically (i.e., for all time-windows) allocate the parameters set as: +2. There is some flexibility to interface **floatCSEP** with a model. For instance, a different `filepath` can be set for the argument file: .. literalinclude:: ../../examples/case_h/models.yml - :lines: 7-9 + :caption: examples/case_h/models.yml + :language: yaml + :lines: 5 + :lineno-match: -Same as Example G, the repositories should follow the following: + .. note:: + **floatCSEP** can read `.txt`, `.json` and `.yml` format-styled argument files. In all cases, the minimum required arguments, should be formatted as: + .. code-block:: console -* **Input**: The input consists in input **data** and **arguments**. + #.txt + start_date = {DATESTRING} + end_date = {DATESTRING} - 1. The **input data** is, at the least, a catalog filtered until the forecast beginning, which is automatically allocated by ``floatcsep`` in the `{model}/input` prior to each model's run. It is stored inside the model in ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). + .. code-block:: yaml - .. literalinclude:: ../../examples/case_h/catalog.csv - :lines: 1-2 + #.yml + start_date: {DATESTRING} + end_date: {DATESTRING} - 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model (which should be modified dynamically during an experiment) are the forecast ``start_date`` and ``end_date``. The experiment will access `{model}/input/args.json` and change the values of ``"start_date": "{datetime}"`` and ``"end_date": "{datetime}"`` before the model is run. Additional arguments can be set by convenience, such as ``n_sims`` (number of synthetic catalogs), ``m_c`` for the cutoff magnitude and a random ``seed`` for reproducibility. + .. code-block:: json -* **Output**: The model's output are the synthetic catalogs, which should be allocated in `{model}/forecasts/{filename}.csv`. The format is identically to ``csep_ascii``, but unlike in an input catalog, the ``catalog_id`` column should be modified for each synthetic catalog starting from 0. The file name follows the convention `{model_name}_{start}_{end}.csv`, where ``start`` and ``end`` folowws the `%Y-%m-%dT%H:%M:%S.%f` - ISO861 FORMAT + //.json + "start_date": "{DATESTRING}", + "end_date": "{DATESTRING}" -* **Model build**: Inside the model source code, there are multiple options to build it. A standard python ``setup.cfg`` is given, which can be built inside a python ``venv`` or ``conda`` managers. This is created and built automatically by ``floatCSEP``, as long as the the model build instructions are correctly set up. + **floatcsep** will dynamically modify the ``start_date`` and ``start_date`` for each time window run, and any extra arguments will just be added for all time-windows. -* **Model run**: The model should be run with a simple command to which only ``arguments`` should be passed. For this example, is +4. The ``func`` entry indicates how the models are invoked from a shell terminal. - .. code-block:: console + .. literalinclude:: ../../examples/case_h/models.yml + :caption: examples/case_h/models.yml + :language: yaml + :lines: 1,6,11,15,21,25 - $ etas-run + .. important:: + Please refer to :ref:`Tutorial G` for example of how to set up ``func`` for the model and interface it to **floatCSEP**. +5. A prefix for the resulting forecast filepaths can be specified beforehand for each model. Without specifying this, the default is ``{model_name}`` (e.g., `etas`, `Poisson Mock`, `Negbinom Mock`). - as long as it internally reads the ``input/args.json`` and ``input/catalog.csv`` files. + .. literalinclude:: ../../examples/case_h/models.yml + :caption: examples/case_h/models.yml + :language: yaml + :lines: 21, 26 + The experiment will read the forecasts as: -Configuration -------------- + .. code-block:: + + {model_path}/{forecasts}/{prefix}_{start}_{end}.csv + + where ``start`` and ``end`` follow either the ``%Y-%m-%dT%H:%M:%S.%f`` - ISO861 FORMAT, or the short date version ``%Y-%m-%d`` if the windows are set by midnight. + +6. Additional function arguments can be passed to the model with the entry ``func_kwargs``. We perhaps noted that both Poisson Mock and Negbinom Mock use the same source code. With ``func_kwargs`` a different subclass can be defined for the same source code (in this case, a Negative-Binomial number distribution instead of Poisson). + + .. literalinclude:: ../../examples/case_h/models.yml + :caption: examples/case_h/models.yml + :language: yaml + :lines: 11,17-20,21,27-31 Time @@ -89,13 +151,14 @@ Time The configuration is identical to time-independent models, with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` .. literalinclude:: ../../examples/case_h/config.yml - :language: yaml - :lines: 3-7 + :caption: examples/case_h/config.yml + :language: yaml + :lines: 3-7 Catalog ~~~~~~~ - The catalog was obtained ``previous to the experiment`` using ``query_bsi``, but it was filtered from 2006 onwards, so it has enough data for the model calibration. + The catalog was obtained `previous to the experiment` using ``query_bsi``, but it was filtered from 2006 onwards, so it has enough data for the model calibration. Tests @@ -105,7 +168,8 @@ Tests .. literalinclude:: ../../examples/case_h/tests.yml - :language: yaml + :caption: examples/case_h/tests.yml + :language: yaml .. note:: It is possible to assign two plotting functions to a test, whose ``plot_args`` and ``plot_kwargs`` can be placed indented beneath @@ -117,8 +181,9 @@ Custom Post-Process A custom reporting function can be set within the ``postprocess`` configuration to replace the :func:`~floatcsep.postprocess.reporting.generate_report`: .. literalinclude:: ../../examples/case_h/config.yml - :language: yaml - :lines: 22-23 + :caption: examples/case_h/config.yml + :language: yaml + :lines: 22-23 This option provides `hook` for a python script and a function within as: diff --git a/docs/index.rst b/docs/index.rst index 40a4956..dba327f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -24,6 +24,12 @@ Preliminary documentation. examples/case_g.rst examples/case_h.rst +.. toctree:: + :maxdepth: 0 + :caption: Help & Reference + + reference/api_reference + .. toctree:: :maxdepth: 2 :caption: Defining an Experiment @@ -41,11 +47,6 @@ Preliminary documentation. deployment/intro.rst -.. toctree:: - :maxdepth: 0 - :caption: Help & Reference - - reference/api_reference diff --git a/examples/case_h/models.yml b/examples/case_h/models.yml index fb3a607..dad36f1 100644 --- a/examples/case_h/models.yml +++ b/examples/case_h/models.yml @@ -23,10 +23,10 @@ repo_hash: v0.1 path: models/pymock_nb func: pymock + prefix: pymock func_kwargs: n_sims: 100 mag_min: 3.5 - apply_mc_to_lambda: True - distribution: negbinom seed: 23 - prefix: pymock + distribution: negbinom + apply_mc_to_lambda: True From 263269afc871a30a310925c8b3560e761df1e307 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 23 Sep 2024 17:08:29 +0200 Subject: [PATCH 05/19] docs: Updated frontpage --- docs/examples/case_a.rst | 6 ++- docs/examples/case_b.rst | 2 + docs/examples/case_c.rst | 2 + docs/examples/case_d.rst | 2 + docs/examples/case_e.rst | 2 + docs/examples/case_f.rst | 6 ++- docs/examples/case_g.rst | 4 +- docs/examples/case_h.rst | 6 ++- docs/index.rst | 77 ++++++++++++++++++++++++++++++++++--- docs/intro/installation.rst | 9 +++-- 10 files changed, 99 insertions(+), 17 deletions(-) diff --git a/docs/examples/case_a.rst b/docs/examples/case_a.rst index f8d218c..4fe7f9a 100644 --- a/docs/examples/case_a.rst +++ b/docs/examples/case_a.rst @@ -1,5 +1,7 @@ -A - Simple Model and Catalog -============================ +.. _example_a: + +A - Testing a Simple Model +========================== The following example shows the definition of a testing experiment of a single **time-independent** forecast against a catalog. diff --git a/docs/examples/case_b.rst b/docs/examples/case_b.rst index 2a5897f..d98dc42 100644 --- a/docs/examples/case_b.rst +++ b/docs/examples/case_b.rst @@ -1,3 +1,5 @@ +.. _example_b: + B - Multiple Models and Tests ============================= diff --git a/docs/examples/case_c.rst b/docs/examples/case_c.rst index 5410ae0..2236cf3 100644 --- a/docs/examples/case_c.rst +++ b/docs/examples/case_c.rst @@ -1,3 +1,5 @@ +.. _example_c: + C - Multiple Time Windows ========================= diff --git a/docs/examples/case_d.rst b/docs/examples/case_d.rst index 90ddff3..03c9611 100644 --- a/docs/examples/case_d.rst +++ b/docs/examples/case_d.rst @@ -1,3 +1,5 @@ +.. _example_d: + D - Catalog Queries and Model Repositories ========================================== diff --git a/docs/examples/case_e.rst b/docs/examples/case_e.rst index dda7f5f..c86d015 100644 --- a/docs/examples/case_e.rst +++ b/docs/examples/case_e.rst @@ -1,3 +1,5 @@ +.. _example_e: + E - A Realistic Time-independent Experiment =========================================== diff --git a/docs/examples/case_f.rst b/docs/examples/case_f.rst index a2856a4..c31dc24 100644 --- a/docs/examples/case_f.rst +++ b/docs/examples/case_f.rst @@ -1,5 +1,7 @@ -F - Time-Dependent Catalog-Based Model (from existing files) -============================================================= +.. _example_f: + +F - Testing Catalog-Based Forecasts +=================================== This example shows how set up an experiment with a **time-dependent** model, whose forecast files already exist. diff --git a/docs/examples/case_g.rst b/docs/examples/case_g.rst index 448e7ce..d83cb03 100644 --- a/docs/examples/case_g.rst +++ b/docs/examples/case_g.rst @@ -1,7 +1,7 @@ .. _example_g: -G - Time-Dependent, Catalog-Based Model (from Source Code) -========================================================== +G - A Time-Dependent Experiment +=============================== Here, we set up a time-dependent model from its **source code** for an experiment. diff --git a/docs/examples/case_h.rst b/docs/examples/case_h.rst index 4628c3b..58f71d6 100644 --- a/docs/examples/case_h.rst +++ b/docs/examples/case_h.rst @@ -1,5 +1,7 @@ -H - Multiple Catalog-Based Models -================================= +.. _example_h: + +H - Multiple Time-Dependent Models +================================== Here, we run an experiment that access, containerize and execute multiple **time-dependent models**, and then proceeds to evaluate the forecasts once they are created. diff --git a/docs/index.rst b/docs/index.rst index dba327f..b9fe17f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,73 @@ +=============================== floatCSEP: Floating Experiments =============================== -Preliminary documentation. +*Testing earthquake forecasts made simple.* + +.. image:: https://img.shields.io/pypi/v/floatcsep.svg + :target: https://pypi.org/project/floatcsep/ + :alt: PyPI version + +.. image:: https://img.shields.io/conda/vn/conda-forge/floatcsep.svg + :target: https://anaconda.org/conda-forge/floatcsep + :alt: Conda Version + +.. image:: https://github.com/cseptesting/floatcsep/actions/workflows/build-test.yml/badge.svg + :target: https://github.com/cseptesting/floatcsep/actions + :alt: Build Status + +.. image:: https://img.shields.io/github/license/cseptesting/floatcsep.svg + :target: https://github.com/cseptesting/floatcsep/blob/main/LICENSE + :alt: License + + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7953816.svg + :target: https://doi.org/10.5281/zenodo.7953816 + :alt: Zenodo + + +.. |start| image:: https://img.icons8.com/office/40/rocket.png + :target: intro/installation.html + :height: 48px + +.. |learn1| image:: https://img.icons8.com/nolan/64/literature.png + :target: https://docs.cseptesting.org/getting_started/core_concepts.html + :height: 48px + +.. |learn2| image:: https://i.postimg.cc/wMTtqBGB/icons8-literature-64.png + :target: https://docs.cseptesting.org/getting_started/theory.html + :height: 48px + +.. |experiment| image:: https://img.icons8.com/pulsar-color/48/science-application.png + :height: 48px + +.. |api| image:: https://img.icons8.com/nolan/64/code--v2.png + :target: reference/api_reference.html + :height: 48px + +.. |tutorials| image:: https://img.icons8.com/nolan/64/checklist.png + :target: examples/case_a.html + :height: 48px + +Quickstart +---------- + ++--------------------------------------------------+-------------------------------------+ +| |start| **Get Started** | |tutorials| **Tutorials** | +| | | +| |learn1| **Forecasting Concepts** | - :ref:`example_a` | +| | - :ref:`example_b` | +| |learn2| **Testing Theory** | - :ref:`example_c` | +| | - :ref:`example_d` | +| |experiment| **Floating Experiments** | - :ref:`example_e` | +| | - :ref:`example_f` | +| |api| **API Reference** | - :ref:`example_g` | +| | - :ref:`example_h` | ++--------------------------------------------------+-------------------------------------+ + .. toctree:: + :hidden: :maxdepth: 1 :caption: Get Started @@ -12,6 +76,7 @@ Preliminary documentation. .. toctree:: + :hidden: :maxdepth: 1 :caption: Tutorial Experiments @@ -25,6 +90,7 @@ Preliminary documentation. examples/case_h.rst .. toctree:: + :hidden: :maxdepth: 0 :caption: Help & Reference @@ -32,6 +98,7 @@ Preliminary documentation. .. toctree:: :maxdepth: 2 + :hidden: :caption: Defining an Experiment guide/config.rst @@ -42,6 +109,7 @@ Preliminary documentation. guide/postprocess_config.rst .. toctree:: + :hidden: :maxdepth: 2 :caption: Deploying an Experiment @@ -50,9 +118,8 @@ Preliminary documentation. -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` +Search +====== + * :ref:`search` diff --git a/docs/intro/installation.rst b/docs/intro/installation.rst index 24b6eda..4cdbeca 100644 --- a/docs/intro/installation.rst +++ b/docs/intro/installation.rst @@ -1,13 +1,14 @@ Installation ============ - .. note:: - - This application uses ``python >= 3.8`` - Installing the latest version ----------------------------- + .. important:: + + This application uses ``python >= 3.9`` + + Using ``conda`` ~~~~~~~~~~~~~~~ From b973be14b72385bfd9c4325637d502037e2d61c4 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 23 Sep 2024 18:18:13 +0200 Subject: [PATCH 06/19] docs: Updated docs front page with useful links. --- docs/conf.py | 17 ++++ docs/examples/case_d.rst | 4 +- docs/examples/case_e.rst | 4 +- docs/examples/case_g.rst | 4 +- docs/examples/case_h.rst | 4 +- docs/guide/config.rst | 2 +- docs/guide/model_config.rst | 2 +- docs/guide/postprocess_config.rst | 2 +- docs/guide/region_config.rst | 2 +- docs/guide/tests_config.rst | 2 +- docs/guide/time_config.rst | 2 +- docs/index.rst | 97 +++++++++++++++---- ...{concepts.rst => floating_experiments.rst} | 31 ------ docs/intro/forecasting_experiments.rst | 5 + requirements_dev.txt | 1 + setup.cfg | 1 + 16 files changed, 117 insertions(+), 63 deletions(-) rename docs/intro/{concepts.rst => floating_experiments.rst} (70%) create mode 100644 docs/intro/forecasting_experiments.rst diff --git a/docs/conf.py b/docs/conf.py index 79f8e6c..64f56d3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ "sphinx.ext.viewcode", "sphinx.ext.napoleon", "sphinx.ext.intersphinx", + "sphinx_copybutton", ] # language = 'en' @@ -65,3 +66,19 @@ } html_logo = "_static/floatcsep_logo.svg" todo_include_todos = False + +copybutton_prompt_text = "$ " # Text to ignore when copying (for shell commands) +copybutton_only_copy_prompt_lines = False + + +rst_epilog = """ +.. raw:: html + +
+ +""" \ No newline at end of file diff --git a/docs/examples/case_d.rst b/docs/examples/case_d.rst index 03c9611..fbeb505 100644 --- a/docs/examples/case_d.rst +++ b/docs/examples/case_d.rst @@ -1,7 +1,7 @@ .. _example_d: -D - Catalog Queries and Model Repositories -========================================== +D - Catalog and Model Queries +============================= The following example shows an experiment whose forecasts are **retrieved from a repository** (Zenodo - https://zenodo.org) and the testing **catalog** from an authoritative source **web service** (namely the gCMT catalog from the International Seismological Centre - http://www.isc.ac.uk). diff --git a/docs/examples/case_e.rst b/docs/examples/case_e.rst index c86d015..208246a 100644 --- a/docs/examples/case_e.rst +++ b/docs/examples/case_e.rst @@ -1,7 +1,7 @@ .. _example_e: -E - A Realistic Time-independent Experiment -=========================================== +E - A Time-Independent Experiment +================================= This example shows how to run a realistic testing experiment (based on https://doi.org/10.4401/ag-4844) while summarizing the concepts from the previous examples. diff --git a/docs/examples/case_g.rst b/docs/examples/case_g.rst index d83cb03..9529e40 100644 --- a/docs/examples/case_g.rst +++ b/docs/examples/case_g.rst @@ -1,7 +1,7 @@ .. _example_g: -G - A Time-Dependent Experiment -=============================== +G - Testing a Time-Dependent Model +================================== Here, we set up a time-dependent model from its **source code** for an experiment. diff --git a/docs/examples/case_h.rst b/docs/examples/case_h.rst index 58f71d6..6f3592e 100644 --- a/docs/examples/case_h.rst +++ b/docs/examples/case_h.rst @@ -1,7 +1,7 @@ .. _example_h: -H - Multiple Time-Dependent Models -================================== +H - A time-dependent experiment +=============================== Here, we run an experiment that access, containerize and execute multiple **time-dependent models**, and then proceeds to evaluate the forecasts once they are created. diff --git a/docs/guide/config.rst b/docs/guide/config.rst index 86a7a6e..2a6bd75 100644 --- a/docs/guide/config.rst +++ b/docs/guide/config.rst @@ -1,4 +1,4 @@ -Experiment configuration +Experiment Configuration ======================== In progress \ No newline at end of file diff --git a/docs/guide/model_config.rst b/docs/guide/model_config.rst index 165f615..18e29db 100644 --- a/docs/guide/model_config.rst +++ b/docs/guide/model_config.rst @@ -1,4 +1,4 @@ -Models configuration +Models Configuration ==================== TBI \ No newline at end of file diff --git a/docs/guide/postprocess_config.rst b/docs/guide/postprocess_config.rst index 025b590..d682785 100644 --- a/docs/guide/postprocess_config.rst +++ b/docs/guide/postprocess_config.rst @@ -1,4 +1,4 @@ -Post-process options +Post-process Options ==================== TBI \ No newline at end of file diff --git a/docs/guide/region_config.rst b/docs/guide/region_config.rst index d9c8cd4..add2089 100644 --- a/docs/guide/region_config.rst +++ b/docs/guide/region_config.rst @@ -1,4 +1,4 @@ -Region definition +Region Definition ================= TBI \ No newline at end of file diff --git a/docs/guide/tests_config.rst b/docs/guide/tests_config.rst index fbca1bc..c83c7ff 100644 --- a/docs/guide/tests_config.rst +++ b/docs/guide/tests_config.rst @@ -1,4 +1,4 @@ -Evaluations definition +Evaluations Definition ====================== TBI \ No newline at end of file diff --git a/docs/guide/time_config.rst b/docs/guide/time_config.rst index d0642a8..a96c689 100644 --- a/docs/guide/time_config.rst +++ b/docs/guide/time_config.rst @@ -1,4 +1,4 @@ -Temporal definition +Temporal Definition =================== TBI \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index b9fe17f..0982c6b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,6 +4,18 @@ floatCSEP: Floating Experiments *Testing earthquake forecasts made simple.* +.. image:: https://img.shields.io/badge/GitHub-Repository-blue?logo=github + :target: https://github.com/cseptesting/floatcsep + :alt: GitHub Repository + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7953816.svg + :target: https://doi.org/10.5281/zenodo.7953816 + :alt: Zenodo + +.. image:: https://img.shields.io/github/license/cseptesting/floatcsep.svg + :target: https://github.com/cseptesting/floatcsep/blob/main/LICENSE + :alt: License + .. image:: https://img.shields.io/pypi/v/floatcsep.svg :target: https://pypi.org/project/floatcsep/ :alt: PyPI version @@ -12,18 +24,6 @@ floatCSEP: Floating Experiments :target: https://anaconda.org/conda-forge/floatcsep :alt: Conda Version -.. image:: https://github.com/cseptesting/floatcsep/actions/workflows/build-test.yml/badge.svg - :target: https://github.com/cseptesting/floatcsep/actions - :alt: Build Status - -.. image:: https://img.shields.io/github/license/cseptesting/floatcsep.svg - :target: https://github.com/cseptesting/floatcsep/blob/main/LICENSE - :alt: License - - -.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7953816.svg - :target: https://doi.org/10.5281/zenodo.7953816 - :alt: Zenodo .. |start| image:: https://img.icons8.com/office/40/rocket.png @@ -49,6 +49,7 @@ floatCSEP: Floating Experiments :target: examples/case_a.html :height: 48px + Quickstart ---------- @@ -65,6 +66,70 @@ Quickstart | | - :ref:`example_h` | +--------------------------------------------------+-------------------------------------+ +What is floatCSEP +----------------- + +The `Collaboratory for the Study of Earthquake Predictability `_ (CSEP) has organized Earthquake Forecast Testing Experiments during the last decades and is now consolidating its research into open-software initiatives. + +**floatCSEP** is an easy-to-use software application that contains the workflow to deploy Earthquake Forecasting Experiments. It is based on the code python library **pyCSEP** (`Github `_), which itself contains the core routines to test earthquake forecasts. + +Goals +----- + + * Set up a testing experiment for your forecasts using authoritative data sources/benchmarks. + * Encapsulate the complete experiment's definition and rules in a couple of lines. + * Produce human-readable results and figures. + * Reproduce, reuse, and share forecasting experiments. + +Running +------- + +Start using **floatCSEP** by `installing `_ the latest version and running the ``examples`` with simply: + +.. code-block:: + + $ floatcsep run config.yml + +Useful Links +------------ + ++---------------------------------------------------------+-----------------------------------------+ +| .. image:: https://img.icons8.com/nolan/64/github.png | **GitHub Repository** | +| :height: 48px | | +| :target: https://github.com/cseptesting/floatcsep | | ++---------------------------------------------------------+-----------------------------------------+ +| .. image:: https://i.postimg.cc/HW2Pssx1/logo-csep.png | **CSEP Website** | +| :height: 48px | | +| :target: https://cseptesting.org | | ++---------------------------------------------------------+-----------------------------------------+ +| .. image:: https://img.icons8.com/nolan/64/github.png | **pyCSEP GitHub** | +| :height: 48px | | +| :target: https://github.com/sceccode/pycsep | | ++---------------------------------------------------------+-----------------------------------------+ +| .. image:: https://img.icons8.com/nolan/64/europe.png | **European Testing Center** | +| :height: 48px | | +| :target: http://eqstats.efehr.org | | ++---------------------------------------------------------+-----------------------------------------+ + + + + +Collaborators +------------- + + * Pablo Iturrieta, GFZ Potsdam (pciturri@gfz-potsdam.de) + * William Savran, University of Nevada, Reno + * Jose Bayona, University of Bristol + * Francesco Serafini, University of Edinburgh + * Khawaja Asim, GFZ Potsdam + * Fabio Silva, Southern California Earthquake Center + * Marcus Hermann, University of Naples ‘Frederico II’ + * Max Werner, University of Bristol + * Danijel Schorlemmner, GFZ Potsdam + * Philip Maechling, Southern California Earthquake Center + + + .. toctree:: :hidden: @@ -72,7 +137,8 @@ Quickstart :caption: Get Started intro/installation.rst - intro/concepts.rst + intro/forecasting_experiments.rst + intro/floating_experiments.rst .. toctree:: @@ -118,8 +184,3 @@ Quickstart - -Search -====== - -* :ref:`search` diff --git a/docs/intro/concepts.rst b/docs/intro/floating_experiments.rst similarity index 70% rename from docs/intro/concepts.rst rename to docs/intro/floating_experiments.rst index dde7229..85fe246 100644 --- a/docs/intro/concepts.rst +++ b/docs/intro/floating_experiments.rst @@ -22,34 +22,3 @@ This is an application to deploy reproducible and prospective experiments of ear * Produce human-readable results and figures. * Reproduce, reuse, and share forecasting experiments. -Collaborators -------------- - - * Pablo Iturrieta, GFZ Potsdam (pciturri@gfz-potsdam.de) - - * William Savran, UNR - - * Fabio Silva, Southern California Earthquake Center - - * Khawaja Asim, GFZ Potsdam - - * Jose Bayona, University of Bristol - - * Leila Mizrahi, ETH - - * Kirsty Bayliss, GEM - - * Francesco Serafini, University of Edinburgh - - * Marcus Hermann, University of Naples ‘Frederico II’ - - * Max Werner, University of Bristol - - * Danijel Schorlemmner, GFZ Potsdam - - * Philip Maechling, Southern California Earthquake Center - - - - - diff --git a/docs/intro/forecasting_experiments.rst b/docs/intro/forecasting_experiments.rst new file mode 100644 index 0000000..ac0817a --- /dev/null +++ b/docs/intro/forecasting_experiments.rst @@ -0,0 +1,5 @@ +Forecasting Experiments +======================= + + +TBI \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt index 9c8799a..012c6c9 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -28,6 +28,7 @@ sphinx sphinx-autoapi sphinx-gallery sphinx-rtd-theme +sphinx_copybutton tables tox vcrpy==4.3.1 diff --git a/setup.cfg b/setup.cfg index 3528ec5..657f79b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -76,6 +76,7 @@ dev = sphinx-autoapi sphinx-gallery sphinx-rtd-theme + sphinx_copybutton tables tox vcrpy==4.3.1 From 6e299a7669e0a0ce355c2896f546a68fcccf79ba Mon Sep 17 00:00:00 2001 From: pciturri Date: Wed, 25 Sep 2024 00:17:22 +0200 Subject: [PATCH 07/19] refac: Renamed examples folder to tutorials --- README.md | 45 +++++++++----- docs/index.rst | 36 ++++++------ docs/intro/forecasting_experiments.rst | 2 +- docs/intro/installation.rst | 58 +++++++++++++------ docs/{examples => tutorials}/case_a.rst | 40 ++++++------- docs/{examples => tutorials}/case_b.rst | 22 +++---- docs/{examples => tutorials}/case_c.rst | 14 ++--- docs/{examples => tutorials}/case_d.rst | 16 ++--- docs/{examples => tutorials}/case_e.rst | 30 +++++----- docs/{examples => tutorials}/case_f.rst | 22 +++---- docs/{examples => tutorials}/case_g.rst | 34 +++++------ docs/{examples => tutorials}/case_h.rst | 50 ++++++++-------- pyproject.toml | 1 + tests/artifacts/models/template/Dockerfile | 4 +- tests/integration/test_model_interface.py | 4 +- tests/qa/test_data.py | 4 +- tests/unit/test_readers.py | 2 +- {examples => tutorials}/case_a/best_model.dat | 0 {examples => tutorials}/case_a/case_a.py | 0 {examples => tutorials}/case_a/catalog.csep | 0 {examples => tutorials}/case_a/config.yml | 0 {examples => tutorials}/case_a/region.txt | 0 {examples => tutorials}/case_b/case_b.py | 0 {examples => tutorials}/case_b/catalog.json | 0 {examples => tutorials}/case_b/config.yml | 0 {examples => tutorials}/case_b/models.yml | 0 .../case_b/models/model_a.csv | 0 .../case_b/models/model_b.csv | 0 .../case_b/models/model_c.csv | 0 .../case_b/models/model_d.csv | 0 {examples => tutorials}/case_b/region.txt | 0 {examples => tutorials}/case_b/tests.yml | 0 {examples => tutorials}/case_c/case_c.py | 0 {examples => tutorials}/case_c/catalog.json | 0 {examples => tutorials}/case_c/config.yml | 0 {examples => tutorials}/case_c/models.yml | 0 .../case_c/models/model_a.csv | 0 .../case_c/models/model_b.csv | 0 .../case_c/models/model_c.csv | 0 .../case_c/models/model_d.csv | 0 {examples => tutorials}/case_c/region.txt | 0 {examples => tutorials}/case_c/tests.yml | 0 {examples => tutorials}/case_d/config.yml | 0 {examples => tutorials}/case_d/models.yml | 0 {examples => tutorials}/case_d/tests.yml | 0 {examples => tutorials}/case_e/case_e.py | 0 {examples => tutorials}/case_e/catalog.json | 0 {examples => tutorials}/case_e/config.yml | 0 {examples => tutorials}/case_e/models.yml | 0 ...gulia-wiemer.ALM.italy.10yr.2010-01-01.xml | 0 .../meletti.MPS04.italy.10yr.2010-01-01.xml | 0 ...har.TripleS-CPTI.italy.10yr.2010-01-01.xml | 0 {examples => tutorials}/case_e/tests.yml | 0 {examples => tutorials}/case_f/catalog.json | 0 {examples => tutorials}/case_f/config.yml | 0 .../forecasts/etas_2016-11-14_2016-11-15.csv | 0 .../forecasts/etas_2016-11-15_2016-11-16.csv | 0 .../forecasts/etas_2016-11-16_2016-11-17.csv | 0 .../forecasts/etas_2016-11-17_2016-11-18.csv | 0 .../forecasts/etas_2016-11-18_2016-11-19.csv | 0 .../forecasts/etas_2016-11-19_2016-11-20.csv | 0 .../forecasts/etas_2016-11-20_2016-11-21.csv | 0 {examples => tutorials}/case_f/models.yml | 0 {examples => tutorials}/case_f/tests.yml | 0 {examples => tutorials}/case_g/catalog.csv | 0 {examples => tutorials}/case_g/config.yml | 0 .../case_g/custom_plot_script.py | 0 {examples => tutorials}/case_g/models.yml | 0 .../case_g/pymock/Dockerfile | 0 .../case_g/pymock/README.md | 0 .../case_g/pymock/input/args.txt | 0 .../case_g/pymock/pymock/__init__.py | 0 .../case_g/pymock/pymock/libs.py | 0 .../case_g/pymock/pymock/main.py | 0 .../case_g/pymock/pyproject.toml | 0 .../case_g/pymock/requirements.txt | 0 {examples => tutorials}/case_g/pymock/run.py | 0 .../case_g/pymock/setup.cfg | 0 .../case_g/pymock/setup.py | 0 {examples => tutorials}/case_g/tests.yml | 0 {examples => tutorials}/case_h/catalog.csv | 0 {examples => tutorials}/case_h/config.yml | 0 .../case_h/custom_report.py | 0 {examples => tutorials}/case_h/models.yml | 0 {examples => tutorials}/case_h/tests.yml | 0 85 files changed, 211 insertions(+), 173 deletions(-) rename docs/{examples => tutorials}/case_a.rst (81%) rename docs/{examples => tutorials}/case_b.rst (78%) rename docs/{examples => tutorials}/case_c.rst (84%) rename docs/{examples => tutorials}/case_d.rst (84%) rename docs/{examples => tutorials}/case_e.rst (74%) rename docs/{examples => tutorials}/case_f.rst (82%) rename docs/{examples => tutorials}/case_g.rst (87%) rename docs/{examples => tutorials}/case_h.rst (77%) rename {examples => tutorials}/case_a/best_model.dat (100%) rename {examples => tutorials}/case_a/case_a.py (100%) rename {examples => tutorials}/case_a/catalog.csep (100%) rename {examples => tutorials}/case_a/config.yml (100%) rename {examples => tutorials}/case_a/region.txt (100%) rename {examples => tutorials}/case_b/case_b.py (100%) rename {examples => tutorials}/case_b/catalog.json (100%) rename {examples => tutorials}/case_b/config.yml (100%) rename {examples => tutorials}/case_b/models.yml (100%) rename {examples => tutorials}/case_b/models/model_a.csv (100%) rename {examples => tutorials}/case_b/models/model_b.csv (100%) rename {examples => tutorials}/case_b/models/model_c.csv (100%) rename {examples => tutorials}/case_b/models/model_d.csv (100%) rename {examples => tutorials}/case_b/region.txt (100%) rename {examples => tutorials}/case_b/tests.yml (100%) rename {examples => tutorials}/case_c/case_c.py (100%) rename {examples => tutorials}/case_c/catalog.json (100%) rename {examples => tutorials}/case_c/config.yml (100%) rename {examples => tutorials}/case_c/models.yml (100%) rename {examples => tutorials}/case_c/models/model_a.csv (100%) rename {examples => tutorials}/case_c/models/model_b.csv (100%) rename {examples => tutorials}/case_c/models/model_c.csv (100%) rename {examples => tutorials}/case_c/models/model_d.csv (100%) rename {examples => tutorials}/case_c/region.txt (100%) rename {examples => tutorials}/case_c/tests.yml (100%) rename {examples => tutorials}/case_d/config.yml (100%) rename {examples => tutorials}/case_d/models.yml (100%) rename {examples => tutorials}/case_d/tests.yml (100%) rename {examples => tutorials}/case_e/case_e.py (100%) rename {examples => tutorials}/case_e/catalog.json (100%) rename {examples => tutorials}/case_e/config.yml (100%) rename {examples => tutorials}/case_e/models.yml (100%) rename {examples => tutorials}/case_e/models/gulia-wiemer.ALM.italy.10yr.2010-01-01.xml (100%) rename {examples => tutorials}/case_e/models/meletti.MPS04.italy.10yr.2010-01-01.xml (100%) rename {examples => tutorials}/case_e/models/zechar.TripleS-CPTI.italy.10yr.2010-01-01.xml (100%) rename {examples => tutorials}/case_e/tests.yml (100%) rename {examples => tutorials}/case_f/catalog.json (100%) rename {examples => tutorials}/case_f/config.yml (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-14_2016-11-15.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-15_2016-11-16.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-16_2016-11-17.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-17_2016-11-18.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-18_2016-11-19.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-19_2016-11-20.csv (100%) rename {examples => tutorials}/case_f/etas/forecasts/etas_2016-11-20_2016-11-21.csv (100%) rename {examples => tutorials}/case_f/models.yml (100%) rename {examples => tutorials}/case_f/tests.yml (100%) rename {examples => tutorials}/case_g/catalog.csv (100%) rename {examples => tutorials}/case_g/config.yml (100%) rename {examples => tutorials}/case_g/custom_plot_script.py (100%) rename {examples => tutorials}/case_g/models.yml (100%) rename {examples => tutorials}/case_g/pymock/Dockerfile (100%) rename {examples => tutorials}/case_g/pymock/README.md (100%) rename {examples => tutorials}/case_g/pymock/input/args.txt (100%) rename {examples => tutorials}/case_g/pymock/pymock/__init__.py (100%) rename {examples => tutorials}/case_g/pymock/pymock/libs.py (100%) rename {examples => tutorials}/case_g/pymock/pymock/main.py (100%) rename {examples => tutorials}/case_g/pymock/pyproject.toml (100%) rename {examples => tutorials}/case_g/pymock/requirements.txt (100%) rename {examples => tutorials}/case_g/pymock/run.py (100%) rename {examples => tutorials}/case_g/pymock/setup.cfg (100%) rename {examples => tutorials}/case_g/pymock/setup.py (100%) rename {examples => tutorials}/case_g/tests.yml (100%) rename {examples => tutorials}/case_h/catalog.csv (100%) rename {examples => tutorials}/case_h/config.yml (100%) rename {examples => tutorials}/case_h/custom_report.py (100%) rename {examples => tutorials}/case_h/models.yml (100%) rename {examples => tutorials}/case_h/tests.yml (100%) diff --git a/README.md b/README.md index bb7e30e..a9bdf35 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,11 @@ DOI

-* Set up a testing **experiment** for your earthquake forecasts using authoritative data sources and benchmarks. +* Set up a testing **experiment** for your earthquake forecasts using authoritative data sources + and benchmarks. * **Encapsulate** the complete experiment's definition and rules in a couple of lines. -* **Reproduce**, **reuse**, and **share** forecasting experiments from you, other researchers and institutions. +* **Reproduce**, **reuse**, and **share** forecasting experiments from you, other researchers + and institutions. # Table of Contents @@ -34,12 +36,14 @@ * [Contributing](#contributing) * [License](#license) - # Installing floatCSEP -The core of `floatCSEP` is built around the `pyCSEP` package (https://github.com/sceccode/pycsep), which itself contains the core dependencies. +The core of `floatCSEP` is built around the `pyCSEP` +package (https://github.com/sceccode/pycsep), which itself contains the core dependencies. -The simplest way to install `floatCSEP`, is by creating a `conda` environment (https://conda.io - checkout Anaconda or Miniconda) and install `pyCSEP` from `conda-forge` +The simplest way to install `floatCSEP`, is by creating a `conda` +environment (https://conda.io - checkout Anaconda or Miniconda) and install `pyCSEP` +from `conda-forge` ``` conda env create -n $NAME @@ -48,21 +52,29 @@ conda install -c conda-forge pycsep ``` Clone and install the floatCSEP source code using `pip` + ``` git clone https://github.com/cseptesting/floatcsep cd floatcsep pip install . ``` -Please read the [Installation](https://floatcsep.readthedocs.io/en/latest/intro/installation.html) documentation for detailed instructions and additional installation methods. +Please read +the [Installation](https://floatcsep.readthedocs.io/en/latest/intro/installation.html) +documentation for detailed instructions and additional installation methods. # Run an Experiment -Using the command terminal, navigate to an example experiment in `floatcsep/examples/` and type +Using the command terminal, navigate to an example experiment in ``floatcsep/tutorials/`` and +type + ``` floatcsep run config.yml ``` -A runtime directory will be created in a `results` folder. The experiment results can be visualized in `results/report.md`. **Check out the experiment, models and tests definition in the examples**! + +A runtime directory will be created in a `results` folder. The experiment results can be +visualized in `results/report.md`. **Check out the experiment, models and tests definition in +the tutorials**! # Important Links @@ -71,7 +83,6 @@ A runtime directory will be created in a `results` folder. The experiment result * `pyCSEP` [Github](https://github.com/sceccode/pycsep) * `pyCSEP` [Documentation](https://docs.cseptesting.org/) - # Roadmap and Known Issues * Add report customization @@ -80,21 +91,27 @@ A runtime directory will be created in a `results` folder. The experiment result * Implement spatial database and HDF5 experiment storage feature * Set up task paralellization - # Contributing -We encourage all types of contributions, from reporting bugs, suggesting enhancements, adding new features and more. Please refer to the [Contribution Guidelines](https://github.com/cseptesting/floatcsep/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/cseptesting/floatcsep/blob/main/CODE_OF_CONDUCT.md) for more information +We encourage all types of contributions, from reporting bugs, suggesting enhancements, adding +new features and more. Please refer to +the [Contribution Guidelines](https://github.com/cseptesting/floatcsep/blob/main/CONTRIBUTING.md) +and the [Code of Conduct](https://github.com/cseptesting/floatcsep/blob/main/CODE_OF_CONDUCT.md) +for more information # License -The `floatCSEP` (as well as `pyCSEP`) software is distributed under the BSD 3-Clause open-source license. Please see the [license file](https://github.com/cseptesting/floatcsep/blob/main/LICENSE) for more information. +The `floatCSEP` (as well as `pyCSEP`) software is distributed under the BSD 3-Clause open-source +license. Please see +the [license file](https://github.com/cseptesting/floatcsep/blob/main/LICENSE) for more +information. ## Support
-| | | -|:---|:---| +| | | +|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
This research was supported by the Statewide California Earthquake Center. SCEC is funded by NSF Cooperative Agreement EAR-2225216 and USGS Cooperative Agreement G24AC00072-00.
|
The work in this repository has received funding from the European Union’s Horizon research and innovation programme under grant agreements No.s 101058518 and 821115 of the projects GeoInquire and RISE.
|
diff --git a/docs/index.rst b/docs/index.rst index 0982c6b..0410bc1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -46,7 +46,7 @@ floatCSEP: Floating Experiments :height: 48px .. |tutorials| image:: https://img.icons8.com/nolan/64/checklist.png - :target: examples/case_a.html + :target: tutorials/case_a.html :height: 48px @@ -56,14 +56,14 @@ Quickstart +--------------------------------------------------+-------------------------------------+ | |start| **Get Started** | |tutorials| **Tutorials** | | | | -| |learn1| **Forecasting Concepts** | - :ref:`example_a` | -| | - :ref:`example_b` | -| |learn2| **Testing Theory** | - :ref:`example_c` | -| | - :ref:`example_d` | -| |experiment| **Floating Experiments** | - :ref:`example_e` | -| | - :ref:`example_f` | -| |api| **API Reference** | - :ref:`example_g` | -| | - :ref:`example_h` | +| |learn1| **Forecasting Concepts** | - :ref:`case_a` | +| | - :ref:`case_b` | +| |learn2| **Testing Theory** | - :ref:`case_c` | +| | - :ref:`case_d` | +| |experiment| **Floating Experiments** | - :ref:`case_e` | +| | - :ref:`case_f` | +| |api| **API Reference** | - :ref:`case_g` | +| | - :ref:`case_h` | +--------------------------------------------------+-------------------------------------+ What is floatCSEP @@ -84,7 +84,7 @@ Goals Running ------- -Start using **floatCSEP** by `installing `_ the latest version and running the ``examples`` with simply: +Start using **floatCSEP** by `installing `_ the latest version and running the ``tutorials`` with simply: .. code-block:: @@ -146,14 +146,14 @@ Collaborators :maxdepth: 1 :caption: Tutorial Experiments - examples/case_a.rst - examples/case_b.rst - examples/case_c.rst - examples/case_d.rst - examples/case_e.rst - examples/case_f.rst - examples/case_g.rst - examples/case_h.rst + tutorials/case_a.rst + tutorials/case_b.rst + tutorials/case_c.rst + tutorials/case_d.rst + tutorials/case_e.rst + tutorials/case_f.rst + tutorials/case_g.rst + tutorials/case_h.rst .. toctree:: :hidden: diff --git a/docs/intro/forecasting_experiments.rst b/docs/intro/forecasting_experiments.rst index ac0817a..1b9e6ac 100644 --- a/docs/intro/forecasting_experiments.rst +++ b/docs/intro/forecasting_experiments.rst @@ -2,4 +2,4 @@ Forecasting Experiments ======================= -TBI \ No newline at end of file +TBW \ No newline at end of file diff --git a/docs/intro/installation.rst b/docs/intro/installation.rst index 4cdbeca..5d53517 100644 --- a/docs/intro/installation.rst +++ b/docs/intro/installation.rst @@ -12,15 +12,12 @@ Installing the latest version Using ``conda`` ~~~~~~~~~~~~~~~ -The core of `floatCSEP` is built around the `pyCSEP` package (https://github.com/sceccode/pycsep), which itself contains the core dependencies. +To install **floatCSEP**, first a ``conda`` manager should be installed (https://conda.io). Checkout `Anaconda`, `Miniconda` or `Miniforge` (recommended). Once installed, create an environment with: -The simplest way to install `floatCSEP`, is by creating a `conda` environment (https://conda.io - checkout Anaconda or Miniconda) and install `pyCSEP` from `conda-forge` + .. code-block:: sh - .. code-block:: console - - $ conda env create -n $NAME - $ conda activate $NAME - $ conda install -c conda-forge pycsep + $ conda env create -n csep_env + $ conda activate csep_env Then, clone and install the floatCSEP source code using ``pip`` @@ -30,27 +27,50 @@ Then, clone and install the floatCSEP source code using ``pip`` cd floatcsep pip install . -Using ``apt`` and ``pip`` -~~~~~~~~~~~~~~~~~~~~~~~~~ -To install from ``pip``, we require to install the binary dependencies of ``pyCSEP`` (see `Installing pyCSEP `_} +Using ``pip`` +~~~~~~~~~~~~~ -Then, install the ``pycsep`` latest version +To install using the ``pip`` manager, we require to install the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}. The **floatcsep** latest version then can be installed as: .. code-block:: - git clone https://github.com/SCECcode/pycsep - cd pycsep - python -m virtualenv venv - source venv/bin/activate - pip install -e .[all] + cd .. + git clone https://github.com/cseptesting/floatcsep + cd floatcsep + pip install . + +Installing the stable version +----------------------------- + + +Using ``conda`` +~~~~~~~~~~~~~~~ + +To install **floatCSEP**, first a ``conda`` manager should be installed (https://conda.io). Checkout `Anaconda`, `Miniconda` or `Miniforge` (recommended). Once installed, create an environment with: -and the ``floatcsep`` latest version + .. code-block:: sh + + $ conda env create -n csep_env + $ conda activate csep_env + +Then, clone and install the floatCSEP source code using ``pip`` + + .. code-block:: console + + git clone https://github.com/cseptesting/floatcsep + cd floatcsep + pip install . + + +Using ``pip`` +~~~~~~~~~~~~~ + +To install using the ``pip`` manager, we require to install the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}. The **floatcsep** latest version can then be installed as: .. code-block:: cd .. git clone https://github.com/cseptesting/floatcsep cd floatcsep - pip install .[all] - + pip install . \ No newline at end of file diff --git a/docs/examples/case_a.rst b/docs/tutorials/case_a.rst similarity index 81% rename from docs/examples/case_a.rst rename to docs/tutorials/case_a.rst index 4fe7f9a..45dd200 100644 --- a/docs/examples/case_a.rst +++ b/docs/tutorials/case_a.rst @@ -1,4 +1,4 @@ -.. _example_a: +.. _case_a: A - Testing a Simple Model ========================== @@ -9,7 +9,7 @@ The following example shows the definition of a testing experiment of a single * .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_a`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_a`` and type: .. code-block:: console @@ -25,7 +25,7 @@ The following example shows the definition of a testing experiment of a single * Experiment Components --------------------- -The source code can be found in the ``examples/case_a`` folder or in `GitHub `_. The directory structure of the experiment is: +The source code can be found in the ``tutorials/case_a`` folder or in `GitHub `_. The directory structure of the experiment is: :: @@ -38,18 +38,18 @@ The source code can be found in the ``examples/case_a`` folder or in `GitHub `_. The input structure of the experiment is: +The source code can be found in the ``tutorials/case_b`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -53,14 +53,14 @@ Configuration In this example, the time, region and catalog specifications are written in the ``config.yml`` file. -.. literalinclude:: ../../examples/case_b/config.yml - :caption: examples/case_b/config.yml +.. literalinclude:: ../../tutorials/case_b/config.yml + :caption: tutorials/case_b/config.yml :language: yaml :lines: 3-15 whereas the models' and tests' configurations are referred to external files for better readability -.. literalinclude:: ../../examples/case_b/config.yml +.. literalinclude:: ../../tutorials/case_b/config.yml :language: yaml :lines: 17-18 @@ -69,17 +69,17 @@ Models ~~~~~~ The model configuration is now set in the ``models.yml`` file, where a list of model names specify their file paths. - .. literalinclude:: ../../examples/case_b/models.yml - :caption: examples/case_b/models.yml + .. literalinclude:: ../../tutorials/case_b/models.yml + :caption: tutorials/case_b/models.yml :language: yaml Evaluations ~~~~~~~~~~~ The evaluations are defined in the ``tests.yml`` file as a list of evaluation names, with their functions and plots (see :doc:`pycsep:concepts/evaluations`). In this example, we use the N-, M-, S- and CL-consistency tests, along with the comparison T-test. - .. literalinclude:: ../../examples/case_b/tests.yml + .. literalinclude:: ../../tutorials/case_b/tests.yml :language: yaml - :caption: examples/case_b/tests.yml + :caption: tutorials/case_b/tests.yml .. note:: Plotting keyword arguments can be set in the ``plot_kwargs`` option - see :func:`~csep.utils.plots.plot_poisson_consistency_test` and :func:`~csep.utils.plots.plot_comparison_test` -. @@ -91,7 +91,7 @@ Running the experiment ---------------------- -The experiment can be run by simply navigating to the ``examples/case_b`` folder in the terminal an type. +The experiment can be run by simply navigating to the ``tutorials/case_b`` folder in the terminal an type. .. code-block:: console diff --git a/docs/examples/case_c.rst b/docs/tutorials/case_c.rst similarity index 84% rename from docs/examples/case_c.rst rename to docs/tutorials/case_c.rst index 2236cf3..d6b74d2 100644 --- a/docs/examples/case_c.rst +++ b/docs/tutorials/case_c.rst @@ -1,4 +1,4 @@ -.. _example_c: +.. _case_c: C - Multiple Time Windows ========================= @@ -9,7 +9,7 @@ The following example shows an experiment with **multiple time windows**. .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_c`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_c`` and type: .. code-block:: console @@ -25,7 +25,7 @@ The following example shows an experiment with **multiple time windows**. Experiment Components --------------------- -The source code can be found in the ``examples/case_c`` folder or in `GitHub `_. The input structure of the experiment is: +The source code can be found in the ``tutorials/case_c`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -49,8 +49,8 @@ Time The time configuration now sets a sequence of time intervals between the start and end dates. - .. literalinclude:: ../../examples/case_c/config.yml - :caption: examples/case_c/config.yml + .. literalinclude:: ../../tutorials/case_c/config.yml + :caption: tutorials/case_c/config.yml :language: yaml :lines: 3-7 @@ -66,9 +66,9 @@ Evaluations ~~~~~~~~~~~ The experiment's evaluations are defined in ``tests.yml``, which can now include temporal evaluations (see :func:`~floatcsep.utils.helpers.sequential_likelihood`, :func:`~floatcsep.utils.helpers.sequential_information_gain`, :func:`~floatcsep.utils.helpers.plot_sequential_likelihood`). - .. literalinclude:: ../../examples/case_c/tests.yml + .. literalinclude:: ../../tutorials/case_c/tests.yml :language: yaml - :caption: examples/case_c/tests.yml + :caption: tutorials/case_c/tests.yml .. note:: diff --git a/docs/examples/case_d.rst b/docs/tutorials/case_d.rst similarity index 84% rename from docs/examples/case_d.rst rename to docs/tutorials/case_d.rst index fbeb505..3fdc51e 100644 --- a/docs/examples/case_d.rst +++ b/docs/tutorials/case_d.rst @@ -1,4 +1,4 @@ -.. _example_d: +.. _case_d: D - Catalog and Model Queries ============================= @@ -11,7 +11,7 @@ The following example shows an experiment whose forecasts are **retrieved from a .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_d`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_d`` and type: .. code-block:: console @@ -26,7 +26,7 @@ The following example shows an experiment whose forecasts are **retrieved from a Experiment Components --------------------- -The source code can be found in the ``examples/case_d`` folder or in `GitHub `_. The **initial** input structure of the experiment is: +The source code can be found in the ``tutorials/case_d`` folder or in `GitHub `_. The **initial** input structure of the experiment is: :: @@ -65,8 +65,8 @@ Catalog The ``catalog`` inset from ``config.yml`` now makes reference to a catalog query function, in this case :func:`~pycsep.query_gcmt`. - .. literalinclude:: ../../examples/case_d/config.yml - :caption: examples/case_d/config.yml + .. literalinclude:: ../../tutorials/case_d/config.yml + :caption: tutorials/case_d/config.yml :language: yaml :lines: 14-14 @@ -80,8 +80,8 @@ Models ~~~~~~ The model configuration is set in ``models.yml``. - .. literalinclude:: ../../examples/case_d/models.yml - :caption: examples/case_d/models.yml + .. literalinclude:: ../../tutorials/case_d/models.yml + :caption: tutorials/case_d/models.yml :language: yaml * The option ``zenodo_id`` makes reference to the zenodo **record id**. The model ``team`` is found in https://zenodo.org/record/6289795, whereas the model ``wheel`` in https://zenodo.org/record/6255575. @@ -104,7 +104,7 @@ Models Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_d`` folder in the terminal and typing. + The experiment can be run by simply navigating to the ``tutorials/case_d`` folder in the terminal and typing. .. code-block:: console diff --git a/docs/examples/case_e.rst b/docs/tutorials/case_e.rst similarity index 74% rename from docs/examples/case_e.rst rename to docs/tutorials/case_e.rst index 208246a..061e6e0 100644 --- a/docs/examples/case_e.rst +++ b/docs/tutorials/case_e.rst @@ -1,15 +1,15 @@ -.. _example_e: +.. _case_e: E - A Time-Independent Experiment ================================= -This example shows how to run a realistic testing experiment (based on https://doi.org/10.4401/ag-4844) while summarizing the concepts from the previous examples. +This example shows how to run a realistic testing experiment (based on https://doi.org/10.4401/ag-4844) while summarizing the concepts from the previous tutorials. .. currentmodule:: floatcsep .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_e`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_e`` and type: .. code-block:: console @@ -25,7 +25,7 @@ This example shows how to run a realistic testing experiment (based on https://d Experiment Components --------------------- -The source code can be found in the ``examples/case_e`` folder or in `GitHub `_. The input structure of the experiment is: +The source code can be found in the ``tutorials/case_e`` folder or in `GitHub `_. The input structure of the experiment is: :: @@ -51,8 +51,8 @@ Time The time configuration is manifested in the ``time-config`` inset. - .. literalinclude:: ../../examples/case_e/config.yml - :caption: examples/case_e/config.yml + .. literalinclude:: ../../tutorials/case_e/config.yml + :caption: tutorials/case_e/config.yml :language: yaml :lines: 3-7 @@ -61,8 +61,8 @@ Region The testing region is the official Italy CSEP Region obtained from :obj:`csep.core.regions.italy_csep_region`. - .. literalinclude:: ../../examples/case_e/config.yml - :caption: examples/case_e/config.yml + .. literalinclude:: ../../tutorials/case_e/config.yml + :caption: tutorials/case_e/config.yml :language: yaml :lines: 9-15 @@ -72,8 +72,8 @@ Catalog The catalog is obtained from an authoritative source, namely the Bollettino Sismico Italiano (http://terremoti.ingv.it/en/bsi ), using the function :func:`csep.query_bsi` - .. literalinclude:: ../../examples/case_e/config.yml - :caption: examples/case_e/config.yml + .. literalinclude:: ../../tutorials/case_e/config.yml + :caption: tutorials/case_e/config.yml :language: yaml :lines: 17-17 @@ -81,8 +81,8 @@ Models ~~~~~~ The models are set in ``models.yml``. For simplicity, there are only three of the nineteen models originally submitted to the Italy Experiment. - .. literalinclude:: ../../examples/case_e/models.yml - :caption: examples/case_e/models.yml + .. literalinclude:: ../../tutorials/case_e/models.yml + :caption: tutorials/case_e/models.yml :language: yaml The ``.xml`` format is automatically detected and parsed by ``floatcsep`` readers. @@ -100,17 +100,17 @@ Post-Process Additional options for post-processing can set using the ``postprocess`` option. Here, we customize the forecasts plotting with: - .. literalinclude:: ../../examples/case_e/config.yml + .. literalinclude:: ../../tutorials/case_e/config.yml :language: yaml :lines: 21-34 - The forecasts are plotted and stored in ``examples/case_e/results/{timewindow}/forecasts/``. See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plotting options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top of those plots. + The forecasts are plotted and stored in ``tutorials/case_e/results/{timewindow}/forecasts/``. See :func:`~csep.utils.plots.plot_spatial_dataset` for forecast plotting options and :func:`~csep.utils.plots.plot_catalog` for the catalog placed on top of those plots. Running the experiment ---------------------- - The experiment can be run by navigating to the ``examples/case_e`` folder in the terminal and typing. + The experiment can be run by navigating to the ``tutorials/case_e`` folder in the terminal and typing. .. code-block:: console diff --git a/docs/examples/case_f.rst b/docs/tutorials/case_f.rst similarity index 82% rename from docs/examples/case_f.rst rename to docs/tutorials/case_f.rst index c31dc24..26438a3 100644 --- a/docs/examples/case_f.rst +++ b/docs/tutorials/case_f.rst @@ -1,4 +1,4 @@ -.. _example_f: +.. _case_f: F - Testing Catalog-Based Forecasts =================================== @@ -9,7 +9,7 @@ This example shows how set up an experiment with a **time-dependent** model, who .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_f`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_f`` and type: .. code-block:: console @@ -25,7 +25,7 @@ Experiment Components --------------------- -The source files can be found in the ``examples/case_e`` folder or in `GitHub `_. The experiment structure is as follows: +The source files can be found in the ``tutorials/case_e`` folder or in `GitHub `_. The experiment structure is as follows: :: @@ -43,13 +43,13 @@ The source files can be found in the ``examples/case_e`` folder or in `GitHub < * The model to be evaluated (``etas``) is a collection of daily forecasts from ``2016-11-14`` until ``2016-11-21``. .. important:: - The forecasts must be located in a folder ``forecasts`` inside the model folder. This is meant for consistency with models based on source codes (see subsequent examples). + The forecasts must be located in a folder ``forecasts`` inside the model folder. This is meant for consistency with models based on source codes (see subsequent tutorials). Model ----- -The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. In this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (`doi:10.1785/0220200231 `_), with which the experiment has no interface. This means that we use **only the forecast files** and no source code. We leave the handling of a model source code for subsequent examples. +The time-dependency of a model is manifested here by the provision of different forecasts, i.e., statistical descriptions of seismicity, for different time-windows. In this example, the forecasts were created from an external model https://github.com/lmizrahi/etas (`doi:10.1785/0220200231 `_), with which the experiment has no interface. This means that we use **only the forecast files** and no source code. We leave the handling of a model source code for subsequent tutorials. @@ -62,8 +62,8 @@ Time The configuration is analogous to time-independent models with multiple time-windows (e.g., case C) with the exception that a ``horizon`` could be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td``. - .. literalinclude:: ../../examples/case_f/config.yml - :caption: examples/case_f/config.yml + .. literalinclude:: ../../tutorials/case_f/config.yml + :caption: tutorials/case_f/config.yml :language: yaml :lines: 3-7 @@ -84,8 +84,8 @@ Models Some additional arguments should be passed to a **time-dependent** model, such as its class ('td' for time-dependent) and the number of simulations. - .. literalinclude:: ../../examples/case_f/models.yml - :caption: examples/case_f/config.yml + .. literalinclude:: ../../tutorials/case_f/models.yml + :caption: tutorials/case_f/config.yml :language: yaml :lines: 1-4 @@ -101,7 +101,7 @@ Tests With time-dependent models, now catalog evaluations found in :obj:`csep.core.catalog_evaluations` can be used. - .. literalinclude:: ../../examples/case_f/tests.yml + .. literalinclude:: ../../tutorials/case_f/tests.yml :language: yaml .. note:: @@ -111,7 +111,7 @@ Tests Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_h`` folder in the terminal and typing. + The experiment can be run by simply navigating to the ``tutorials/case_h`` folder in the terminal and typing. .. code-block:: console diff --git a/docs/examples/case_g.rst b/docs/tutorials/case_g.rst similarity index 87% rename from docs/examples/case_g.rst rename to docs/tutorials/case_g.rst index 9529e40..1edfaa7 100644 --- a/docs/examples/case_g.rst +++ b/docs/tutorials/case_g.rst @@ -1,4 +1,4 @@ -.. _example_g: +.. _case_g: G - Testing a Time-Dependent Model ================================== @@ -7,7 +7,7 @@ Here, we set up a time-dependent model from its **source code** for an experimen .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_g`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_g`` and type: .. code-block:: console @@ -70,8 +70,8 @@ The experiment's complexity increases from time-independent to dependent mostly 1. The **input data** is, at the very least, a catalog filtered until the forecast beginning. The catalog will be automatically allocated by ``floatcsep`` prior to each model's run (e.g., a single forecast run) in the `{model}/input` folder. It is stored in the ``csep.ascii`` format for simplicity's sake (see :doc:`pycsep:concepts/catalogs`). - .. literalinclude:: ../../examples/case_g/catalog.csv - :caption: examples/case_g/catalog.csv + .. literalinclude:: ../../tutorials/case_g/catalog.csv + :caption: tutorials/case_g/catalog.csv :lines: 1-2 2. The **input arguments** controls how the model's source code works. The minimum arguments to run a model are the forecast ``start_date`` and ``end_date``, which will be modified dynamically during an experiment with multiple time-windows. The experiment system will access `{model}/input/args.txt` and change the values of ``start_date = {datetime}`` and ``end_date = {datetime}`` before the model is run. Additional arguments can be set by convenience, such as (not limited to) ``catalog`` (the input catalog name), ``n_sims`` (number of synthetic catalogs) and random ``seed`` for reproducibility. @@ -116,8 +116,8 @@ Time The configuration is identical to time-independent models, with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` - .. literalinclude:: ../../examples/case_g/config.yml - :caption: examples/case_g/config.yml + .. literalinclude:: ../../tutorials/case_g/config.yml + :caption: tutorials/case_g/config.yml :language: yaml :lines: 3-7 @@ -131,8 +131,8 @@ Models Additional arguments should be passed to time-independent models. - .. literalinclude:: ../../examples/case_g/models.yml - :caption: examples/case_g/models.yml + .. literalinclude:: ../../tutorials/case_g/models.yml + :caption: tutorials/case_g/models.yml :language: yaml :lines: 1-7 @@ -146,7 +146,7 @@ Models 4. The ``build`` option defines the style of container within which the model will be placed. Currently in **floatCSEP**, only the python module ``venv``, the package manager ``conda`` and the containerization manager ``Docker`` are currently supported. .. important:: - For these examples, we use ``venv`` sub-environments, but we recommend ``Docker`` to set up real experiments. + For these tutorials, we use ``venv`` sub-environments, but we recommend ``Docker`` to set up real experiments. Tests @@ -155,8 +155,8 @@ Tests With time-dependent models, now catalog evaluations found in :obj:`csep.core.catalog_evaluations` can be used. - .. literalinclude:: ../../examples/case_g/tests.yml - :caption: examples/case_g/tests.yml + .. literalinclude:: ../../tutorials/case_g/tests.yml + :caption: tutorials/case_g/tests.yml :language: yaml .. note:: @@ -168,8 +168,8 @@ Custom Post-Process Additional to the default :func:`~floatcsep.postprocess.plot_handler.plot_results`, :func:`~floatcsep.postprocess.plot_handler.plot_catalogs`, :func:`~floatcsep.postprocess.plot_handler.plot_forecasts` functions, a custom plotting function(s) can be set within the ``postprocess`` configuration - .. literalinclude:: ../../examples/case_g/config.yml - :caption: examples/case_g/config.yml + .. literalinclude:: ../../tutorials/case_g/config.yml + :caption: tutorials/case_g/config.yml :language: yaml :lines: 22-23 @@ -181,20 +181,20 @@ Custom Post-Process The requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as argument - .. literalinclude:: ../../examples/case_g/custom_plot_script.py - :caption: examples/case_g/custom_plot_script.py + .. literalinclude:: ../../tutorials/case_g/custom_plot_script.py + :caption: tutorials/case_g/custom_plot_script.py :language: python :lines: 6-13 - In this way, the plot function can use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_g/custom_plot_script.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment data in runtime. + In this way, the plot function can use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``tutorials/case_g/custom_plot_script.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment data in runtime. Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_g`` folder in the terminal and typing. + The experiment can be run by simply navigating to the ``tutorials/case_g`` folder in the terminal and typing. .. code-block:: console diff --git a/docs/examples/case_h.rst b/docs/tutorials/case_h.rst similarity index 77% rename from docs/examples/case_h.rst rename to docs/tutorials/case_h.rst index 6f3592e..c9e6637 100644 --- a/docs/examples/case_h.rst +++ b/docs/tutorials/case_h.rst @@ -1,4 +1,4 @@ -.. _example_h: +.. _case_h: H - A time-dependent experiment =============================== @@ -7,7 +7,7 @@ Here, we run an experiment that access, containerize and execute multiple **time .. admonition:: **TL; DR** - In a terminal, navigate to ``floatcsep/examples/case_h`` and type: + In a terminal, navigate to ``floatcsep/tutorials/case_h`` and type: .. code-block:: console @@ -59,22 +59,22 @@ Configuration Models ~~~~~~ -As in :ref:`Tutorial G`, each **Model** requires to build and execute a source code to generate forecasts. The instructions for each model are located within ``models.yml``, which we further explain here: +As in :ref:`Tutorial G`, each **Model** requires to build and execute a source code to generate forecasts. The instructions for each model are located within ``models.yml``, which we further explain here: .. note:: The ``models.yml`` will define how to interface **floatCSEP** to each Model, implying that a Model should be developed, or adapted to ensure the interface requirements specified below. 1. The repository URL of each model and their specific versions (e.g., commit hash, tag, release) are specified as: - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 1-3, 11-13, 21-23 2. A ``path`` needs to be indicated for each model, to both download the repository contents therein and from where the source code will be executed. - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 1-4 :emphasize-lines: 4 @@ -85,8 +85,8 @@ As in :ref:`Tutorial G`, each **Model** requires to build and execute 2. There is some flexibility to interface **floatCSEP** with a model. For instance, a different `filepath` can be set for the argument file: - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 5 :lineno-match: @@ -116,18 +116,18 @@ As in :ref:`Tutorial G`, each **Model** requires to build and execute 4. The ``func`` entry indicates how the models are invoked from a shell terminal. - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 1,6,11,15,21,25 .. important:: - Please refer to :ref:`Tutorial G` for example of how to set up ``func`` for the model and interface it to **floatCSEP**. + Please refer to :ref:`Tutorial G` for example of how to set up ``func`` for the model and interface it to **floatCSEP**. 5. A prefix for the resulting forecast filepaths can be specified beforehand for each model. Without specifying this, the default is ``{model_name}`` (e.g., `etas`, `Poisson Mock`, `Negbinom Mock`). - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 21, 26 @@ -141,8 +141,8 @@ As in :ref:`Tutorial G`, each **Model** requires to build and execute 6. Additional function arguments can be passed to the model with the entry ``func_kwargs``. We perhaps noted that both Poisson Mock and Negbinom Mock use the same source code. With ``func_kwargs`` a different subclass can be defined for the same source code (in this case, a Negative-Binomial number distribution instead of Poisson). - .. literalinclude:: ../../examples/case_h/models.yml - :caption: examples/case_h/models.yml + .. literalinclude:: ../../tutorials/case_h/models.yml + :caption: tutorials/case_h/models.yml :language: yaml :lines: 11,17-20,21,27-31 @@ -152,8 +152,8 @@ Time The configuration is identical to time-independent models, with the exception that now a ``horizon`` can be defined instead of ``intervals``, which is the forecast time-window length. The experiment's class should now be explicited as ``exp_class: td`` - .. literalinclude:: ../../examples/case_h/config.yml - :caption: examples/case_h/config.yml + .. literalinclude:: ../../tutorials/case_h/config.yml + :caption: tutorials/case_h/config.yml :language: yaml :lines: 3-7 @@ -169,8 +169,8 @@ Tests With time-dependent models, now catalog evaluations found in :obj:`csep.core.catalog_evaluations` can be used. - .. literalinclude:: ../../examples/case_h/tests.yml - :caption: examples/case_h/tests.yml + .. literalinclude:: ../../tutorials/case_h/tests.yml + :caption: tutorials/case_h/tests.yml :language: yaml .. note:: @@ -182,8 +182,8 @@ Custom Post-Process A custom reporting function can be set within the ``postprocess`` configuration to replace the :func:`~floatcsep.postprocess.reporting.generate_report`: - .. literalinclude:: ../../examples/case_h/config.yml - :caption: examples/case_h/config.yml + .. literalinclude:: ../../tutorials/case_h/config.yml + :caption: tutorials/case_h/config.yml :language: yaml :lines: 22-23 @@ -195,17 +195,17 @@ Custom Post-Process The requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as argument - .. literalinclude:: ../../examples/case_h/custom_report.py + .. literalinclude:: ../../tutorials/case_h/custom_report.py :language: yaml :lines: 5-11 - In this way, the report function use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``examples/case_h/custom_report.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment artifacts. + In this way, the report function use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. The script ``tutorials/case_h/custom_report.py`` can also be viewed directly on `GitHub `_, where it is exemplified how to access the experiment artifacts. Running the experiment ---------------------- - The experiment can be run by simply navigating to the ``examples/case_h`` folder in the terminal and typing. + The experiment can be run by simply navigating to the ``tutorials/case_h`` folder in the terminal and typing. .. code-block:: console diff --git a/pyproject.toml b/pyproject.toml index ef57c31..1c9d0f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ build-backend = "setuptools.build_meta" [tool.pytest.ini_options] addopts = "--cov=floatcsep" +norecursedirs = ["tutorials", "tests/artifacts"] testpaths = [ "tests", ] diff --git a/tests/artifacts/models/template/Dockerfile b/tests/artifacts/models/template/Dockerfile index dd5f778..b20e588 100644 --- a/tests/artifacts/models/template/Dockerfile +++ b/tests/artifacts/models/template/Dockerfile @@ -40,7 +40,7 @@ WORKDIR $MODEL_PATH COPY --chown=$USER_UID:$USER_GID {relpaths_host} $MODEL_PATH ## Ideally, the folder/files to be copied should be explicited -# COPY --chown=$USER_UID:$USER_GID source examples tests docs parameters setup $MODEL_PATH +# COPY --chown=$USER_UID:$USER_GID source tutorials tests docs parameters setup $MODEL_PATH # ______________________________ # 4- Build the model source code @@ -49,7 +49,7 @@ COPY --chown=$USER_UID:$USER_GID {relpaths_host} $MODEL_PATH ## Provide a set of instructions to build the model inside the docker image, and run the unit tests RUN setup && run_tests -## See examples in +## See tutorials in #### Python (https://git.gfz-potsdam.de/csep-group/rise_italy_experiment/models/mockup_py) #### R (https://git.gfz-potsdam.de/csep-group/rise_italy_experiment/models/mockup_R) diff --git a/tests/integration/test_model_interface.py b/tests/integration/test_model_interface.py index 318a708..ae2c0d8 100644 --- a/tests/integration/test_model_interface.py +++ b/tests/integration/test_model_interface.py @@ -139,7 +139,7 @@ def setUpClass(cls) -> None: cls._dir = os.path.join(path, "../", "artifacts", "models") cls._alm_fn = os.path.join( path, - "../../examples", + "../../tutorials", "case_e", "models", "gulia-wiemer.ALM.italy.10yr.2010-01-01.xml", @@ -201,7 +201,7 @@ def test_forecast_ti_from_hdf5(self): def tearDownClass(cls) -> None: alm_db = os.path.join( cls._path, - "../../examples", + "../../tutorials", "case_e", "models", "gulia-wiemer.ALM.italy.10yr.2010-01-01.hdf5", diff --git a/tests/qa/test_data.py b/tests/qa/test_data.py index 8441d87..c2db68f 100644 --- a/tests/qa/test_data.py +++ b/tests/qa/test_data.py @@ -10,14 +10,14 @@ class DataTest(unittest.TestCase): @staticmethod def get_runpath(case): return os.path.abspath( - os.path.join(__file__, "../../..", "examples", f"case_{case}", f"config.yml") + os.path.join(__file__, "../../..", "tutorials", f"case_{case}", f"config.yml") ) @staticmethod def get_rerunpath(case): return os.path.abspath( os.path.join( - __file__, "../../..", "examples", f"case_{case}", "results", f"repr_config.yml" + __file__, "../../..", "tutorials", f"case_{case}", "results", f"repr_config.yml" ) ) diff --git a/tests/unit/test_readers.py b/tests/unit/test_readers.py index a9e4bf8..f4935a1 100644 --- a/tests/unit/test_readers.py +++ b/tests/unit/test_readers.py @@ -71,7 +71,7 @@ def test_parse_csv_qtree(self): def test_parse_xml(self): fname = os.path.join( self._path, - "../../examples", + "../../tutorials", "case_e", "models", "gulia-wiemer.ALM.italy.10yr.2010-01-01.xml", diff --git a/examples/case_a/best_model.dat b/tutorials/case_a/best_model.dat similarity index 100% rename from examples/case_a/best_model.dat rename to tutorials/case_a/best_model.dat diff --git a/examples/case_a/case_a.py b/tutorials/case_a/case_a.py similarity index 100% rename from examples/case_a/case_a.py rename to tutorials/case_a/case_a.py diff --git a/examples/case_a/catalog.csep b/tutorials/case_a/catalog.csep similarity index 100% rename from examples/case_a/catalog.csep rename to tutorials/case_a/catalog.csep diff --git a/examples/case_a/config.yml b/tutorials/case_a/config.yml similarity index 100% rename from examples/case_a/config.yml rename to tutorials/case_a/config.yml diff --git a/examples/case_a/region.txt b/tutorials/case_a/region.txt similarity index 100% rename from examples/case_a/region.txt rename to tutorials/case_a/region.txt diff --git a/examples/case_b/case_b.py b/tutorials/case_b/case_b.py similarity index 100% rename from examples/case_b/case_b.py rename to tutorials/case_b/case_b.py diff --git a/examples/case_b/catalog.json b/tutorials/case_b/catalog.json similarity index 100% rename from examples/case_b/catalog.json rename to tutorials/case_b/catalog.json diff --git a/examples/case_b/config.yml b/tutorials/case_b/config.yml similarity index 100% rename from examples/case_b/config.yml rename to tutorials/case_b/config.yml diff --git a/examples/case_b/models.yml b/tutorials/case_b/models.yml similarity index 100% rename from examples/case_b/models.yml rename to tutorials/case_b/models.yml diff --git a/examples/case_b/models/model_a.csv b/tutorials/case_b/models/model_a.csv similarity index 100% rename from examples/case_b/models/model_a.csv rename to tutorials/case_b/models/model_a.csv diff --git a/examples/case_b/models/model_b.csv b/tutorials/case_b/models/model_b.csv similarity index 100% rename from examples/case_b/models/model_b.csv rename to tutorials/case_b/models/model_b.csv diff --git a/examples/case_b/models/model_c.csv b/tutorials/case_b/models/model_c.csv similarity index 100% rename from examples/case_b/models/model_c.csv rename to tutorials/case_b/models/model_c.csv diff --git a/examples/case_b/models/model_d.csv b/tutorials/case_b/models/model_d.csv similarity index 100% rename from examples/case_b/models/model_d.csv rename to tutorials/case_b/models/model_d.csv diff --git a/examples/case_b/region.txt b/tutorials/case_b/region.txt similarity index 100% rename from examples/case_b/region.txt rename to tutorials/case_b/region.txt diff --git a/examples/case_b/tests.yml b/tutorials/case_b/tests.yml similarity index 100% rename from examples/case_b/tests.yml rename to tutorials/case_b/tests.yml diff --git a/examples/case_c/case_c.py b/tutorials/case_c/case_c.py similarity index 100% rename from examples/case_c/case_c.py rename to tutorials/case_c/case_c.py diff --git a/examples/case_c/catalog.json b/tutorials/case_c/catalog.json similarity index 100% rename from examples/case_c/catalog.json rename to tutorials/case_c/catalog.json diff --git a/examples/case_c/config.yml b/tutorials/case_c/config.yml similarity index 100% rename from examples/case_c/config.yml rename to tutorials/case_c/config.yml diff --git a/examples/case_c/models.yml b/tutorials/case_c/models.yml similarity index 100% rename from examples/case_c/models.yml rename to tutorials/case_c/models.yml diff --git a/examples/case_c/models/model_a.csv b/tutorials/case_c/models/model_a.csv similarity index 100% rename from examples/case_c/models/model_a.csv rename to tutorials/case_c/models/model_a.csv diff --git a/examples/case_c/models/model_b.csv b/tutorials/case_c/models/model_b.csv similarity index 100% rename from examples/case_c/models/model_b.csv rename to tutorials/case_c/models/model_b.csv diff --git a/examples/case_c/models/model_c.csv b/tutorials/case_c/models/model_c.csv similarity index 100% rename from examples/case_c/models/model_c.csv rename to tutorials/case_c/models/model_c.csv diff --git a/examples/case_c/models/model_d.csv b/tutorials/case_c/models/model_d.csv similarity index 100% rename from examples/case_c/models/model_d.csv rename to tutorials/case_c/models/model_d.csv diff --git a/examples/case_c/region.txt b/tutorials/case_c/region.txt similarity index 100% rename from examples/case_c/region.txt rename to tutorials/case_c/region.txt diff --git a/examples/case_c/tests.yml b/tutorials/case_c/tests.yml similarity index 100% rename from examples/case_c/tests.yml rename to tutorials/case_c/tests.yml diff --git a/examples/case_d/config.yml b/tutorials/case_d/config.yml similarity index 100% rename from examples/case_d/config.yml rename to tutorials/case_d/config.yml diff --git a/examples/case_d/models.yml b/tutorials/case_d/models.yml similarity index 100% rename from examples/case_d/models.yml rename to tutorials/case_d/models.yml diff --git a/examples/case_d/tests.yml b/tutorials/case_d/tests.yml similarity index 100% rename from examples/case_d/tests.yml rename to tutorials/case_d/tests.yml diff --git a/examples/case_e/case_e.py b/tutorials/case_e/case_e.py similarity index 100% rename from examples/case_e/case_e.py rename to tutorials/case_e/case_e.py diff --git a/examples/case_e/catalog.json b/tutorials/case_e/catalog.json similarity index 100% rename from examples/case_e/catalog.json rename to tutorials/case_e/catalog.json diff --git a/examples/case_e/config.yml b/tutorials/case_e/config.yml similarity index 100% rename from examples/case_e/config.yml rename to tutorials/case_e/config.yml diff --git a/examples/case_e/models.yml b/tutorials/case_e/models.yml similarity index 100% rename from examples/case_e/models.yml rename to tutorials/case_e/models.yml diff --git a/examples/case_e/models/gulia-wiemer.ALM.italy.10yr.2010-01-01.xml b/tutorials/case_e/models/gulia-wiemer.ALM.italy.10yr.2010-01-01.xml similarity index 100% rename from examples/case_e/models/gulia-wiemer.ALM.italy.10yr.2010-01-01.xml rename to tutorials/case_e/models/gulia-wiemer.ALM.italy.10yr.2010-01-01.xml diff --git a/examples/case_e/models/meletti.MPS04.italy.10yr.2010-01-01.xml b/tutorials/case_e/models/meletti.MPS04.italy.10yr.2010-01-01.xml similarity index 100% rename from examples/case_e/models/meletti.MPS04.italy.10yr.2010-01-01.xml rename to tutorials/case_e/models/meletti.MPS04.italy.10yr.2010-01-01.xml diff --git a/examples/case_e/models/zechar.TripleS-CPTI.italy.10yr.2010-01-01.xml b/tutorials/case_e/models/zechar.TripleS-CPTI.italy.10yr.2010-01-01.xml similarity index 100% rename from examples/case_e/models/zechar.TripleS-CPTI.italy.10yr.2010-01-01.xml rename to tutorials/case_e/models/zechar.TripleS-CPTI.italy.10yr.2010-01-01.xml diff --git a/examples/case_e/tests.yml b/tutorials/case_e/tests.yml similarity index 100% rename from examples/case_e/tests.yml rename to tutorials/case_e/tests.yml diff --git a/examples/case_f/catalog.json b/tutorials/case_f/catalog.json similarity index 100% rename from examples/case_f/catalog.json rename to tutorials/case_f/catalog.json diff --git a/examples/case_f/config.yml b/tutorials/case_f/config.yml similarity index 100% rename from examples/case_f/config.yml rename to tutorials/case_f/config.yml diff --git a/examples/case_f/etas/forecasts/etas_2016-11-14_2016-11-15.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-14_2016-11-15.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-14_2016-11-15.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-14_2016-11-15.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-15_2016-11-16.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-15_2016-11-16.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-15_2016-11-16.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-15_2016-11-16.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-16_2016-11-17.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-16_2016-11-17.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-16_2016-11-17.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-16_2016-11-17.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-17_2016-11-18.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-17_2016-11-18.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-17_2016-11-18.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-17_2016-11-18.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-18_2016-11-19.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-18_2016-11-19.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-18_2016-11-19.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-18_2016-11-19.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-19_2016-11-20.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-19_2016-11-20.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-19_2016-11-20.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-19_2016-11-20.csv diff --git a/examples/case_f/etas/forecasts/etas_2016-11-20_2016-11-21.csv b/tutorials/case_f/etas/forecasts/etas_2016-11-20_2016-11-21.csv similarity index 100% rename from examples/case_f/etas/forecasts/etas_2016-11-20_2016-11-21.csv rename to tutorials/case_f/etas/forecasts/etas_2016-11-20_2016-11-21.csv diff --git a/examples/case_f/models.yml b/tutorials/case_f/models.yml similarity index 100% rename from examples/case_f/models.yml rename to tutorials/case_f/models.yml diff --git a/examples/case_f/tests.yml b/tutorials/case_f/tests.yml similarity index 100% rename from examples/case_f/tests.yml rename to tutorials/case_f/tests.yml diff --git a/examples/case_g/catalog.csv b/tutorials/case_g/catalog.csv similarity index 100% rename from examples/case_g/catalog.csv rename to tutorials/case_g/catalog.csv diff --git a/examples/case_g/config.yml b/tutorials/case_g/config.yml similarity index 100% rename from examples/case_g/config.yml rename to tutorials/case_g/config.yml diff --git a/examples/case_g/custom_plot_script.py b/tutorials/case_g/custom_plot_script.py similarity index 100% rename from examples/case_g/custom_plot_script.py rename to tutorials/case_g/custom_plot_script.py diff --git a/examples/case_g/models.yml b/tutorials/case_g/models.yml similarity index 100% rename from examples/case_g/models.yml rename to tutorials/case_g/models.yml diff --git a/examples/case_g/pymock/Dockerfile b/tutorials/case_g/pymock/Dockerfile similarity index 100% rename from examples/case_g/pymock/Dockerfile rename to tutorials/case_g/pymock/Dockerfile diff --git a/examples/case_g/pymock/README.md b/tutorials/case_g/pymock/README.md similarity index 100% rename from examples/case_g/pymock/README.md rename to tutorials/case_g/pymock/README.md diff --git a/examples/case_g/pymock/input/args.txt b/tutorials/case_g/pymock/input/args.txt similarity index 100% rename from examples/case_g/pymock/input/args.txt rename to tutorials/case_g/pymock/input/args.txt diff --git a/examples/case_g/pymock/pymock/__init__.py b/tutorials/case_g/pymock/pymock/__init__.py similarity index 100% rename from examples/case_g/pymock/pymock/__init__.py rename to tutorials/case_g/pymock/pymock/__init__.py diff --git a/examples/case_g/pymock/pymock/libs.py b/tutorials/case_g/pymock/pymock/libs.py similarity index 100% rename from examples/case_g/pymock/pymock/libs.py rename to tutorials/case_g/pymock/pymock/libs.py diff --git a/examples/case_g/pymock/pymock/main.py b/tutorials/case_g/pymock/pymock/main.py similarity index 100% rename from examples/case_g/pymock/pymock/main.py rename to tutorials/case_g/pymock/pymock/main.py diff --git a/examples/case_g/pymock/pyproject.toml b/tutorials/case_g/pymock/pyproject.toml similarity index 100% rename from examples/case_g/pymock/pyproject.toml rename to tutorials/case_g/pymock/pyproject.toml diff --git a/examples/case_g/pymock/requirements.txt b/tutorials/case_g/pymock/requirements.txt similarity index 100% rename from examples/case_g/pymock/requirements.txt rename to tutorials/case_g/pymock/requirements.txt diff --git a/examples/case_g/pymock/run.py b/tutorials/case_g/pymock/run.py similarity index 100% rename from examples/case_g/pymock/run.py rename to tutorials/case_g/pymock/run.py diff --git a/examples/case_g/pymock/setup.cfg b/tutorials/case_g/pymock/setup.cfg similarity index 100% rename from examples/case_g/pymock/setup.cfg rename to tutorials/case_g/pymock/setup.cfg diff --git a/examples/case_g/pymock/setup.py b/tutorials/case_g/pymock/setup.py similarity index 100% rename from examples/case_g/pymock/setup.py rename to tutorials/case_g/pymock/setup.py diff --git a/examples/case_g/tests.yml b/tutorials/case_g/tests.yml similarity index 100% rename from examples/case_g/tests.yml rename to tutorials/case_g/tests.yml diff --git a/examples/case_h/catalog.csv b/tutorials/case_h/catalog.csv similarity index 100% rename from examples/case_h/catalog.csv rename to tutorials/case_h/catalog.csv diff --git a/examples/case_h/config.yml b/tutorials/case_h/config.yml similarity index 100% rename from examples/case_h/config.yml rename to tutorials/case_h/config.yml diff --git a/examples/case_h/custom_report.py b/tutorials/case_h/custom_report.py similarity index 100% rename from examples/case_h/custom_report.py rename to tutorials/case_h/custom_report.py diff --git a/examples/case_h/models.yml b/tutorials/case_h/models.yml similarity index 100% rename from examples/case_h/models.yml rename to tutorials/case_h/models.yml diff --git a/examples/case_h/tests.yml b/tutorials/case_h/tests.yml similarity index 100% rename from examples/case_h/tests.yml rename to tutorials/case_h/tests.yml From 4a8e76c39b2dee7ef061dba1ee009a8968610b78 Mon Sep 17 00:00:00 2001 From: pciturri Date: Wed, 25 Sep 2024 02:35:12 +0200 Subject: [PATCH 08/19] docs: Updated installation section, modified rtd options gh: added a workflow to automatically add a tutorial zip file into any release files. --- .github/workflows/release-tutorials.yml | 24 +++++++ MANIFEST.in | 2 +- docs/conf.py | 7 +- docs/intro/installation.rst | 96 +++++++++++++++---------- 4 files changed, 89 insertions(+), 40 deletions(-) create mode 100644 .github/workflows/release-tutorials.yml diff --git a/.github/workflows/release-tutorials.yml b/.github/workflows/release-tutorials.yml new file mode 100644 index 0000000..de87c73 --- /dev/null +++ b/.github/workflows/release-tutorials.yml @@ -0,0 +1,24 @@ +name: Release Tutorials + +on: + release: + types: [ published ] + +jobs: + upload-tutorials: + runs-on: ubuntu-latest + + steps: + - name: Check out the code + uses: actions/checkout@v3 + + - name: Zip the tutorials folder + run: | + zip -r tutorials.zip tutorials/ + + - name: Upload the tutorials.zip to the release + uses: softprops/action-gh-release@v1 + with: + files: tutorials.zip + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/MANIFEST.in b/MANIFEST.in index 39e8be4..3ce7ff8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,6 +2,7 @@ include README.md include CODE_OF_CONDUCT.md include requirements.txt include requirements_dev.txt +include environment.yml include setup.py include setup.cfg include pyproject.toml @@ -14,7 +15,6 @@ graft tests graft docs prune docs/_build prune docs/referenced/generated -prune docs/tutorials/ global-exclude .git* global-exclude *.pyc diff --git a/docs/conf.py b/docs/conf.py index 64f56d3..32e462c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -60,7 +60,8 @@ html_theme_options = { "display_version": True, "prev_next_buttons_location": "both", - "collapse_navigation": False, + "sticky_navigation": True, + "collapse_navigation": True, "style_nav_header_background": "#343131ff", "logo_only": True, } @@ -79,6 +80,6 @@ GitHub | CSEP Website | pyCSEP | - Download PDF + Download PDF -""" \ No newline at end of file +""" diff --git a/docs/intro/installation.rst b/docs/intro/installation.rst index 5d53517..2d66424 100644 --- a/docs/intro/installation.rst +++ b/docs/intro/installation.rst @@ -1,20 +1,22 @@ Installation ============ -Installing the latest version ------------------------------ +.. important:: - .. important:: + This application uses ``3.9 <= python <= 3.11`` - This application uses ``python >= 3.9`` +Latest Version +-------------- -Using ``conda`` -~~~~~~~~~~~~~~~ +Recommended to learn the software, run the tutorials, and drafting Testing Experiments. + +1. Using ``conda`` +~~~~~~~~~~~~~~~~~~ To install **floatCSEP**, first a ``conda`` manager should be installed (https://conda.io). Checkout `Anaconda`, `Miniconda` or `Miniforge` (recommended). Once installed, create an environment with: - .. code-block:: sh + .. code-block:: console $ conda env create -n csep_env $ conda activate csep_env @@ -23,54 +25,76 @@ Then, clone and install the floatCSEP source code using ``pip`` .. code-block:: console - git clone https://github.com/cseptesting/floatcsep - cd floatcsep - pip install . + $ git clone https://github.com/cseptesting/floatcsep + $ cd floatcsep + $ pip install . -Using ``pip`` -~~~~~~~~~~~~~ +2. Using ``pip`` only +~~~~~~~~~~~~~~~~~~~~~ -To install using the ``pip`` manager, we require to install the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}. The **floatcsep** latest version then can be installed as: +To install using the ``pip`` manager only, we require to install the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}. The **floatCSEP** latest version can then be installed as: - .. code-block:: + .. code-block:: console - cd .. - git clone https://github.com/cseptesting/floatcsep - cd floatcsep - pip install . + $ git clone https://github.com/cseptesting/floatcsep + $ cd floatcsep + $ python -m venv venv + $ pip install . -Installing the stable version ------------------------------ +Latest Stable Release +--------------------- -Using ``conda`` -~~~~~~~~~~~~~~~ +Recommended for deploying live Floating Testing Experiments -To install **floatCSEP**, first a ``conda`` manager should be installed (https://conda.io). Checkout `Anaconda`, `Miniconda` or `Miniforge` (recommended). Once installed, create an environment with: +1. From the ``conda-forge`` channel +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Having a ``conda`` manager installed (https://conda.io), type in a console: - .. code-block:: sh + + .. code-block:: console $ conda env create -n csep_env $ conda activate csep_env + $ conda install -c conda-forge floatcsep -Then, clone and install the floatCSEP source code using ``pip`` + +2. From the ``PyPI`` repository +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Having installed the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}, install **floatCSEP** by: + + .. code-block:: console + + $ python -m venv venv + $ pip install floatcsep + +.. important:: + If you want to run the tutorials from a **floatCSEP** installation obtained through ``conda-forge`` or ``PyPI``, the tutorials can be downloaded to your current directory as: .. code-block:: console - git clone https://github.com/cseptesting/floatcsep - cd floatcsep - pip install . + $ latest_version=$(curl --silent "https://api.github.com/repos/cseptesting/floatcsep/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') && \ + wget "https://github.com/cseptesting/floatcsep/releases/download/$latest_version/tutorials.zip" + $ unzip tutorials.zip -d ./ && rm tutorials.zip + Or downloaded manually from the `latest release `_. -Using ``pip`` -~~~~~~~~~~~~~ -To install using the ``pip`` manager, we require to install the binary dependencies of **pyCSEP** (see `Installing pyCSEP `_}. The **floatcsep** latest version can then be installed as: - .. code-block:: +For Developers +-------------- + +It is recommended (not obligatory) to use a ``conda`` environment to make sure your contributions do not depend on your system local libraries. For contributions to the **floatCSEP** codebase, please consider using a `fork `_ and creating pull-requests from there. + + .. code-block:: console + + $ conda env create -n csep_dev + $ conda activate csep_dev + $ git clone https://github.com/{your_fork}/floatcsep + $ cd floatcsep + $ pip install .[dev] - cd .. - git clone https://github.com/cseptesting/floatcsep - cd floatcsep - pip install . \ No newline at end of file +This will install (and configure) all the unit-testing, linting and documentation packages. From ef32c94a2f726261651e07ad49331b34d00e2b3f Mon Sep 17 00:00:00 2001 From: pciturri Date: Wed, 25 Sep 2024 19:43:43 +0200 Subject: [PATCH 09/19] docs: Re-wrote Concepts document. --- docs/_static/float_scheme.png | Bin 0 -> 209933 bytes docs/index.rst | 6 +-- docs/intro/concepts.rst | 71 +++++++++++++++++++++++++ docs/intro/floating_experiments.rst | 24 --------- docs/intro/forecasting_experiments.rst | 5 -- 5 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 docs/_static/float_scheme.png create mode 100644 docs/intro/concepts.rst delete mode 100644 docs/intro/floating_experiments.rst delete mode 100644 docs/intro/forecasting_experiments.rst diff --git a/docs/_static/float_scheme.png b/docs/_static/float_scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..ab527e78cc7d6affab3b67542a657105cfb97e1b GIT binary patch literal 209933 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%0Acfj-&G=%JC@RFsW7 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 +R>~3XaeRYqoE(xBQ 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

g)zSfSA{10K$&X8RarHCBlGi2DIJix*E^ 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 O00K`}KbLh*2~7Z(?9`S3 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 0410bc1..fa8007c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -60,7 +60,7 @@ Quickstart | | - :ref:`case_b` | | |learn2| **Testing Theory** | - :ref:`case_c` | | | - :ref:`case_d` | -| |experiment| **Floating Experiments** | - :ref:`case_e` | +| |experiment| **Experiment Concepts** | - :ref:`case_e` | | | - :ref:`case_f` | | |api| **API Reference** | - :ref:`case_g` | | | - :ref:`case_h` | @@ -78,7 +78,6 @@ Goals * Set up a testing experiment for your forecasts using authoritative data sources/benchmarks. * Encapsulate the complete experiment's definition and rules in a couple of lines. - * Produce human-readable results and figures. * Reproduce, reuse, and share forecasting experiments. Running @@ -137,8 +136,7 @@ Collaborators :caption: Get Started intro/installation.rst - intro/forecasting_experiments.rst - intro/floating_experiments.rst + intro/concepts.rst .. toctree:: diff --git a/docs/intro/concepts.rst b/docs/intro/concepts.rst new file mode 100644 index 0000000..0da1f5f --- /dev/null +++ b/docs/intro/concepts.rst @@ -0,0 +1,71 @@ +Concepts +======== + + +Forecasting Models +----------------------------- + +An earthquake **Forecasting Model** is a representation of our understanding of seismicity, constituted by a collection of hypotheses, assumptions, data and methods. It is able to generate **Forecasts**, i.e., `a probabilistic statement about the occurrence of seismicity, which can include information about its magnitude and spatial location` (Check out the `Core Concepts `_ in the **pyCSEP** documentation). + + +From a computational perspective, a Model can be conceptualized as a **black-box system**, which receives an **input** (e.g. catalog, time window, target magnitude) to produce an **output** (a forecast). It may consist of a single Forecast, a collection of Forecasts, or a forecast-generating source-code. For now, we support earthquake forecasts expressed as: + + * Mean rate of occurrence in spatial-magnitude-temporal discretizations + * Families of synthetic earthquake catalogs. + + +Forecasting Experiments +----------------------- + +A **Forecasting Experiment** is here defined as the complete scientific process that encodes the questions, hypotheses to be addressed by **Forecasting Models** and the **Evaluation** of such hypotheses and their results. +An experiment has the purpose of leading eventually to scientific and methodological improvements in our forecasting capabilities. + +In **Prospective Experiments**, the parameters of the experiment (including forecast generation, data sets, and evaluation metrics) must be defined with zero degrees of freedom before any evaluations begin. Prospective experimentation provides the most objective view of the forecast skill of a model, due to excluding any unconscious bias from the modelers. Examples of past prospective experiments are: + +.. list-table:: + :header-rows: 1 + :widths: 12 90 + + * - Region + - References + * - California + - * `Schorlemmer, D., & Gerstenberger, M. (2007). RELM testing center. Seismological Research Letters, 78(1), 30-36. `_ + * `Schorlemmer, D., et al. (2010). First results of the regional earthquake likelihood models experiment. Seismogenesis and Earthquake Forecasting: The Frank Evison Volume II, 5-22. `_ + * `Strader, A., et al. (2017). Prospective and retrospective evaluation of five-year earthquake forecast models for California. Geophysical Journal International, 211-1, 239–251. `_ + * - Japan + - * `Nanjo, K., et al. (2011). Overview of the first earthquake forecast testing experiment in Japan, Earth Planets Space, 63 (3), 159–169 `_ + * `Tsuruoka, H., et al., (2012). CSEP Testing Center and the first results of the earthquake forecast testing experiment in Japan. Earth, planets and space, 64, 661-671. `_ + + * - New Zealand + - * `Gerstenberger, M., & Rhoades, D. (2010). New Zealand earthquake forecast testing centre. Seismogenesis and Earthquake Forecasting: The Frank Evison Volume II, 23-38. `_ + * `Rhoades, D., et al. (2018). Highlights from the first ten years of the New Zealand earthquake forecast testing center. Seismological Research Letters, 89(4), 1229-1237. `_ + * - Italy + - * `Schorlemmer, D., et al. (2010). Setting up an earthquake forecast experiment in Italy. Annals of Geophysics. `_ + * `Taroni, M., et al. (2018). Prospective CSEP evaluation of 1‐day, 3‐month, and 5‐yr earthquake forecasts for Italy. Seismological Research Letters, 89(4), 1251-1261. `_ + * `Iturrieta, P., et al. (2024). Evaluation of a Decade-Long Prospective Earthquake Forecasting Experiment in Italy. Seismological Research Letters. `_ + +Floating Experiments +-------------------- + +They are a new conceptual framework for modern experiments, whose operation rely on version control systems (i.e. ``git``), open-data repositories ((e.g. `Zenodo `_) and the containerization of computational environments (e.g., `Docker `_), making experiments reproducible, re-usable and shareable during the time scale of the evaluations. **Floating Experiments** are computational reproducibility packages (e.g., `World Bank `_) expanded to a dynamic implementation, as new earthquake data becomes available in time and new testing results can be continuously released. + +.. figure:: ../_static/float_scheme.png + :alt: Floating Experiments + :width: 50% + :align: center + + The forecasting experiment is stored along with the system (**floatCSEP**) and testing routines (**pyCSEP**). It can be cloned to a local machine and run to create results, by using a containerized environment. Results can then be published back into the same repositories, tagging a version/release for each update. + + +**floatCSEP** assists scientists and institutions in the deployment of forecasting experiments, by standardizing and curating the artifacts and methods required to continuously run and/or reproduce an +experiment, without it being coupled to a fixed physical infrastructure. + + +References +---------- + + * Mizrahi, L., Dallo, I., van der Elst, N. J., Christophersen, A., Spassiani, I., Werner, M. J., et al. (2024). Developing, testing, and communicating earthquake forecasts: Current practices and future directions. Reviews of Geophysics, 62, e2023RG000823. https://doi.org/10.1029/2023RG000823 + * Iturrieta, P., Savran, W. H., Khawaja, M. A. M., Bayona, J., Maechling, P. J., Silva, F., et al. (2023). Modernizing earthquake forecasting experiments: The CSEP floating experiments. In AGU Fall Meeting Abstracts (Vol. 2023). + * Savran, W. H., Bayona, J. A., Iturrieta, P., Asim, K. M., Bao, H., et al. (2022). pyCSEP: a Python toolkit for earthquake forecast developers. Seismological Society of America, 93(5), 2858-2870. https://doi.org/10.1785/0220220033 + * Krafczyk, M. S., Shi, A., Bhaskar, A., Marinov, D., Stodden, V., (2021). Learning from reproducing computational results: Introducing three principles and the Reproduction Package. Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences 379, 20200069. https://doi.org/10.1098/rsta.2020.0069. + diff --git a/docs/intro/floating_experiments.rst b/docs/intro/floating_experiments.rst deleted file mode 100644 index 85fe246..0000000 --- a/docs/intro/floating_experiments.rst +++ /dev/null @@ -1,24 +0,0 @@ -Floating Experiments -==================== - - - -Concept -------- - - -The CSEP experiments consist in the prospective evaluation of probabilistic earthquake forecasting models. In these prospective experiments, the parameters of the experiment (including forecast generation, data sets, and evaluation metrics) must be defined with zero degrees of freedom before any evaluations begin. - -A Floating Testing Experiment encapsulates each experiment into its own runnable environment, taking advantage of version control (i.e. ``git``), open-data repositories (e.g. `Zenodo `_) and Infrastructure as Code (e.g. `Docker `_) technologies, making it reproducible, re-usable and shareable during the time scale of the -evaluations. - -``floatCSEP`` goals -------------------- - -This is an application to deploy reproducible and prospective experiments of earthquake forecasting, namely a Floating Eperiment, that can operate independent of a particular testing server. With this application, researchers, institutions and users can - - * Set up a testing experiment for your earthquake forecasts using authoritative data sources and benchmarks. - * Encapsulate the complete experiment's definition and rules in a couple of lines. - * Produce human-readable results and figures. - * Reproduce, reuse, and share forecasting experiments. - diff --git a/docs/intro/forecasting_experiments.rst b/docs/intro/forecasting_experiments.rst deleted file mode 100644 index 1b9e6ac..0000000 --- a/docs/intro/forecasting_experiments.rst +++ /dev/null @@ -1,5 +0,0 @@ -Forecasting Experiments -======================= - - -TBW \ No newline at end of file From 3f564ef5a3d6f9bab4f675d328e40f49d3c8ac23 Mon Sep 17 00:00:00 2001 From: pciturri Date: Thu, 26 Sep 2024 02:53:53 +0200 Subject: [PATCH 10/19] ft: time configuration can now be instantiated by explicit time windows docs: completed Experiment Configuration section, --- docs/guide/config.rst | 4 - ...tests_config.rst => evaluation_config.rst} | 2 + docs/guide/experiment_config.rst | 269 ++++++++++++++++++ docs/guide/model_config.rst | 2 + docs/guide/postprocess_config.rst | 4 +- docs/guide/region_config.rst | 4 - docs/guide/time_config.rst | 4 - docs/index.rst | 13 +- floatcsep/utils/helpers.py | 27 +- 9 files changed, 297 insertions(+), 32 deletions(-) delete mode 100644 docs/guide/config.rst rename docs/guide/{tests_config.rst => evaluation_config.rst} (67%) create mode 100644 docs/guide/experiment_config.rst delete mode 100644 docs/guide/region_config.rst delete mode 100644 docs/guide/time_config.rst diff --git a/docs/guide/config.rst b/docs/guide/config.rst deleted file mode 100644 index 2a6bd75..0000000 --- a/docs/guide/config.rst +++ /dev/null @@ -1,4 +0,0 @@ -Experiment Configuration -======================== - -In progress \ No newline at end of file diff --git a/docs/guide/tests_config.rst b/docs/guide/evaluation_config.rst similarity index 67% rename from docs/guide/tests_config.rst rename to docs/guide/evaluation_config.rst index c83c7ff..e4939be 100644 --- a/docs/guide/tests_config.rst +++ b/docs/guide/evaluation_config.rst @@ -1,3 +1,5 @@ +.. _evaluation_config: + Evaluations Definition ====================== diff --git a/docs/guide/experiment_config.rst b/docs/guide/experiment_config.rst new file mode 100644 index 0000000..a62a3e5 --- /dev/null +++ b/docs/guide/experiment_config.rst @@ -0,0 +1,269 @@ +Experiment Configuration +======================== + +**floatCSEP** provides a standardized workflow for forecasting experiments, whose instructions can be set in a configuration file. Here, we need to define the Experiments' temporal settings, geographic region, seismic catalogs, forecasting models, evaluation tests and post-process. + + +Configuration Structure +----------------------- +Configuration files are written in ``YAML`` format and is divided into different aspects of the Experiment setup: + +1. **Experiment Metadata**: Experiment's information such as its ``name``, ``authors``, ``doi``, ``URL``, etc. +2. **Temporal Configuration** (``time_config``): Temporal characteristics of the experiment, such as the start and end dates, experiment class (time-independent or time-dependent), the testing intervals, etc. +3. **Spatial and Magnitude Configuration** (``region_config``): Describes testing region, such as its geographic bounds, magnitude ranges, and depth ranges. +4. **Seismic Catalog** (``catalog``): Defines the seismicity data source to test the models. It can either link to a seismic network API, or an existing file in the system. +5. **Models** (``models``): Configuration of forecasting models. It can direct to an additional configuration file with ``model_config`` for readability. See :ref:`model_config`. +6. **Evaluation Tests** (``tests``): Configuration of the statistical tests to evaluate the models. It can direct to an additional configuration file with ``test_config`` for readability. See :ref:`evaluation_config`. +7. **Postprocessing** (``postprocess``): Instructions on how to process and visualize the experiment's results, such as plotting forecasts or generating reports. See :ref:`postprocess`. + +.. note:: + + YAML (Yet Another Markup Language) is a human-readable format used for configuration files. It uses **key: value** pairs to define settings, and indentation to represent nested structures. Lists are denoted by hyphens (`-`). + + +**Example Basic Configuration** (``config.yml``): + +.. code-block:: yaml + + name: CSEP Experiment + time_config: + start_date: 2010-1-1T00:00:00 + end_date: 2020-1-1T00:00:00 + region_config: + region: region.txt + mag_min: 4.0 + mag_max: 9.0 + mag_bin: 0.1 + depth_min: 0 + depth_max: 70 + catalog: catalog.csv + models: + - Smoothed-Seismicity: + path: ssm.dat + - Uniform: + path: uniform.dat + tests: + - Poisson S-test: + func: poisson_evaluations.spatial_test + plot_func: plot_poisson_consistency_test + postprocess: + plot_forecasts: + cmap: magma + catalog: True + + + +Experiment Metadata +------------------- + +.. list-table:: + :widths: 20 80 + + * - **name** + - Maximum magnitude to be considered. + * - **authors** + - Authors of the experiment + * - **doi** + - identifier associated to the experiment + * - **URL** + - repository of the experiment (e.g., Github) + +Any non-parsed parameter (e.g., not specified in the documentation) will be stored also as metadata. + + +Temporal Definition +------------------- + +Configuring the temporal definition of the experiment is indicated with the ``time_config`` option, followed by an indented block of admissible parameters. The purpose of this configuration section is to set a testing **time-window**, or a sequence of **time-windows**. Each time-window is then defined by ``datetime`` strings representing its lower and upper edges. + +Time-windows can be defined from different combination of the following parameters: + +.. list-table:: + :widths: 20 80 + + * - **start_date** + - The start date of the experiment in UTC and ISO8601 format (``%Y-%m-%dT%H:%M:%S``) + * - **end_date** + - The end date of the experiment in UTC and ISO8601 format (``%Y-%m-%dT%H:%M:%S``) + * - **intervals** + - An integer amount of testing intervals (time windows). + * - **horizon** + - Indicates the time windows `length`. It is written as a number, followed by a hyphen (`-`) and a time unit (``days``, ``weeks``, ``months``, ``years``). e.g.: ``1-days``, ``2.5-years``. + * - **offset** + - Offset between consecutive time-windows. If none given or ``offset=horizon``, time-windows are non-overlapping. It is written as a number, followed by a hyphen (`-`) and a time unit (``days``, ``weeks``, ``months``, ``years``). e.g.: ``1-days``, ``2.5-years``. + * - **growth** + - How to discretize the time-windows between ``start_date`` and ``end_date``. Options are: **incremental** (The end of a time window matches the beginning of the next) or **cumulative** (All time-windows have a start at the experiment ``start_date``). + * - **exp_class** + - Experiment temporal class. Options are: + **ti** (default): Time-Independent; **td**: Time-Dependent. + +.. note:: + + For a Time-Independent (``ti``) experiment class, the following argument combinations are possible: + + - (``start_date``, ``end_date``) + - (``start_date``, ``end_date``, ``intervals``) + - (``start_date``, ``end_date``, ``horizon``) + - (``start_date``, ``intervals``, ``horizon``) + + For a Time-Dependent (``td``) experiment class, the following argument combinations are possible: + + - (``start_date``, ``end_date``, ``intervals``) + - (``start_date``, ``end_date``, ``horizon``) + - (``start_date``, ``intervals``, ``horizon``) + - (``start_date``, ``end_date``, ``horizon``, ``offset``) + - (``start_date``, ``intervals``, ``horizon``, ``offset``) + + +Some example of parameter combinations: + ++------------------------------------------------+----------------------------------------------------------+ +| .. code-block:: yaml | Two time-windows of equal size between 2010 and 2020 | +| | | +| time_config: | - ``2010-01-01T00:00:00`` - ``2015-01-01T00:00:00`` | +| start_date: 2010-01-01T00:00:00 | - ``2015-01-01T00:00:00`` - ``2020-01-01T00:00:00`` | +| end_date: 2020-01-01T00:00:00 | | +| intervals: 2 | | ++------------------------------------------------+----------------------------------------------------------+ +| .. code-block:: yaml | Two cummulative time-windows between 2010 and 2020 | +| | | +| time_config: | - ``2010-01-01T00:00:00`` - ``2015-01-01T00:00:00`` | +| start_date: 2010-01-01T00:00:00 | - ``2010-01-01T00:00:00`` - ``2020-01-01T00:00:00`` | +| end_date: 2020-01-01T00:00:00 | | +| intervals: 2 | | +| growth: cumulative | | ++------------------------------------------------+----------------------------------------------------------+ +| .. code-block:: yaml | Time-Dependent experiment with three ``1-day`` windows | +| | | +| time_config: | | +| start_date: 2010-01-01T00:00:00 | - ``2010-01-01T00:00:00`` - ``2010-01-02T00:00:00`` | +| intervals: 3 | - ``2010-01-02T00:00:00`` - ``2010-01-03T00:00:00`` | +| horizon: 1-days | - ``2010-01-03T00:00:00`` - ``2010-01-04T00:00:00`` | +| exp_class: td | | ++------------------------------------------------+----------------------------------------------------------+ +| .. code-block:: yaml | Two overlapping ``7-days`` time-windows | +| | | +| time_config: | - ``2010-01-01T00:00:00`` - ``2010-01-08T00:00:00`` | +| start_date: 2010-01-01T00:00:00 | - ``2010-01-02T00:00:00`` - ``2020-01-09T00:00:00`` | +| intervals: 2 | | +| horizon: 7-days | | +| offset: 1-day | | +| exp_class: td | | ++------------------------------------------------+----------------------------------------------------------+ + +Alternatively, time windows can be defined explicitly as a **list** of timewindow (which are a **list** of ``datetimes``): + +.. code-block:: yaml + + time_config: + timewindows: + - - 2010-01-01T00:00:00 + - 2011-01-01T00:00:00 + - - 2011-01-01T00:00:00 + - 2012-01-01T00:00:00 + +Spatial and Magnitude Definition +-------------------------------- + +Configuring the spatial and magnitude definitions is done through the ``region_config`` option, followed by an indented block of admissible parameters. Here, we need to define the spatial region (check the `Region `_ concept from **pyCSEP**), the magnitude `bins` (i.e., discretization) and the `depth` extent (used mostly to filter out seismicity outside this range): + +.. list-table:: + :widths: 20 80 + + * - **region** + - The spatial domain where forecasts will be tested. Either a file or a **CSEP** region. + * - **mag_min** + - The minimum magnitude of the experiment. + * - **mag_max** + - The maximum magnitude of the experiment. + * - **mag_bin** + - The size of a magnitude bin. + * - **depth_min** + - The minimum depth (in `km`) of the experiment. + * - **depth_max** + - The maximum depth (in `km`) of the experiment. + + +1. The ``region`` parameter can be defined from: + + + * A **CSEP** region: This correspond to pre-established testing regions for highly seismic areas. This parameter is linked to **pyCSEP** functions, and can be either ``italy_csep_region``, ``nz_csep_region``, ``california_relm_region`` or ``global_region``. + * A `txt` file with the spatial cells collection , where each cell is defined by its origin (e.g., the x (lon) and y (lat) of the lower-left corner). See the **pyCSEP** `documentation `_ on Regions, the class :class:`~csep.core.regions.CartesianGrid2D` and its method :meth:`~csep.core.regions.CartesianGrid2D.from_origins`. For example, for a region consisting of three cells, their origins can be written as: + + .. code-block:: + + 10.0 40.0 + 10.0 40.1 + 10.1 40.0 + +2. Magnitude definition: We need to define a magnitude discretization or `bins`. The parameters **mag_min**, **mag_max**, **mag_bin** allows to create an uniformly distributed set of bins. For example, the command: + + .. code-block:: yaml + + mag_min: 4.0 + mag_max: 5.0 + mag_bin: 0.5 + + would result in two magnitude bins with ranges ``[4.0, 4.5)`` and ``[4.5, 5.0)``. Alternatively, magnitudes can be written explicitly by their bin edges. For example: + + .. code-block:: yaml + + magnitudes: + - 4.0 + - 4.1 + - 4.2 + + resulting in the ``[4.0, 4.1)`` and ``[4.1, 4.2)`` + +3. Depths: The minimum and maximum depths are just required to filter out seismicity outside those ranges. + + +Some example of region configurations would be: + ++------------------------------------------------+---------------------------------------------------------------------+ +| .. code-block:: yaml | - Uses the **CSEP** Italy region, as defined by the function | +| | :func:`~csep.core.regions.italy_csep_region`. | +| region_config: | - Discretizes the magnitude range into 40 bins between 4.0 and 9.0 | +| region: italy_csep_region | - Test the models against `crustal` seismicity above 30 km. | +| mag_min: 5.0 | The -2 is meant in case of shallow events above sea level | +| mag_max: 9.0 | | +| mag_bin: 0.1 | | +| depth_min: -2 | | +| depth_max: 30 | | ++------------------------------------------------+---------------------------------------------------------------------+ +| .. code-block:: yaml | - Loads a file ``region_file.txt`` which contains the cells' | +| | originsof the region. | +| region_config: | - Contains two magnitude bins: ``[6.0, 7.0)``, ``[7.0, 8.0)`` and | +| region: region_file.txt | | +| depth_min: 70 | | +| depth_max: 150 | | +| magnitudes: | | +| - 6.0 | | +| - 7.0 | | +| - 8.0 | | ++------------------------------------------------+---------------------------------------------------------------------+ + + +Seismicity Catalog +------------------ + +The seismicity catalog can be defined with the ``catalog`` parameter. It represents the **main catalog** of the experiment, and will be used to test the forecasts against, or if required, as input catalog for time-dependent models. It can be obtained from: + +* **Authorative data source** + + **floatCSEP** can retrieve the catalog from a seismic network API. The possible options are: + + - ``query_gcmt``: Global Centroid Moment Tensor Catalog (https://www.globalcmt.org/) - via the API of the ISC (https://www.isc.ac.uk/) + - ``query_comcat``: ANSS Comprehensive Earthquake Catalog ComCat (https://earthquake.usgs.gov/data/comcat/) + - ``query_bsi``: Bollettino Sismico Italiano (https://bsi.ingv.it/) + - ``query_gns``: GNS GeoNet New Zealand Catalog (https://www.geonet.org.nz/) + +* **Catalog file in pyCSEP format** + + A file can be used as **main catalog**. It must be in a **pyCSEP** format, namely in the :meth:`~pycsep.utils.readers.csep_ascii` style (see :doc:`pycsep:concepts/catalogs`) or ``.json`` format. The latter is the default catalog used by **floatCSEP**, as it allows the storage of metadata. + + .. note:: + A catalog can be stored as ``.json`` with :meth:`CSEPCatalog.write_json() ` using **pyCSEP**. + +.. important:: + The main catalog will be stored, and consecutively filtered to the extent of each testing time-window, as well as to the experiment's spatial domain, and magnitude- and depth- ranges. diff --git a/docs/guide/model_config.rst b/docs/guide/model_config.rst index 18e29db..b3faccc 100644 --- a/docs/guide/model_config.rst +++ b/docs/guide/model_config.rst @@ -1,3 +1,5 @@ +.. _model_config: + Models Configuration ==================== diff --git a/docs/guide/postprocess_config.rst b/docs/guide/postprocess_config.rst index d682785..ff6c2e3 100644 --- a/docs/guide/postprocess_config.rst +++ b/docs/guide/postprocess_config.rst @@ -1,4 +1,6 @@ -Post-process Options +.. _postprocess: + +Post-Process Options ==================== TBI \ No newline at end of file diff --git a/docs/guide/region_config.rst b/docs/guide/region_config.rst deleted file mode 100644 index add2089..0000000 --- a/docs/guide/region_config.rst +++ /dev/null @@ -1,4 +0,0 @@ -Region Definition -================= - -TBI \ No newline at end of file diff --git a/docs/guide/time_config.rst b/docs/guide/time_config.rst deleted file mode 100644 index a96c689..0000000 --- a/docs/guide/time_config.rst +++ /dev/null @@ -1,4 +0,0 @@ -Temporal Definition -=================== - -TBI \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index fa8007c..8d36a03 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,6 @@ =============================== floatCSEP: Floating Experiments =============================== - *Testing earthquake forecasts made simple.* .. image:: https://img.shields.io/badge/GitHub-Repository-blue?logo=github @@ -76,9 +75,9 @@ The `Collaboratory for the Study of Earthquake Predictability Date: Thu, 26 Sep 2024 14:28:14 +0200 Subject: [PATCH 11/19] docs: completed Model Configuration section, --- docs/guide/experiment_config.rst | 46 ++-- docs/guide/model_config.rst | 388 +++++++++++++++++++++++++++- docs/guide/reproduce_experiment.rst | 6 + docs/guide/run_experiment.rst | 6 + docs/index.rst | 19 +- docs/tutorials/case_h.rst | 2 +- 6 files changed, 440 insertions(+), 27 deletions(-) create mode 100644 docs/guide/reproduce_experiment.rst create mode 100644 docs/guide/run_experiment.rst diff --git a/docs/guide/experiment_config.rst b/docs/guide/experiment_config.rst index a62a3e5..6ade1b7 100644 --- a/docs/guide/experiment_config.rst +++ b/docs/guide/experiment_config.rst @@ -1,16 +1,18 @@ +.. _experiment_config: + Experiment Configuration ======================== -**floatCSEP** provides a standardized workflow for forecasting experiments, whose instructions can be set in a configuration file. Here, we need to define the Experiments' temporal settings, geographic region, seismic catalogs, forecasting models, evaluation tests and post-process. +**floatCSEP** provides a standardized workflow for forecasting experiments, the instructions of which can be set in a configuration file. Here, we need to define the Experiments' temporal settings, geographic region, seismic catalogs, forecasting models, evaluation tests and any post-process options. Configuration Structure ----------------------- -Configuration files are written in ``YAML`` format and is divided into different aspects of the Experiment setup: +Configuration files are written in ``YAML`` format and are divided into different aspects of the experiment setup: -1. **Experiment Metadata**: Experiment's information such as its ``name``, ``authors``, ``doi``, ``URL``, etc. +1. **Metadata**: Experiment's information such as its ``name``, ``authors``, ``doi``, ``URL``, etc. 2. **Temporal Configuration** (``time_config``): Temporal characteristics of the experiment, such as the start and end dates, experiment class (time-independent or time-dependent), the testing intervals, etc. -3. **Spatial and Magnitude Configuration** (``region_config``): Describes testing region, such as its geographic bounds, magnitude ranges, and depth ranges. +3. **Spatial and Magnitude Configuration** (``region_config``): Describes the testing region, such as its geographic bounds, magnitude ranges, and depth ranges. 4. **Seismic Catalog** (``catalog``): Defines the seismicity data source to test the models. It can either link to a seismic network API, or an existing file in the system. 5. **Models** (``models``): Configuration of forecasting models. It can direct to an additional configuration file with ``model_config`` for readability. See :ref:`model_config`. 6. **Evaluation Tests** (``tests``): Configuration of the statistical tests to evaluate the models. It can direct to an additional configuration file with ``test_config`` for readability. See :ref:`evaluation_config`. @@ -18,7 +20,7 @@ Configuration files are written in ``YAML`` format and is divided into different .. note:: - YAML (Yet Another Markup Language) is a human-readable format used for configuration files. It uses **key: value** pairs to define settings, and indentation to represent nested structures. Lists are denoted by hyphens (`-`). + `YAML` (Yet Another Markup Language) is a human-readable format used for configuration files. It uses **key: value** pairs to define settings, and indentation to represent nested structures. Lists are denoted by hyphens (`-`). **Example Basic Configuration** (``config.yml``): @@ -74,7 +76,7 @@ Any non-parsed parameter (e.g., not specified in the documentation) will be stor Temporal Definition ------------------- -Configuring the temporal definition of the experiment is indicated with the ``time_config`` option, followed by an indented block of admissible parameters. The purpose of this configuration section is to set a testing **time-window**, or a sequence of **time-windows**. Each time-window is then defined by ``datetime`` strings representing its lower and upper edges. +Configuring the experiment temporal definition is indicated with the ``time_config`` option, followed by an indented block of admissible parameters. The purpose of this configuration section is to set a testing **time-window**, or a sequence of **time-windows**. Each time-window is defined by two ``datetime`` strings representing its lower and upper edges. Time-windows can be defined from different combination of the following parameters: @@ -86,13 +88,13 @@ Time-windows can be defined from different combination of the following paramete * - **end_date** - The end date of the experiment in UTC and ISO8601 format (``%Y-%m-%dT%H:%M:%S``) * - **intervals** - - An integer amount of testing intervals (time windows). + - An integer amount of testing intervals (time windows). If **horizon** is given, each time-window has a length equal to **horizon**. Else, the range between **start_date** and **end_date** is equally divided into the amount of **intervals**. * - **horizon** - Indicates the time windows `length`. It is written as a number, followed by a hyphen (`-`) and a time unit (``days``, ``weeks``, ``months``, ``years``). e.g.: ``1-days``, ``2.5-years``. - * - **offset** - - Offset between consecutive time-windows. If none given or ``offset=horizon``, time-windows are non-overlapping. It is written as a number, followed by a hyphen (`-`) and a time unit (``days``, ``weeks``, ``months``, ``years``). e.g.: ``1-days``, ``2.5-years``. * - **growth** - How to discretize the time-windows between ``start_date`` and ``end_date``. Options are: **incremental** (The end of a time window matches the beginning of the next) or **cumulative** (All time-windows have a start at the experiment ``start_date``). + * - **offset** + - Offset between consecutive time-windows. If none given or ``offset=horizon``, time-windows are non-overlapping. It is written as a number, followed by a hyphen (`-`) and a time unit (``days``, ``weeks``, ``months``, ``years``). e.g.: ``1-days``, ``2.5-years``. * - **exp_class** - Experiment temporal class. Options are: **ti** (default): Time-Independent; **td**: Time-Dependent. @@ -151,7 +153,7 @@ Some example of parameter combinations: | exp_class: td | | +------------------------------------------------+----------------------------------------------------------+ -Alternatively, time windows can be defined explicitly as a **list** of timewindow (which are a **list** of ``datetimes``): +Alternatively, time windows can be defined explicitly as a **list** of time-windows (each of which is a **list** of ``datetimes``): .. code-block:: yaml @@ -165,7 +167,7 @@ Alternatively, time windows can be defined explicitly as a **list** of timewindo Spatial and Magnitude Definition -------------------------------- -Configuring the spatial and magnitude definitions is done through the ``region_config`` option, followed by an indented block of admissible parameters. Here, we need to define the spatial region (check the `Region `_ concept from **pyCSEP**), the magnitude `bins` (i.e., discretization) and the `depth` extent (used mostly to filter out seismicity outside this range): +Configuring the spatial and magnitude definitions is done through the ``region_config`` option, followed by an indented block of admissible parameters. Here, we need to define the spatial region (check the `Region `_ documentation from **pyCSEP**), the magnitude `bins` (i.e., discretization) and the `depth` extent. .. list-table:: :widths: 20 80 @@ -177,7 +179,7 @@ Configuring the spatial and magnitude definitions is done through the ``region_c * - **mag_max** - The maximum magnitude of the experiment. * - **mag_bin** - - The size of a magnitude bin. + - The size of the magnitude bin. * - **depth_min** - The minimum depth (in `km`) of the experiment. * - **depth_max** @@ -187,8 +189,14 @@ Configuring the spatial and magnitude definitions is done through the ``region_c 1. The ``region`` parameter can be defined from: - * A **CSEP** region: This correspond to pre-established testing regions for highly seismic areas. This parameter is linked to **pyCSEP** functions, and can be either ``italy_csep_region``, ``nz_csep_region``, ``california_relm_region`` or ``global_region``. - * A `txt` file with the spatial cells collection , where each cell is defined by its origin (e.g., the x (lon) and y (lat) of the lower-left corner). See the **pyCSEP** `documentation `_ on Regions, the class :class:`~csep.core.regions.CartesianGrid2D` and its method :meth:`~csep.core.regions.CartesianGrid2D.from_origins`. For example, for a region consisting of three cells, their origins can be written as: + * A **CSEP** region: They correspond to pre-established testing regions for seismic areas. This parameter is linked to **pyCSEP** functions, and can be one of the following values: + + * ``italy_csep_region`` + * ``nz_csep_region`` + * ``california_relm_region`` + * ``global_region``. + + * A text file with the spatial cells collection. Each cell is defined by its origin (e.g., the x (lon) and y (lat) of the lower-left corner). For example, for a region consisting of three cells, their origins can be written as: .. code-block:: @@ -196,6 +204,7 @@ Configuring the spatial and magnitude definitions is done through the ``region_c 10.0 40.1 10.1 40.0 + See the **pyCSEP** `Region documentation `_, the class :class:`~csep.core.regions.CartesianGrid2D` and its method :meth:`~csep.core.regions.CartesianGrid2D.from_origins` for more info. 2. Magnitude definition: We need to define a magnitude discretization or `bins`. The parameters **mag_min**, **mag_max**, **mag_bin** allows to create an uniformly distributed set of bins. For example, the command: .. code-block:: yaml @@ -204,7 +213,7 @@ Configuring the spatial and magnitude definitions is done through the ``region_c mag_max: 5.0 mag_bin: 0.5 - would result in two magnitude bins with ranges ``[4.0, 4.5)`` and ``[4.5, 5.0)``. Alternatively, magnitudes can be written explicitly by their bin edges. For example: + would result in two magnitude bins with ranges ``[4.0, 4.5)`` and ``[4.5, 5.0)``. Alternatively, magnitudes can be written explicitly by their bin `left` edge. For example: .. code-block:: yaml @@ -213,7 +222,8 @@ Configuring the spatial and magnitude definitions is done through the ``region_c - 4.1 - 4.2 - resulting in the ``[4.0, 4.1)`` and ``[4.1, 4.2)`` + resulting in the ``[4.0, 4.1)``, ``[4.1, 4.2)`` and ``[4.2, 4.3)``. + 3. Depths: The minimum and maximum depths are just required to filter out seismicity outside those ranges. @@ -253,8 +263,8 @@ The seismicity catalog can be defined with the ``catalog`` parameter. It represe **floatCSEP** can retrieve the catalog from a seismic network API. The possible options are: - - ``query_gcmt``: Global Centroid Moment Tensor Catalog (https://www.globalcmt.org/) - via the API of the ISC (https://www.isc.ac.uk/) - - ``query_comcat``: ANSS Comprehensive Earthquake Catalog ComCat (https://earthquake.usgs.gov/data/comcat/) + - ``query_gcmt``: Global Centroid Moment Tensor Catalog (https://www.globalcmt.org/), obtained via ISC (https://www.isc.ac.uk/) + - ``query_comcat``: ANSS ComCat (https://earthquake.usgs.gov/data/comcat/) - ``query_bsi``: Bollettino Sismico Italiano (https://bsi.ingv.it/) - ``query_gns``: GNS GeoNet New Zealand Catalog (https://www.geonet.org.nz/) diff --git a/docs/guide/model_config.rst b/docs/guide/model_config.rst index b3faccc..5678855 100644 --- a/docs/guide/model_config.rst +++ b/docs/guide/model_config.rst @@ -1,6 +1,392 @@ .. _model_config: + Models Configuration ==================== -TBI \ No newline at end of file +**floatCSEP** can integrate **source-code** models or just **forecast files**. Depending on the model type, configuration can be as simple as specifying a file path or as complex as defining the computational environment, run commands and model arguments. In the case of source-codes, the **Model Integration** section covers the environment management, executing the model code, and input/output dataflow. + +In the experiment ``config.yml`` file (See :ref:`experiment_config`), the parameter ``model_config`` can point to a **model configuration** file, also in ``YAML`` format, with the generic structure: + +**Example**: + + .. code-block:: yaml + + - MODEL_1 NAME: + parameter_1: value + parameter_2: value + ... + - MODEL_2 NAME: + parameter_1: value + parameter_2: value + ... + ... + +Model names are used to identify models in the system, and spaces are replaced by underscores `_`. + + +Time-Independent Models +----------------------- + +A **Time-Independent** model is usually represented by a single-file forecast, whose statistical description does not change over time. +Thus, the model configuration needs only to point to the **path** of the file relative to the ``model_config`` file. + +**Example**: + +.. code-block:: yaml + + - GEAR: + path: models/gear.xml + forecast_unit: 1 + +``forecast_unit`` represents the time frame upon which the forecast rates are defined (Defaults to 1). In time-independent forecasts, ``forecast_unit`` is in decimal **years**. Forecasts are scaled to the testing time-window if its length is different to the one of the forecast. + + + +Time-Dependent Models +--------------------- + +**Time-Dependent** models are composed by forecasts issued for multiple time windows. These models can be either a **collection** of forecast files or a **source-code** that generate such collection. + + +1. **Forecast Collection**: + + In this case, the ``path`` must point to a model **directory**. To standardize with the directory structure of **source-code** models, forecasts should be contained in a folder named **forecasts** inside the model's ``path``. + + **Example**: + + .. code-block:: yaml + + - ETAS: + path: models/etas + forecast_unit: 3 + n_sims: 10000 + + * Forecasts must be contained in a folder ``models/etas/forecasts``, relative to the ``model_config`` file. + * The ``forecast_unit`` is defined in **days** for Time-Dependent models. + * ``n_sims`` represents the total number of simulations from a catalog-based forecast (usually simulations with no events are not written, so the total amount of catalogs must be explicit). + + .. important:: + + Forecast files are automatically detected. The standard way the model source should name a forecast is : + + .. code-block:: + + {model_name}_{start}_{end}.csv + + where ``start`` and ``end`` follow either the ``%Y-%m-%dT%H:%M:%S`` - ISO8601 format, or the short date version ``%Y-%m-%d`` if the windows are set by UTC midnight. + + See the **pyCSEP** `Documentation `_ to see how forecast files should be written. See the :ref:`model_integration` section for details about how a model source-code should be designed or adapted to be integrated with **floatCSEP** + +1. **Source-Code**: + + **floatCSEP** interacts with a model's source code by (i) creating a running environment, (ii) placing the input data (e.g., training catalog) within the model's directory structure, (iii) executing an specified run command and (iv) retrieving forecasts from the model directory structure. These actions will be detailed in the :ref:`model_integration` section. + + The basic parameters of the configuration are: + + * ``path`` refers to the source-code directory. + * The ``build`` parameter defines the environment type (e.g., ``conda``, ``venv``, or ``docker``) and ensures the model runs in isolation with the necessary dependencies. + * ``func`` is a `shell` command (**entrypoint**) with which the source-code is executed inside the environment. + * The ``forecast_unit`` is defined in **days** for Time-Dependent models. + + **Example**: + + .. code-block:: yaml + + - STEP: + path: models/step + build: docker + func: etas-run + forecast_unit: 1 + +Repository Download +------------------- + +A model file(s) or source code can be accessed from a code or data repository (i.e., `GitHub `_ or `Zenodo `_). + +.. code-block:: yaml + + - etas: + giturl: https://git.gfz-potsdam.de/csep/it_experiment/models/vetas.git + repo_hash: v3.2 + +where ``repo_hash`` refers to a given **release**, **tag** or **branch**. Alternatively, a model can be retrieved from a Zenodo repository by specifying its ID: + +.. code-block:: yaml + + - wheel: + zenodo_id: 6255575 + + + +Configuration Parameters +------------------------ + +Here you can find a comprehensive list of parameters used to configure models + +.. list-table:: + :widths: 20 20 60 + :header-rows: 1 + + * - **Name** + - **Type** + - **Description** + * - **path** (required) + - All + - Path to the model’s (i) **forecast file** for a time-independent class, or (ii) **model's directory** for time-dependent class + * - **build** + - TD + - Specifies the environment type in which the model will be built (e.g., ``conda``, ``venv``, ``docker``). + * - **zenodo_id** + - All + - Zenodo record ID for downloading the model's data. + * - **giturl** + - All + - Git repository URL for the model’s source code. + * - **repo_hash** + - All + - Specifies the commit, branch, or tag to be checked out from the repository. + * - **args_file** (required) + - TD + - Path to the input arguments file for the model, relative to ``path``. In here, the forecast start_date and end_date will be dynamically written before each forecast creation. Defaults to ``input/args.txt``. + * - **func** + - TD + - The command to execute the model (i.e., **entrypoint**) in a terminal. Examples of ``func`` are: ``run``, ``etas-run``, ``python run_script.py``, ``Rscript script.r``. + * - **func_kwargs** (optional) + - TD + - Additional arguments for the model execution, passed via the arguments file. + * - **forecast_unit** (required) + - All + - Specifies the time unit for the forecast. Use **years** for time-independent models and **days** for time-dependent models. + * - **store_db** (optional) + - All + - If the model consists on only files, this is a boolean (true/false) specifying whether to store the forecast in a database (HDF5). + * - **flavours** (optional) + - All + - A set of parameter variations to generate multiple model variants (e.g., different settings for the same model). + * - **prefix** (optional) + - TD + - The prefix used for the model to name its forecast (The default is the Model's name) + * - **input_cat** (optional) + - TD + - Specifies the input catalog path used by the model, relative to the model's ``path``. Defaults to ``input/catalog.csv``. + * - **force_stage** (optional) + - All + - Forces the entire staging of the model (e.g., downloading data, database preparation, environment creation, installation of dependencies and source-code build) + * - **force_build** (optional) + - All + - Forces the build of the model's environment (e.g., creation, dependencies installation and source-code build) + + + +.. _model_integration: + +Model Integration +----------------- + +The integration of external model source-codes into **floatCSEP** requires: + +* Follow (loosely) a directory structure to allow the dataflow (input/output) between the model and **pyCSEP**. +* Define a environment/container manager. +* Provide source-code build instructions. +* Set up an entrypoint (terminal command) to run the model and create a forecast. + +.. note:: + + To integrate a broader range of model classes and code complexities, we opted in **floatCSEP** for a simple interface design rather than specifying a complex model API. Therefore, the integration will have sometimes strict requirements, or customizable options and sometimes undefined aspects. We encourage any feedback from modelers (and hopefully their contributions) through our GitHub, to encompass the majority of model implementations possible. + +Directory Structure +~~~~~~~~~~~~~~~~~~~ + +The repository should contain, at the least, the following structure: + +.. code-block:: none + + model_name/ + ├── /forecasts # Forecast outputs should be stored here (Required) + ├── /input # Input data will be placed here dynamically by **floatCSEP** (Required) + │ ├── {input_catalog} # Input catalog file provided by the testing center + │ └── {args_file} # Contains the input arguments for model execution + ├── /{source} # [optional] Where to store all the source code of the model + │ └── ... + ├── /state # [optional] State files (e.g., data to be persisted throughout consistent simulations) + ├── README.md # [optional] Basic information of the model and instructions to run it. + ├── {run_script} # [optional] Script to generate forecasts. Can be either located here, or in the environment PATH (e.g., a binary entrypoint for python) + ├── Dockerfile # Docker environment setup file + ├── environment.yml # Instructions to build a conda environment. + └── setup.py # Script to build the code with "pip install . ". Can also be `project.toml` or `setup.cfg` + + +* The name of the files ``input_catalog`` (default: `catalog.csv`) and ``args_file`` (default: `args.txt`) can be controlled within ``model_config``. +* It is required (for this integration protocol) that the folders ``input`` and ``forecasts`` exists in the model directory. The latter could be created during the first model run. + +.. important:: + The directory structure should remain unchanged during the experiment run, except for the dynamic modification of the `input/`, `forecasts/` and `state/` contents. All of the source-code file management routines should point to these folders (e.g., routines to read input catalogs, read input arguments, to write forecasts, etc.). + + +Environment Management +~~~~~~~~~~~~~~~~~~~~~~ + +The `build` parameter in the model configuration specifies the environment type (e.g., `conda`, `venv`, `docker`). Models should be defined in an isolated environment to ensure reproducibility and prevent conflicts with system dependencies. + +1. **venv**: A Python virtual environment (`venv`) setup is specified. The source code will be built by running the command ``pip install .`` within the virtual sub-environment (an environment within the one **floatCSEP** is run, but isolated from it), pointing to a ``setup.py``, ``setup.cfg`` or ``project.toml`` (See the `Packaging guide `_) + +2. **conda**: The model sub-environment is managed via a `conda` environment file (``environment.yml``). The model source-code will still be built using ``pip``. + +3. **docker**: A Docker container is created based on a provided `Dockerfile` that contains the instruction to build the source-code within.(`Writing a Dockerfile `_). If python, the model source-code will still be built using ``pip`` inside a virtual environment. + +.. note:: + All the environment names will be handled internally by **floatCSEP**. + +**Example setup.cfg** + + +.. code-block:: cfg + + [metadata] + name = cookie_model + description = Just another model + author = Monster, Cookie + + [options] + packages = + cookie_model + install_requires = + numpy + python_requires = >=3.9 + + [options.entry_points] + console_scripts = + cookie-run = cookie_model.main:run + +This build configuration installs the dependencies (``numpy``), the module ``cookie_model`` (i.e., the ``{source}`` folder) and creates an entrypoint command (see the :ref:`model_execution` section). + + + +**Example Dockerfile** + +.. code-block:: dockerfile + + # Use a specific Python version from a trusted source + FROM python:3.9.20 + + # Set up user and permissions + ARG USERNAME=modeler + ARG USER_UID=1100 + RUN useradd -u $USER_UID -m -s /bin/sh $USERNAME + + # Set work directory + WORKDIR /usr/src/ + + # Copy repository contents to the container + COPY --chown=$USERNAME cookie_model ./cookie_model/ + COPY --chown=$USERNAME setup.cfg ./ + + # Install the Python package and upgrade pip + RUN pip install --no-cache-dir --upgrade pip && pip install . + + # Set the default user + USER $USERNAME + + +This Dockerfile will install the python package inside a container, but the concept can be applied also for other programming languages. The ``func`` parameter will be used identically as done for ``conda`` and ``venv`` options, but now **floatCSEP** will handle the container execution and the entrypoint. + + +.. _model_execution: + +Model Entrypoint +~~~~~~~~~~~~~~~~ + +A model should be executed always with a shell command through a terminal. This provides flexibility to the modeler to abstract their model as convenient. +The **func** parameter in the model configuration defines the shell command used to execute the model. This command is invoked within the environment set up by **floatCSEP**, and will be run from ``model_path`` or the entrypoint defined in the ``Dockerfile``. + +Example ``func`` commands: + +.. code-block:: console + + $ cookie-run + $ python run.py + $ Rscript run.R + $ sh run.sh + +The ``cookie-run`` was a binary python entrypoint defined in the previous **Example setup.cfg**. It allows to execute the command ``cookie-run`` from the terminal, which itself will run the `python` function :func:`cookie_model.main.run` from the file ``cookie_model/main.py``. + +.. note:: + + This entrypoint function should contain the high-level logic of the model workflow (e.g, reading input, parsing arguments, calling core routines, write forecasts, etc.). An example pseudo-code of a model's workflow is: + + .. code-block:: R + + start, end, args = read_input(args_path) + training_catalog = read_catalog(input_cat) + parameters = fit(training_catalog) + forecast = create_forecast(start, end, args, parameters) + write(forecast) + + + +Input/Output Dataflow +~~~~~~~~~~~~~~~~~~~~~ + +The input to run a model will be placed into the ``model_path/input/`` directory dynamically by the testing system before each model execution. The model should be able to read these files from this directory. Similarly, after each model execution, the resulting forecast should be stored in a ``model_path/forecasts/`` directory + +We distinguish **input data** versus **input arguments**. The input data is given to a model without control of the modeler (e.g. authoritative input catalog, region), whereas input arguments (as in *function* arguments) can be the forecast specifications (e.g. time-window, target magnitudes) or hyper-parameters (e.g. declustering algorithm, optimization time-windows, cutoff magnitude) that control the model. + + +1. **Input Arguments**: The input arguments are the forecast specifications (e.g. time-window, target magnitudes) and hyper-parameters (e.g. declustering algorithm, optimization time-windows, cutoff magnitude) that will control the model. The input arguments will be written in the ``args_file`` (default ``args.txt``) always located in the input folder. A model requires at minimum one set of modifiable arguments: ``start_date`` and ``end_date`` (in ISO8601), but it is possible to include additional arguments. + + Example content of ``args.txt``: + + .. code-block:: yaml + + start_date: 2023-01-01T00:00:00 + end_date: 2023-01-02T00:00:00 + seed: 23 + nsims: 1000 + + Therefore, the model source-code should be at least able to dynamically read the obligatory arguments (simply the time window of the issued forecast) + +2. **Input Data**: Correspond to any data source outside the control of the modeler (e.g., authoritative input catalog, testing region). For now, **floatCSEP** just handles an input **catalog**, which are all the events within the **main catalog** until the forecast **start_date**. The catalog is written by default in ``model_path/input/catalog.csv`` in the CSEP ascii format (see :doc:`pycsep:concepts/catalogs`) as: + + .. code-block:: none + + longitude, latitude, magnitude, time_string, depth, event_id + + - **longitude**: Decimal degrees of the forecasted event location. + - **latitude**: Decimal degrees of the forecasted event location. + - **magnitude**: Magnitude of the forecasted event. + - **time_string**: Timestamp in UTC following the ISO8601 format (`%Y-%m-%dT%H:%M:%S`). + - **depth**: Depth of the event in kilometers. + - **event_id**: The event ID in case is necessary to map the event to an additional table. + + +3. **Output Forecasts**: After execution, forecast files should be written to the `forecasts/` folder. The forecast output must follow the filename convention: + + .. code-block:: none + + {model_name}_{start-date}_{end-date}.csv + + ``model_name`` can be replaced in the model configuration with the parameter ``prefix``, such that: + + .. code-block:: none + + {prefix}_{start-date}_{end-date}.csv + + + This ensures that forecast files are easily identified and retrieved by **floatCSEP** for further evaluation. + + + .. important:: + + The forecast files should adhere to the **pyCSEP** format. In summary, each forecast file should be a ``.csv`` file containing rows for each forecasted event, whose columns are: + + .. code-block:: none + + longitude, latitude, magnitude, time_string, depth, catalog_id, event_id + + where catalog_id represents the a single simulation of the stochastic catalog collection. This format ensures compatibility with the **pyCSEP** testing framework (See the `Catalog-based forecasts `_ documentation for further information). + + + + + diff --git a/docs/guide/reproduce_experiment.rst b/docs/guide/reproduce_experiment.rst new file mode 100644 index 0000000..a194d0c --- /dev/null +++ b/docs/guide/reproduce_experiment.rst @@ -0,0 +1,6 @@ +.. _reproduce: + +Reproducing an Experiment +========================= + +TBI \ No newline at end of file diff --git a/docs/guide/run_experiment.rst b/docs/guide/run_experiment.rst new file mode 100644 index 0000000..6b5a655 --- /dev/null +++ b/docs/guide/run_experiment.rst @@ -0,0 +1,6 @@ +.. _running: + +Running an Experiment +===================== + +TBI \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 8d36a03..4d77725 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ =============================== floatCSEP: Floating Experiments =============================== -*Testing earthquake forecasts made simple.* +*Earthquake forecasting experiments made simple.* .. image:: https://img.shields.io/badge/GitHub-Repository-blue?logo=github :target: https://github.com/cseptesting/floatcsep @@ -152,12 +152,6 @@ Collaborators tutorials/case_g.rst tutorials/case_h.rst -.. toctree:: - :hidden: - :maxdepth: 0 - :caption: Help & Reference - - reference/api_reference .. toctree:: :maxdepth: 2 @@ -168,6 +162,17 @@ Collaborators guide/model_config.rst guide/evaluation_config.rst guide/postprocess_config.rst + guide/run_experiment.rst + guide/reproduce_experiment.rst + + +.. toctree:: + :hidden: + :maxdepth: 0 + :caption: Help & Reference + + reference/api_reference + .. toctree:: :hidden: diff --git a/docs/tutorials/case_h.rst b/docs/tutorials/case_h.rst index c9e6637..667c083 100644 --- a/docs/tutorials/case_h.rst +++ b/docs/tutorials/case_h.rst @@ -1,6 +1,6 @@ .. _case_h: -H - A time-dependent experiment +H - A Time-Dependent Experiment =============================== Here, we run an experiment that access, containerize and execute multiple **time-dependent models**, and then proceeds to evaluate the forecasts once they are created. From 1a4d0d39e6033f20010adfcbfbbae64ca5cc13ed Mon Sep 17 00:00:00 2001 From: pciturri Date: Thu, 26 Sep 2024 20:37:07 +0200 Subject: [PATCH 12/19] docs: started the evaluation config documentation. Wrote parameters for gridded-type forecasts. --- docs/guide/evaluation_config.rst | 93 +++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/docs/guide/evaluation_config.rst b/docs/guide/evaluation_config.rst index e4939be..f17c6e8 100644 --- a/docs/guide/evaluation_config.rst +++ b/docs/guide/evaluation_config.rst @@ -3,4 +3,95 @@ Evaluations Definition ====================== -TBI \ No newline at end of file +**floatCSEP** evaluate forecasts using the testing procedures from **pyCSEP** (See `Testing Theory `_). Depending on the forecast type (e.g., **GriddedForecasts** or **CatalogForecasts**), different evaluation functions can be used. T + +Each evaluation specifies a `func` parameter, representing the evaluation function to be applied, and a `plot_func` parameter for visualizing the results. + +Evaluations for **GriddedForecasts** typically use functions from :mod:`csep.core.poisson_evaluations` or :mod:`csep.core.binomial_evaluations`, while evaluations for **CatalogForecasts** use functions from :mod:`csep.core.catalog_evaluations`. + +The structure of the evaluation configuration file is similar to the model configuration, with multiple tests, each pointing to a specific evaluation function and plotting method. + +**Example Configuration**: + +.. code-block:: yaml + + - N-test: + func: poisson_evaluations.number_test + plot_func: plot_poisson_consistency_test + - S-test: + func: poisson_evaluations.spatial_test + plot_func: plot_poisson_consistency_test + plot_kwargs: + one_sided_lower: True + - T-test: + func: poisson_evaluations.paired_t_test + ref_model: Model A + plot_func: plot_comparison_test + + +Evaluation Parameters: +---------------------- + +.. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Parameter** + - **Description** + * - **func** (required) + - The evaluation function, specifying which test to run. Must be an available function from the pyCSEP evaluation suite (e.g., `poisson_evaluations.number_test`). + * - **plot_func** (required) + - The function to plot the evaluation results, specified from the available plotting functions (e.g., `plot_poisson_consistency_test`). + * - **plot_args** + - Arguments passed to customize plot titles, labels, or font size. + * - **plot_kwargs** + - Keyword arguments passed to the plotting function for fine-tuning plot appearance (e.g., `one_sided_lower: True`). + * - **ref_model** + - A reference model against which the current model is compared in comparative tests (e.g., `Model A`). + * - **markdown** + - A description of the test to be used as caption when reporting results + + +Evaluations Functions: +---------------------- + +Depending on the type of forecast being evaluated, different evaluation functions are used: + +1. **GriddedForecasts**: + +.. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Function** + - **Description** + * - **poisson_evaluations.number_test** + - Evaluates the forecast by comparing the total number of forecasted events with the observed events using a Poisson distribution. + * - **poisson_evaluations.spatial_test** + - Compares the spatial distribution of forecasted events to the observed events. + * - **poisson_evaluations.magnitude_test** + - Evaluates the forecast by comparing the magnitude distribution of forecasted events with observed events. + * - **poisson_evaluations.conditional_likelihood_test** + - Tests the likelihood of observed events given the forecasted rates, conditioned on the total earthquake occurrences. + * - **poisson_evaluations.paired_t_test** + - Calculate the information gain between one forecast to a reference (``ref_model``), and test a significant difference by using a paired T-test. + * - **binomial_evaluations.binary_spatial_test** + - Binary spatial test to compare forecasted and observed event distributions. + * - **binomial_evaluations.binary_likelihood_test** + - Likelihood test likelihood of observed events given the forecasted rates, assuming a Binary distribution + * - **binomial_evaluations.negative_binomial_number_test** + - Evaluates the number of events using a negative binomial distribution, comparing observed and forecasted event counts. + * - **brier_score** + - Uses a quadratic metric rather than logarithmic. Does not penalize false-negatives as much as log-likelihood metrics + * - **vector_poisson_t_w_test** + - Carries out the paired_t_test and w_test for a single forecast compared to multiple. + * - **sequential_likelihood** + - Obtain the distribution of log-likelihoods in time. + * - **sequential_information_gain** + - Obtain the distribution of information gain in time, compared to a ``ref_model``. + + +2. **CatalogForecasts**: + + + From d387cd3a9a03efb9ce7f43c89e0eac0b6d9cc0e2 Mon Sep 17 00:00:00 2001 From: pciturri Date: Sat, 28 Sep 2024 16:49:31 +0200 Subject: [PATCH 13/19] docs: Finished the evaluation config docs. Added .js to custom behavior of external links (now open in a new tab). Added sphinx-design for expandable tables. --- docs/_static/custom.js | 31 +++++ docs/conf.py | 5 + docs/guide/evaluation_config.rst | 198 ++++++++++++++++++++++--------- docs/guide/experiment_config.rst | 3 +- docs/guide/model_config.rst | 1 + docs/tutorials/case_a.rst | 2 +- docs/tutorials/case_c.rst | 4 +- tutorials/case_f/tests.yml | 19 ++- tutorials/case_g/tests.yml | 13 +- 9 files changed, 201 insertions(+), 75 deletions(-) create mode 100644 docs/_static/custom.js diff --git a/docs/_static/custom.js b/docs/_static/custom.js new file mode 100644 index 0000000..9def49d --- /dev/null +++ b/docs/_static/custom.js @@ -0,0 +1,31 @@ +/** + * custom.js + * + * This script contains custom JavaScript modifications for the Sphinx documentation. + * It can be expanded to include additional customizations related to behavior, + * style, and functionality of the generated documentation. + * + * + * Usage: + * - Place this script in the _static directory of your Sphinx project. + * - Include it in the html_js_files configuration in conf.py to load it automatically. + * - Expand this file with other JavaScript customizations as needed. + * + * Author: Pablo Iturrieta + * Date: 28.09.2024 + */ + +document.addEventListener("DOMContentLoaded", function () { +// - Ensures that all external links open in a new tab by adding the target="_blank" +// attribute to all links with the 'external' class (automatically applied by Sphinx). +// - Adds rel="noopener noreferrer" for security purposes, ensuring the new page +// does not have access to the originating window context (prevents security risks). + // Select all external links in the documentation + const links = document.querySelectorAll('a.external'); + + // Loop through all the links and set them to open in a new tab + links.forEach(function (link) { + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); + }); +}); diff --git a/docs/conf.py b/docs/conf.py index 32e462c..8b7cac7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,6 +30,7 @@ "sphinx.ext.napoleon", "sphinx.ext.intersphinx", "sphinx_copybutton", + "sphinx_design", ] # language = 'en' @@ -66,6 +67,10 @@ "logo_only": True, } html_logo = "_static/floatcsep_logo.svg" +html_js_files = [ + "custom.js", +] + todo_include_todos = False copybutton_prompt_text = "$ " # Text to ignore when copying (for shell commands) diff --git a/docs/guide/evaluation_config.rst b/docs/guide/evaluation_config.rst index f17c6e8..89058f3 100644 --- a/docs/guide/evaluation_config.rst +++ b/docs/guide/evaluation_config.rst @@ -3,21 +3,20 @@ Evaluations Definition ====================== -**floatCSEP** evaluate forecasts using the testing procedures from **pyCSEP** (See `Testing Theory `_). Depending on the forecast type (e.g., **GriddedForecasts** or **CatalogForecasts**), different evaluation functions can be used. T +**floatCSEP** evaluate forecasts using the routines defined in **pyCSEP** (See `Testing Theory `_). Depending on the forecast types (e.g., **GriddedForecasts** or **CatalogForecasts**), different evaluation functions can be used. -Each evaluation specifies a `func` parameter, representing the evaluation function to be applied, and a `plot_func` parameter for visualizing the results. +Each evaluation specifies a ``func`` parameter, representing the evaluation function to be applied, a configuration of the function with ``func_kwargs`` (e.g., number of simulations, confidence intervals) and a ``plot_func`` parameter for visualizing the results. Evaluations for **GriddedForecasts** typically use functions from :mod:`csep.core.poisson_evaluations` or :mod:`csep.core.binomial_evaluations`, while evaluations for **CatalogForecasts** use functions from :mod:`csep.core.catalog_evaluations`. -Evaluations for **GriddedForecasts** typically use functions from :mod:`csep.core.poisson_evaluations` or :mod:`csep.core.binomial_evaluations`, while evaluations for **CatalogForecasts** use functions from :mod:`csep.core.catalog_evaluations`. +.. important:: + + An evaluation in ``test_config`` points to a **pyCSEP** `evaluation function `_, valid for the forecast class. -The structure of the evaluation configuration file is similar to the model configuration, with multiple tests, each pointing to a specific evaluation function and plotting method. **Example Configuration**: .. code-block:: yaml + :caption: test_config.yml - - N-test: - func: poisson_evaluations.number_test - plot_func: plot_poisson_consistency_test - S-test: func: poisson_evaluations.spatial_test plot_func: plot_poisson_consistency_test @@ -32,66 +31,157 @@ The structure of the evaluation configuration file is similar to the model confi Evaluation Parameters: ---------------------- +Each evaluation listed in ``test_config`` accepts the following parameters: + .. list-table:: - :widths: 20 80 + :widths: 30 80 :header-rows: 1 * - **Parameter** - **Description** * - **func** (required) - - The evaluation function, specifying which test to run. Must be an available function from the pyCSEP evaluation suite (e.g., `poisson_evaluations.number_test`). + - Specify which evaluation/test function to run. Must be a **pyCSEP** ``{module}.{function}`` suite \ + (e.g., :func:`poisson_evaluations.number_test `) or + **floatCSEP** function. + * - **func_kwargs** + - Any keyword argument to control the specific **func**. For example, :func:`poisson_evaluations.spatial_test ` may be configured with ``num_simulations: 2000``. * - **plot_func** (required) - - The function to plot the evaluation results, specified from the available plotting functions (e.g., `plot_poisson_consistency_test`). + - The function to plot the evaluation results, from either the :mod:`csep.utils.plots` module (e.g., :func:`plot_poisson_consistency_test `) or **floatCSEP** :mod:`~floatcsep.utils.helpers` module. * - **plot_args** - - Arguments passed to customize plot titles, labels, or font size. + - Arguments passed to customize the plot function. Can be titles, labels, colors, font size, etc. Review the documentation of the respective function. * - **plot_kwargs** - - Keyword arguments passed to the plotting function for fine-tuning plot appearance (e.g., `one_sided_lower: True`). + - Keyword arguments to customize the plot function. Review the documentation of the respective function. * - **ref_model** - A reference model against which the current model is compared in comparative tests (e.g., `Model A`). * - **markdown** - A description of the test to be used as caption when reporting results -Evaluations Functions: ----------------------- - -Depending on the type of forecast being evaluated, different evaluation functions are used: - -1. **GriddedForecasts**: - -.. list-table:: - :widths: 20 80 - :header-rows: 1 - - * - **Function** - - **Description** - * - **poisson_evaluations.number_test** - - Evaluates the forecast by comparing the total number of forecasted events with the observed events using a Poisson distribution. - * - **poisson_evaluations.spatial_test** - - Compares the spatial distribution of forecasted events to the observed events. - * - **poisson_evaluations.magnitude_test** - - Evaluates the forecast by comparing the magnitude distribution of forecasted events with observed events. - * - **poisson_evaluations.conditional_likelihood_test** - - Tests the likelihood of observed events given the forecasted rates, conditioned on the total earthquake occurrences. - * - **poisson_evaluations.paired_t_test** - - Calculate the information gain between one forecast to a reference (``ref_model``), and test a significant difference by using a paired T-test. - * - **binomial_evaluations.binary_spatial_test** - - Binary spatial test to compare forecasted and observed event distributions. - * - **binomial_evaluations.binary_likelihood_test** - - Likelihood test likelihood of observed events given the forecasted rates, assuming a Binary distribution - * - **binomial_evaluations.negative_binomial_number_test** - - Evaluates the number of events using a negative binomial distribution, comparing observed and forecasted event counts. - * - **brier_score** - - Uses a quadratic metric rather than logarithmic. Does not penalize false-negatives as much as log-likelihood metrics - * - **vector_poisson_t_w_test** - - Carries out the paired_t_test and w_test for a single forecast compared to multiple. - * - **sequential_likelihood** - - Obtain the distribution of log-likelihoods in time. - * - **sequential_information_gain** - - Obtain the distribution of information gain in time, compared to a ``ref_model``. - - -2. **CatalogForecasts**: - - +Evaluations Functions +--------------------- + +**floatCSEP** supports the following evaluations: + + +.. dropdown:: **Evaluations for GriddedForecasts** + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Function** + - **Evaluates:** + * - :func:`poisson_evaluations.number_test ` + - the total number of forecasted events compared to the observed events using a Poisson distribution. + * - :func:`poisson_evaluations.spatial_test ` + - the forecasted spatial distribution relative to the observed events using a Poisson distribution. + * - :func:`poisson_evaluations.magnitude_test ` + - the forecasted magnitude distribution relative to the observed events using a Poisson distribution. + * - :func:`poisson_evaluations.conditional_likelihood_test ` + - the likelihood of the observed events given the forecasted rates, conditioned on the total earthquake occurrences, assuming a Poisson distribution. + * - :func:`poisson_evaluations.paired_t_test ` + - the information gain between one forecast to a reference (``ref_model``), and test for a significant difference by using a paired T-test. + * - :func:`binomial_evaluations.binary_spatial_test ` + - the forecasted spatial distribution relative to the observed events, assuming a Binary/Bernoulli process. + * - :func:`binomial_evaluations.binary_likelihood_test ` + - the likelihood of the observed events given the forecasted rates, assuming a Binary distribution. + * - :func:`binomial_evaluations.negative_binomial_number_test ` + - the total number of forecasted events compared to the observed events using a Negative Binomial distribution. + * - :func:`brier_score ` + - the forecast skill using a quadratic metric rather than logarithmic. Does not penalize false-negatives as much as log-likelihood metrics. + * - :func:`vector_poisson_t_w_test ` + - a forecast skill compared to multiple forecasts, by carrying out the paired_t_test and w_test jointly. + * - :func:`sequential_likelihood ` + - the temporal evolution of log-likelihoods scores. + * - :func:`sequential_information_gain ` + - the temporal evolution of the information gain in time, compared to a ``ref_model``. + + + +.. dropdown:: **Evaluations for CatalogForecasts** + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Function** + - **Evaluates:** + * - :func:`catalog_evaluations.number_test ` + - the total number of forecasted events compared to observed events in an earthquake catalog. + * - :func:`catalog_evaluations.spatial_test ` + - the spatial distribution of forecasted vs. observed earthquake events in an earthquake catalog. + * - :func:`catalog_evaluations.magnitude_test ` + - the magnitude distribution of forecasted events to those observed in the earthquake catalog. + * - :func:`catalog_evaluations.pseudolikelihood_test ` + - the pseudolikelihood of the observed events, given the forecasted synthetic catalogs + * - :func:`catalog_evaluations.calibration_test ` + - the consistency of multiple test-quantiles in time with the expected uniform distribution using a Kolmogorov-Smirnov test. + +.. note:: + + Check each function's `docstring` to see which ``func_kwargs`` are compatible with it. + +Plotting Functions +------------------ + +**floatCSEP** supports the following: + +.. dropdown:: Plotting functions + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Plotting function** + - **Compatible with:** + * - :obj:`~csep.utils.plots.plot_poisson_consistency_test` + - :func:`poisson_evaluations.number_test `, :func:`poisson_evaluations.spatial_test `, :func:`poisson_evaluations.magnitude_test `, :func:`poisson_evaluations.conditional_likelihood_test `. + * - :obj:`~csep.utils.plots.plot_consistency_test` + - :func:`binomial_evaluations.negative_binomial_number_test `, :func:`binomial_evaluations.binary_likelihood_test `, :func:`binomial_evaluations.binary_spatial_test `, :func:`brier_score `, :func:`catalog_evaluations.number_test `, :func:`catalog_evaluations.magnitude_test `, :func:`catalog_evaluations.spatial_test `, :func:`catalog_evaluations.pseudolikelihood_test ` + * - :obj:`~csep.utils.plots.plot_comparison_test` + - :func:`poisson_evaluations.paired_t_test ` + * - :obj:`~csep.utils.plots.plot_number_test` + - :func:`catalog_evaluations.number_test ` + * - :obj:`~csep.utils.plots.plot_magnitude_test` + - :func:`catalog_evaluations.magnitude_test ` + * - :obj:`~csep.utils.plots.plot_spatial_test` + - :func:`catalog_evaluations.spatial_test ` + * - :obj:`~csep.utils.plots.plot_likelihood_test` + - :func:`catalog_evaluations.pseudolikelihood_test ` + * - :obj:`~csep.utils.plots.plot_calibration_test` + - :func:`catalog_evaluations.calibration_test ` + * - :obj:`~floatcsep.utils.helpers.plot_sequential_likelihood>` + - :func:`sequential_likelihood `, :func:`sequential_information_gain ` + * - :obj:`~floatcsep.utils.helpers.plot_matrix_comparative_test` + - :func:`vector_poisson_t_w_test ` + +.. note:: + + Check each plot functions's `docstring` to see which ``plot_args`` and ``plot_kwargs`` are compatible with it. + + + +It is also possible to assign two or more plotting functions to a test, the ``plot_args`` and ``plot_kwargs`` of which can be placed as dictionaries indented beneath the functions: + +**Example**: +.. code-block:: yaml + :caption: test_config.yml + + - Number Test: + func: catalog_evaluations.number_test + plot_func: + - plot_number_test: + plot_args: + title: Number test distribution + - plot_consistency_test: + plot_args: + linewidth: 2 + plot_kwargs: + one_sided_lower: True diff --git a/docs/guide/experiment_config.rst b/docs/guide/experiment_config.rst index 6ade1b7..a5c513a 100644 --- a/docs/guide/experiment_config.rst +++ b/docs/guide/experiment_config.rst @@ -23,9 +23,10 @@ Configuration files are written in ``YAML`` format and are divided into differen `YAML` (Yet Another Markup Language) is a human-readable format used for configuration files. It uses **key: value** pairs to define settings, and indentation to represent nested structures. Lists are denoted by hyphens (`-`). -**Example Basic Configuration** (``config.yml``): +**Example Basic Configuration**: .. code-block:: yaml + :caption: config.yml name: CSEP Experiment time_config: diff --git a/docs/guide/model_config.rst b/docs/guide/model_config.rst index 5678855..fe47848 100644 --- a/docs/guide/model_config.rst +++ b/docs/guide/model_config.rst @@ -11,6 +11,7 @@ In the experiment ``config.yml`` file (See :ref:`experiment_config`), the parame **Example**: .. code-block:: yaml + :caption: model_config.yml - MODEL_1 NAME: parameter_1: value diff --git a/docs/tutorials/case_a.rst b/docs/tutorials/case_a.rst index 45dd200..a69c15b 100644 --- a/docs/tutorials/case_a.rst +++ b/docs/tutorials/case_a.rst @@ -116,7 +116,7 @@ Models Evaluations ~~~~~~~~~~~ - The experiment's evaluations are defined in the ``tests`` inset. It should be a list of test names, making reference to their function and plotting function. These can be either defined in ``pycsep`` (see :doc:`pycsep:concepts/evaluations`) or manually. In this example, we employ the consistency N-test: its function is :func:`csep.core.poisson_evaluations.number_test`, whereas its plotting function correspond to :func:`csep.utils.plots.plot_poisson_consistency_test` + The experiment's evaluations are defined in the ``tests`` inset. It should be a list of test names making reference to their function and plotting function. These can be either from **pyCSEP** (see :doc:`pycsep:concepts/evaluations`) or defined manually. Here, we use the Poisson consistency N-test: its function is :func:`poisson_evaluations.number_test ` with a plotting function :func:`plot_poisson_consistency_test ` .. literalinclude:: ../../tutorials/case_a/config.yml :caption: tutorials/case_a/config.yml diff --git a/docs/tutorials/case_c.rst b/docs/tutorials/case_c.rst index d6b74d2..a27f771 100644 --- a/docs/tutorials/case_c.rst +++ b/docs/tutorials/case_c.rst @@ -64,7 +64,7 @@ Time Evaluations ~~~~~~~~~~~ - The experiment's evaluations are defined in ``tests.yml``, which can now include temporal evaluations (see :func:`~floatcsep.utils.helpers.sequential_likelihood`, :func:`~floatcsep.utils.helpers.sequential_information_gain`, :func:`~floatcsep.utils.helpers.plot_sequential_likelihood`). + The experiment's evaluations are defined in ``tests.yml``, which can now include temporal evaluations (see :obj:`~floatcsep.utils.helpers.sequential_likelihood`, :obj:`~floatcsep.utils.helpers.sequential_information_gain`, :obj:`~floatcsep.utils.helpers.plot_sequential_likelihood`). .. literalinclude:: ../../tutorials/case_c/tests.yml :language: yaml @@ -77,7 +77,7 @@ Evaluations Results ------- -The :obj:`~floatcsep.cmd.main.run` command +The :obj:`~floatcsep.commands.main.run` command .. code-block:: console diff --git a/tutorials/case_f/tests.yml b/tutorials/case_f/tests.yml index 7966964..e2bf37a 100644 --- a/tutorials/case_f/tests.yml +++ b/tutorials/case_f/tests.yml @@ -1,19 +1,18 @@ - Catalog_N-test: func: catalog_evaluations.number_test plot_func: - - plot_number_test: - plot_args: - title: 1 - name: 1 - - plot_consistency_test: - plot_kwargs: - one_sided_lower: True + - plot_number_test: + plot_args: + title: Test distribution + - plot_consistency_test: + plot_kwargs: + one_sided_lower: True - Catalog_S-test: func: catalog_evaluations.spatial_test plot_func: - - plot_consistency_test: - plot_kwargs: - one_sided_lower: True + - plot_consistency_test: + plot_kwargs: + one_sided_lower: True diff --git a/tutorials/case_g/tests.yml b/tutorials/case_g/tests.yml index 67315da..445ed39 100644 --- a/tutorials/case_g/tests.yml +++ b/tutorials/case_g/tests.yml @@ -1,13 +1,12 @@ - Catalog_N-test: func: catalog_evaluations.number_test plot_func: - - plot_number_test: - plot_args: - title: 1 - name: 1 - - plot_consistency_test: - plot_kwargs: - one_sided_lower: True + - plot_number_test: + plot_args: + title: Test distribution + - plot_consistency_test: + plot_kwargs: + one_sided_lower: True From 869218dc0bfa84f7f49a3a72dcca14d95d962c38 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 30 Sep 2024 04:42:33 +0200 Subject: [PATCH 14/19] docs: added postprocess documentation. fixed link to experimental concepts. ft: added simple method get_test to experiment class for users to quickly access an evaluation by its name. docs: added postprocess documentation. fixed link to experimental concepts. ft: added simple method get_test to experiment class for users to quickly access an evaluation by its name --- docs/guide/postprocess_config.rst | 495 +++++++++++++++++++++++++++++- docs/index.rst | 1 + floatcsep/evaluation.py | 2 +- floatcsep/experiment.py | 15 +- 4 files changed, 508 insertions(+), 5 deletions(-) diff --git a/docs/guide/postprocess_config.rst b/docs/guide/postprocess_config.rst index ff6c2e3..9c3a325 100644 --- a/docs/guide/postprocess_config.rst +++ b/docs/guide/postprocess_config.rst @@ -3,4 +3,497 @@ Post-Process Options ==================== -TBI \ No newline at end of file +The ``postprocess`` inset can be used within an experiment configuration file to configure the **plotting** and **reporting** functions to be performed after the experiment calculations have been completed. The plotting functions provide a graphic representation of the catalogs, forecasts and evaluation results, whereas the reporting functions assemble these into a human-readable report. + +**Example postprocess configuration**: + +.. code-block:: yaml + :caption: config.yml + :emphasize-lines: 8- + + name: experiment + time_config: ... + region_config: ... + catalog: ... + model_config: ... + test_config: ... + + postprocess: + plot_forecasts: + colormap: magma + basemap: ESRI_terrain + catalog: True + + plot_catalog: + basemap: google-satellite + mag_ticks: [5, 6, 7, 8] + markersize: 7 + + +.. important:: + + By default, **floatCSEP** plots the testing catalogs, forecasts and results, summarizing them into a **Markdown** report. The postprocess configuration aids to customize these options, or to extend them by using custom python scripts. + +Plot Forecasts +-------------- + +**floatCSEP** can quickly plot the spatial rates of used and/or created forecasts. The ``plot_forecast`` command wraps the functionality of the **pyCSEP** function :func:`~csep.utils.plots.plot_spatial_dataset`, used to plot mean rates (in ``log10``) of both :class:`~csep.core.forecasts.GriddedForecast` and :class:`~csep.core.forecasts.CatalogForecast`. +Most arguments of ``plot_forecast`` mimics those of :func:`~csep.utils.plots.plot_spatial_dataset` with some extra additions. These are summarized here: + +.. dropdown:: Forecast plotting arguments + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Arguments** + - **Description** + * - ``all_time_windows`` + - Whether all testing time windows are plotted (true or false). By default, only the last time window is plotted. + * - ``figsize`` + - List with the figure proportions. Default is `[6.4, 4.8]` + * - ``title`` + - Title for the plot. Default is None + * - ``title_size`` + - Size of the title text. Default is 10 + * - ``projection`` + - Projection for the map. Default ``cartopy.crs.PlateCarree`` Example: + + .. code-block:: yaml + + plot_forecasts: + projection: Mercator + + or if the projection contains keyword arguments: + + .. code-block:: yaml + + plot_forecasts: + projection: + Mercator: + central_longitude: 50 + + * - ``grid`` + - Whether to show grid lines. Default is True + * - ``grid_labels`` + - Whether to show grid labels. Default is True + * - ``grid_fontsize`` + - Font size for grid labels. Default is 10.0 + * - ``basemap`` + - Basemap option. Possible values are: ``stock_img``, ``google-satellite``, ``ESRI_terrain``, ``ESRI_imagery``, ``ESRI_relief``, ``ESRI_topo``, ``ESRI_terrain``, or a webservice URL. Default is None + * - ``coastline`` + - Flag to plot coastline. Default is True + * - ``borders`` + - Flag to plot country borders. Default is False + * - ``region_border`` + - Flag to plot the forecast region border. Default is True + * - ``tile_scaling`` + - Zoom level (1-12) for basemap tiles or ``auto`` for automatic scaling + * - ``linewidth`` + - Line width of borders and coastlines. Default is 1.5 + * - ``linecolor`` + - Color of borders and coastlines. Default is ``black`` + * - ``cmap`` + - Color map for the plot. Default is ``viridis`` + * - ``clim`` + - Range of the colorbar, in ``log10`` values. Example: ``[-5, 0]`` + * - ``clabel`` + - Label for the colorbar. Default is None + * - ``clabel_fontsize`` + - Font size for the colorbar label. Default is None + * - ``cticks_fontsize`` + - Font size for the colorbar ticks. Default is None + * - ``alpha`` + - Transparency level. Default is 1 + * - ``alpha_exp`` + - Exponent for the alpha function, recommended between 0.4 and 1. Default is 0 + * - ``catalog`` + - Plots the testing catalog on top of the forecast, corresponding to the forecast time window. + + .. code-block:: yaml + + plot_forecasts: + catalog: True + + and if the catalog needs to be customized: + + .. code-block:: yaml + + plot_forecasts: + catalog: + legend_loc: 1 + legend_fontsize: 14 + markercolor: blue + + See :ref:`plot_catalogs` for customization options. + + +.. important:: + + By default, only the forecast corresponding to the last time window of a model is plotted. To plot all time windows, use ``all_time_windows: True`` + + +.. _plot_catalogs: + +Plot Catalogs +------------- + +Test catalogs are automatically plotted when **floatCSEP** calculations are finished. Similar to plotting the forecasts, the ``plot_catalog`` command wraps the functionality of the **pyCSEP** function :func:`~csep.utils.plots.plot_catalog`. + + + +.. dropdown:: Catalog Plotting Arguments + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Arguments** + - **Description** + * - ``all_time_windows`` + - If along the main testing catalogs, all sub-testing catalogs from all the time windows are plotted (true or false). Default is False. + * - ``figsize`` + - List or tuple with the figure proportions. Default is [6.4, 4.8]. + * - ``title`` + - Title for the plot. Default is the catalog name. + * - ``title_size`` + - Size of the title text. Default is 10. + * - ``filename`` + - File name to save the figure. Default is None. + * - ``projection`` + - Projection for the map. Default ``cartopy.crs.PlateCarree`` Example: + + .. code-block:: yaml + + plot_forecasts: + projection: Mercator + + or if the projection contains keyword arguments: + + .. code-block:: yaml + + plot_forecasts: + projection: + Mercator: + central_longitude: 50 + + * - ``basemap`` + - Basemap option. Possible values are: ``stock_img``, ``google-satellite``, ``ESRI_terrain``, ``ESRI_imagery``, ``ESRI_relief``, ``ESRI_topo``, ``ESRI_terrain``, or a webservice URL. Default is None + * - ``coastline`` + - Flag to plot coastline. Default is True. + * - ``grid`` + - Whether to display grid lines. Default is True. + * - ``grid_labels`` + - Whether to display grid labels. Default is True. + * - ``grid_fontsize`` + - Font size for grid labels. Default is 10.0. + * - ``marker`` + - Marker type for plotting earthquakes. + * - ``markersize`` + - Constant size for all earthquakes. + * - ``markercolor`` + - Color for all earthquakes. Default is ``blue``. + * - ``borders`` + - Flag to plot country borders. Default is False. + * - ``region_border`` + - Flag to plot the catalog region border. Default is True. + * - ``alpha`` + - Transparency level for the earthquake scatter. Default is 1. + * - ``mag_scale`` + - Scaling factor for the scatter plot based on earthquake magnitudes. + * - ``legend`` + - Flag to display the legend box. Default is True. + * - ``legend_loc`` + - Position of the legend (integer or string). Default is 'best'. + * - ``mag_ticks`` + - List of magnitude ticks to display in the legend. + * - ``labelspacing`` + - Separation between legend ticks. Default is 0.5. + * - ``tile_scaling`` + - Zoom level (1-12) for basemap tiles, or ``auto`` for automatic scaling based on extent. + * - ``linewidth`` + - Line width of borders and coastlines. Default is 1.5. + * - ``linecolor`` + - Color of borders and coastlines. Default is ``black``. + + +.. important:: + + By default, only the main test catalog (containing all events within the experiment frame) is plotted. To also plot the test catalogs from each time window separately, use ``all_time_windows: True`` + + +Custom Plotting +--------------- + +Additional plotting functionality can be injected to an experiment by using a custom **python** script, which is specified within the ``postprocess`` configuration: + +**Example:** + +.. code-block:: yaml + + postprocess: + plot_custom: plot_script.py:main + +where the script path and a function within should be written as: + +.. code-block:: yaml + + plot_custom: {python_script_path}:{function_name} + +This option provides a `hook` for python code to be run after the experiment calculation, giving it read access to attributes from the :class:`floatcsep.experiment.Experiment` class. The `hook` requirements are that the script to be located within the same directory as the configuration file, whereas the function must receive a :class:`floatcsep.experiment.Experiment` as unique argument: + + +**Example custom plot script**: + +.. code-block:: python + + from floatcsep import Experiment + + def main_function(experiment: Experiment): + + timewindows = experiment.timewindows + model = experiment.get_model("pymock") + + rates = [] + start_times = [] + + for timewindow in timewindows: + forecast = model.get_forecast(timewindow) + rates.append(forecast.event_counts) + start_times = timewindow[0] + + fig, ax = plt.subplots(1, 1) + ax.plot(start_times, rates) + pyplot.savefig("results/pymock_rates.png") + + +In this way, the plot function can use all the :class:`~floatcsep.experiment.Experiment` attributes/methods to access catalogs, forecasts and test results. Please check the :ref:`postprocess_api` and the Tutorial :ref:`case_g` for an advanced use. + + + +.. _custom_reporting: + +Custom Reporting +---------------- + +In addition to plotting, **floatCSEP** allows users to generate custom reports in **Markdown** format. The **MarkdownReport** class is designed to support the automatic creation of these reports, allowing users to assemble figures, text, and other results in a well-structured manner. + +The custom report functionality can be invoked by specifying the following in the ``postprocess`` configuration: + +**Example**: + +.. code-block:: yaml + :caption: config.yml + + postprocess: + report: report_script.py:generate_report + +This configuration specifies a custom **python** script with the following format: + +.. code-block:: yaml + + report: {python_script_path}:{function_name} + +The script must be located within the same directory as the configuration file and the function must receive an instance of :class:`floatcsep.experiment.Experiment` instance as its only argument. + +**Example Custom Report Script:**: + +.. code-block:: python + + from floatcsep.utils.reporting import MarkdownReport + + def generate_report(experiment): + # Create a MarkdownReport object + report = MarkdownReport(out_name="custom_report.md") + + # Add an introduction based on the experiment details + intro = { + 'simulation_name': experiment.name, + 'forecast_name': 'ETAS', + 'origin_time': experiment.start_date, + 'evaluation_time': experiment.end_date, + 'catalog_source': 'Observed Catalog', + 'num_simulations': 10000 + } + report.add_introduction(intro) + + # Add some text + report.add_text(['This report contains results from the ETAS model experiment.', 'Additional details below.']) + + + # Add a figure (for example, forecast rates over time) + report.add_figure( + title="Forecast Rates", + relative_filepaths=["results/2020-01-01_2020_01_02/forecasts/etas/forecast_rates.png"], + ncols=1, + caption="Forecasted seismicity rates over time." + ) + + # Save the report + report.save(save_dir="results") + + +The **MarkdownReport** class provides various methods for assembling a report, allowing the user to format the content, insert figures, add tables, and generate text dynamically based on the results of an experiment. + +For more advanced usage of report generation, please review the `default` **floatCSEP** report in the module :mod:`floatcsep.postprocess.reporting.generate_report`, an implementation example in the tutorial :ref:`case_h` and the :ref:`postprocess_api` for an advance use. + + +.. _postprocess_api: + +Postprocess API +--------------- + +Here are some basic functionalities from **floatCSEP** to access catalogs, forecasts and results using **python** code: + +.. dropdown:: Experiment and Catalogs + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Method/Attribute** + - **Description** + * - :attr:`Experiment.timewindows ` + - A list of timewindows, where each is a pair of :class:`datetime.datetime` objects representing the window boundaries. + * - :attr:`Experiment.start_date ` + - The starting :class:`datetime.datetime` of the experiment. + * - :attr:`Experiment.end_date ` + - The end :class:`datetime.datetime` of the experiment. + * - :attr:`Experiment.region ` + - A :class:`csep.core.regions.CartesianGrid2D` object representing the spatial extent of the experiment. + * - :attr:`Experiment.mag_min ` + - The minimum magnitude of the experiment. + * - :attr:`Experiment.mag_max ` + - The maximum magnitude of the experiment. + * - :attr:`Experiment.mag_bin ` + - The magnitude bin size. + * - :attr:`Experiment.magnitudes ` + - A list of the magnitude bins of the experiment. + * - :attr:`Experiment.depth_min ` + - The minimum depth of the experiment. + * - :attr:`Experiment.depth_max ` + - The maximum depth of the experiment. + * - :attr:`Experiment.run_dir ` + - Returns the running directory of the experiment, where all evaluation results and figures are stored. Default is ``results/`` unless specified different in the ``config.yml``. + * - :attr:`Experiment.models ` + - Returns a list containing all the experiment's :class:`~floatcsep.model.Model` objects. + * - :meth:`Experiment.get_model(str) ` + - Returns a :class:`~floatcsep.model.Model` from its given name. + * - :attr:`Experiment.tests ` + - Returns a list containing all the experiment's :class:`~floatcsep.evaluation.Evaluation` objects. + * - :meth:`Experiment.get_test(str) ` + - Returns a :class:`~floatcsep.evaluation.Evaluation` from its given name + * - :attr:`Experiment.catalog_repo ` + - A :class:`~floatcsep.infrastructure.repositories.CatalogRepository` which can access the experiments catalogs. + * - :attr:`Experiment.catalog_repo.catalog ` + - The main catalog of the experiment, of :class:`csep.core.catalogs.CSEPCatalog` class. + * - :meth:`Experiment.catalog_repo.get_test_cat(timewindow) ` + - Returns the testing catalog for a given ``timewindow`` formatted as string. Use :func:`floatcsep.utils.helpers.timewindow2str` in case the window is a list of two :class:`datetime.datetime` objects. + + + +.. dropdown:: Models and forecasts + :animate: fade-in-slide-down + :icon: list-unordered + + The experiment models can be accessed by using :attr:`Experiment.models ` or :meth:`Experiment.get_model(str) `. + + .. list-table:: + :widths: 60 40 + :header-rows: 1 + + * - **Method/Attribute** + - **Description** + * - :attr:`Model.name ` + - Name of the model + * - :meth:`Model.get_forecast(timewindow) ` + - Returns the forecast for a given ``timewindow`` (formatted as string. Use :func:`floatcsep.utils.helpers.timewindow2str` in case the window is a list of two :class:`datetime.datetime` objects). Example: + + .. code-block:: python + + model = experiment.get_model('etas') + timewindow = experiment.timewindows[0] + timewindow_str = timewindow2str(timewindow) + model.get_forecast(timewindow_str) + + * - :attr:`Model.registry.path ` + - Directory of the model file or source code. + * - :attr:`Model.registry.database ` + - Database path where forecasts are stored. + * - :attr:`TimeIndependentModel.forecast_unit ` + - The forecast unit for a time independent model. + * - :meth:`TimeDependentModel.func ` + - The function command to execute a time dependent source code. + * - :meth:`TimeDependentModel.func_kwargs` + - The keyword arguments of the model, passed to the arguments file. + * - :meth:`TimeDependentModel.registry.args_file ` + - The path of the arguments file. Default is ``args.txt``. + * - :meth:`TimeDependentModel.registry.input_cat ` + - The path of the input catalog for the model execution. + + +.. dropdown:: Results + :animate: fade-in-slide-down + :icon: list-unordered + + The experiment evaluations can be accessed by using :attr:`Experiment.tests ` or :meth:`Experiment.get_test(str) `. + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + + * - **Method/Attribute** + - **Description** + * - :meth:`Evaluation.read_results(timewindow, models) ` + - Returns the evaluation results for a given time window and models. Example usage: + + .. code-block:: python + + test = experiment.get_test('n_test') # get a test by its name + model = experiment.get_model('etas') # get a model by its name + timewindow = experiment.timewindows[0] # first time window + result = test.read_results(timewindow, model) + + or from all models: + + .. code-block:: python + + test = experiment.get_test('s_test') # get a test by its name + timewindow = experiment.timewindows[-1] # last time window + result = test.read_results(timewindow, experiment.models) + + + +.. dropdown:: MarkdownReport Methods + :animate: fade-in-slide-down + :icon: list-unordered + + .. list-table:: + :widths: 20 80 + :header-rows: 1 + + * - **Method** + - **Description** + * - :meth:`MarkdownReport.add_introduction` + - Adds an introductory section to the report. This typically contains metadata such as the simulation name, forecast model, evaluation time, and other summary information. + * - :meth:`MarkdownReport.add_text` + - Adds text to the report. Each entry corresponds to a paragraph, and the text argument should be provided as a list of strings. + * - :meth:`MarkdownReport.add_figure` + - Inserts one or more figures into the report. You can specify the title, filepaths to the figures, and an optional caption. Figures are arranged in rows and columns as specified by the ``ncols`` argument. + * - :meth:`MarkdownReport.add_table` + - Creates a table in the report. The table data should be provided as a list of rows, where each row is a list of cell contents. + * - :meth:`MarkdownReport.add_list` + - Adds a bulleted list of items to the report. + * - :meth:`MarkdownReport.add_heading` + - Inserts a heading into the report. The ``level`` argument controls the heading level (1 for top-level, 2 for subheading, etc.). + * - :meth:`MarkdownReport.table_of_contents` + - Generates a table of contents based on the headings and sections included in the report so far. It will be automatically placed at the beginning of the report if an introduction is included. + * - :meth:`MarkdownReport.save` + - Saves the Markdown report to a specified directory. + diff --git a/docs/index.rst b/docs/index.rst index 4d77725..ba912ca 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,6 +38,7 @@ floatCSEP: Floating Experiments :height: 48px .. |experiment| image:: https://img.icons8.com/pulsar-color/48/science-application.png + :target: intro/concepts.html :height: 48px .. |api| image:: https://img.icons8.com/nolan/64/code--v2.png diff --git a/floatcsep/evaluation.py b/floatcsep/evaluation.py index e63954e..eb74b76 100644 --- a/floatcsep/evaluation.py +++ b/floatcsep/evaluation.py @@ -250,7 +250,7 @@ def compute( self.results_repo.write_result(evaluation_result, self, model, timewindow) def read_results( - self, window: Union[str, Sequence[datetime.datetime]], models: List[Model] + self, window: Union[str, Sequence[datetime.datetime]], models: Union[Model, List[Model]] ) -> List: """ Reads an Evaluation result for a given time window and returns a list of the results for diff --git a/floatcsep/experiment.py b/floatcsep/experiment.py index 2cdadaf..e5b50c5 100644 --- a/floatcsep/experiment.py +++ b/floatcsep/experiment.py @@ -188,8 +188,11 @@ def __init__( def __getattr__(self, item: str) -> object: """ - Override built-in method to return attributes found within. - :attr:`region_config` or :attr:`time_config` + Override built-in method to return the experiment attributes by also using the command + ``experiment.{attr}``. Adds also to the experiment scope the keys of + :attr:`region_config` or :attr:`time_config`. These are: ``start_date``, ``end_date``, + ``timewindows``, ``horizon``, ``offset``, ``region``, ``magnitudes``, ``mag_min``, + `mag_max``, ``mag_bin``, ``depth_min`` depth_max . """ try: @@ -206,7 +209,7 @@ def __getattr__(self, item: str) -> object: ) from None def __dir__(self): - """Adds time and region configs keys to instance scope.""" + """Adds the time and region configs keys the to instance scope.""" _dir = ( list(super().__dir__()) + list(self.time_config.keys()) + list(self.region_config) @@ -296,6 +299,12 @@ def get_model(self, name: str) -> Model: if model.name == name: return model + def get_test(self, name: str) -> Model: + """Returns an Evaluation by its name string.""" + for test in self.tests: + if test.name == name: + return test + def stage_models(self) -> None: """ Stages all the experiment's models. See :meth:`floatcsep.model.Model.stage` From 806d38d5226472ab25c8d0addfc91cbedd8bbe35 Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 30 Sep 2024 16:50:31 +0200 Subject: [PATCH 15/19] docs: added executing experiment documentation --- docs/conf.py | 4 +- docs/guide/executing_experiment.rst | 123 ++++++++++++++++++++++++++++ docs/guide/reproduce_experiment.rst | 6 -- docs/guide/run_experiment.rst | 6 -- docs/index.rst | 3 +- 5 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 docs/guide/executing_experiment.rst delete mode 100644 docs/guide/reproduce_experiment.rst delete mode 100644 docs/guide/run_experiment.rst diff --git a/docs/conf.py b/docs/conf.py index 8b7cac7..684e7fc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,9 +14,9 @@ # -- Project information ----------------------------------------------------- project = "floatCSEP" -copyright = "2022, Pablo Iturrieta" +copyright = "2024, Pablo Iturrieta" author = "Pablo Iturrieta" -release = "v0.1.0" +release = "v0.2.0" # -- General configuration --------------------------------------------------- diff --git a/docs/guide/executing_experiment.rst b/docs/guide/executing_experiment.rst new file mode 100644 index 0000000..339c7d8 --- /dev/null +++ b/docs/guide/executing_experiment.rst @@ -0,0 +1,123 @@ +.. _running: + +Executing an Experiment +======================= + +In **floatCSEP**, experiments are executed through a set of core functions provided in the command-line interface (CLI). These commands allow you to stage models, run experiments, plot results, and generate reports. The general structure of these commands is: + +.. code-block:: console + + $ floatcsep + + +The `` can be one of the following: +- `run`: Run the experiment. +- `stage`: Prepare the environment and models. +- `plot`: Plot forecasts, catalogs, and results. +- `reproduce`: (see folllowing\ section) Reproduce the results of a previously run experiment. + +Each command requires a configuration file (in `YAML` format), which defines the parameters of the experiment. + +Running an Experiment: ``floatcsep run`` +---------------------------------------- + +The core command to run an experiment is: + +.. code-block:: console + + $ floatcsep run + + +This command initiates the workflow summarized as: + +1. **Experiment Initialization**: The experiment is initialized by reading the configuration file (`config.yml`). This file contains details such as time windows, regions, catalogs, models, and evaluation tests. + +2. **Staging Models**: If the models are not already staged, they are fetched from their respective repositories (e.g., GitHub, Zenodo) or located on the file system. The necessary computational environments are built using tools like **Conda**, **venv**, or **Docker**. + +3. **Task Generation**: Depending on the experiment class, a given acyclic graph of tasks is created (e.g., a collection of tasks with dependencies to one another). These tasks include creating forecasts, filtering catalogs, and evaluating the forecasts using statistical tests. + +4. **Execution**: The task graph is executed on a standardized fashion. Depending on the characteristics of the experiment (e.g., time-dependent, evaluation windows), this step might involve generating forecasts and running evaluations in sequence. + +5. **Postprocessing**: After the core tasks are completed, the postprocessing step involves: + - Plotting forecasts, catalogs, and evaluation results. + - Generating human-readable reports, which summarize the results. + +6. **Reproducibility**: The configuration and results are saved, allowing the experiment to be reproduced or compared in future runs. + +Here is an example of how to run an experiment: + +.. code-block:: sh + + $ floatcsep run config.yml + + +For more information on how to structure the configuration file, refer to the :ref:`experiment_config` section. + + +Staging Models: ``floatcsep stage`` +----------------------------------- + +Before running an experiment, you may need to check if the models are `staged` properly instead. This involves fetching the source code for the models from a repository (e.g., GitHub, Zenodo) and setting up the necessary computational environment. + +.. code-block:: console + + floatcsep stage + + +Staging the models can be done previous to an experiment run when dealing with source-code models that need specific environments and dependencies to run properly. The `staging` process includes: + +- Downloading the source code. +- Building the computational environment (e.g., setting up a Conda environment or Docker container). +- Installing any dependencies required by the models. +- Building the source code. +- Check a correct integration with floatcsep. +- Prepare the structure of the required forecast. +- Self-discovery of existing forecasts in the filesystem. + + it does plot the results of an already completed experiment. + +.. note:: + + This command should be executed to check if everything is present and working correctly before an official ``run`` execution. + +Plotting Results: ``floatcsep plot`` +------------------------------------ + +Once the experiment has been run, you can regenerate plots for the forecasts, catalogs, and evaluation results using the `plot` command: + +.. code-block:: console + + $ floatcsep plot + + +The `plot` command re-loads the experiment configuration, stages the models, identifying the necessary time windows and results to plot. It does not re-run the forecasts or evaluations, but it does plot the results of an already completed experiment. + +.. note:: + + This command can be useful when trying to customize plots or reports after the results have been created. + + +Reproducing Results: ``floatcsep reproduce`` +-------------------------------------------- + +The `reproduce` command in **floatCSEP** allows users to re-run a previously executed experiment using the same configuration, in order to compare the results and assess reproducibility. This feature allows to ensure that experiments yield consistent outputs when re-executed and to validate scientific results. + +The general command structure is: + +.. code-block:: console + + $ floatcsep reproduce + +A ``repr_config.yml`` is always generated once an experiment is run with ``floatcsep run``. The ``reproduce`` command re-runs the experiment based on this configuration and compares the newly generated results with the original results to provide reproducibility metrics: + +- **Statistical Reproducibility**: It analyzes statistical changes of the evaluation results: + - **Forecast Scores**: The numerical difference between the observed scores of the original and reproduced experiments. + - **Test Statistics**: Statistical metrics like mean, standard deviation, and skewness of the test distributions are compared. + - **Kolmogorov-Smirnov (KS) Test**: The KS-test p-value is computed to assess whether the test distributions from both experiments are significantly different. A p-value below 0.1 indicates a potential difference between distributions. + +- **Data Reproducibility**: A comparison of the result files, checking for discrepancies in file contents or structure. + - **Hash Comparison (SHA-256)**: Each result file is hashed using the SHA-256 algorithm to check if the content has changed between the original and reproduced experiments. + - **Byte-to-Byte Comparison**: This is a direct comparison of the file contents at the byte level, ensuring that no unintended changes have occurred. + + +The analysis can now be found in the created ``reproducibility_report.md``. diff --git a/docs/guide/reproduce_experiment.rst b/docs/guide/reproduce_experiment.rst deleted file mode 100644 index a194d0c..0000000 --- a/docs/guide/reproduce_experiment.rst +++ /dev/null @@ -1,6 +0,0 @@ -.. _reproduce: - -Reproducing an Experiment -========================= - -TBI \ No newline at end of file diff --git a/docs/guide/run_experiment.rst b/docs/guide/run_experiment.rst deleted file mode 100644 index 6b5a655..0000000 --- a/docs/guide/run_experiment.rst +++ /dev/null @@ -1,6 +0,0 @@ -.. _running: - -Running an Experiment -===================== - -TBI \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index ba912ca..fc91ae2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -163,8 +163,7 @@ Collaborators guide/model_config.rst guide/evaluation_config.rst guide/postprocess_config.rst - guide/run_experiment.rst - guide/reproduce_experiment.rst + guide/executing_experiment.rst .. toctree:: From ab8c3a66652c4cd98ccf91a15cbc540e6acdd30a Mon Sep 17 00:00:00 2001 From: pciturri Date: Mon, 30 Sep 2024 16:52:44 +0200 Subject: [PATCH 16/19] build: added sphinx-design as dev requirement --- requirements_dev.txt | 1 + setup.cfg | 1 + 2 files changed, 2 insertions(+) diff --git a/requirements_dev.txt b/requirements_dev.txt index 012c6c9..048207b 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -26,6 +26,7 @@ seaborn shapely sphinx sphinx-autoapi +sphinx_design sphinx-gallery sphinx-rtd-theme sphinx_copybutton diff --git a/setup.cfg b/setup.cfg index 657f79b..4b4acd0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -74,6 +74,7 @@ dev = shapely sphinx sphinx-autoapi + sphinx_design sphinx-gallery sphinx-rtd-theme sphinx_copybutton From 2db5137647b4b7fd2c3d460a09841f1f68dfc856 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 1 Oct 2024 16:07:31 +0200 Subject: [PATCH 17/19] ci: now build-docs install the requirements_dev packages, instead of hardcoded sphinx packages in the config file. --- .github/workflows/build-sphinx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-sphinx.yml b/.github/workflows/build-sphinx.yml index 1d65411..e62df68 100644 --- a/.github/workflows/build-sphinx.yml +++ b/.github/workflows/build-sphinx.yml @@ -25,7 +25,7 @@ jobs: - name: Install floatCSEP run: | - pip install sphinx sphinx-autoapi sphinx-gallery sphinx-rtd-theme + pip install -r requirements_dev.txt pip install --no-deps -e . python -c "import floatcsep; print('Version: ', floatcsep.__version__)" From cb1157bfb503223691a9d23fb57c9d5726cf0256 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 1 Oct 2024 16:43:51 +0200 Subject: [PATCH 18/19] docs: added github context for html --- docs/conf.py | 35 +++++++++++++++++++++++++++++------ docs/index.rst | 28 +++++++++++++++++----------- docs/intro/installation.rst | 10 +++++++--- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 684e7fc..cc35a57 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,7 +33,7 @@ "sphinx_design", ] -# language = 'en' +language = 'en' autosummary_generate = False autoclass_content = "both" suppress_warnings = [ @@ -53,6 +53,10 @@ "matplotlib": ("https://matplotlib.org/stable", None), "pycsep": ("https://docs.cseptesting.org/", None), } +todo_include_todos = False +copybutton_prompt_text = "$ " # Text to ignore when copying (for shell commands) +copybutton_only_copy_prompt_lines = False + # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output @@ -71,11 +75,30 @@ "custom.js", ] -todo_include_todos = False - -copybutton_prompt_text = "$ " # Text to ignore when copying (for shell commands) -copybutton_only_copy_prompt_lines = False - +html_context = { + "github_links": [ + ( + 'Getting help', + "https://github.com/cseptesting/floatcsep/issues" + ), + ( + 'Contributing', + "https://github.com/cseptesting/floatcsep/blob/master/CONTRIBUTING.md" + ), + ( + 'Code of Conduct', + "https://github.com/cseptesting/floatcsep/blob/master/CODE_OF_CONDUCT.md" + ), + ( + 'License', + "https://github.com/cseptesting/floatcsep/blob/master/LICENSE" + ), + ( + 'Source Code', + "https://github.com/cseptesting/floatcsep" + ), + ], +} rst_epilog = """ .. raw:: html diff --git a/docs/index.rst b/docs/index.rst index fc91ae2..6b37b29 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -76,6 +76,7 @@ The `Collaboratory for the Study of Earthquake Predictability `_ the latest version and running the ``tutorials`` with simply: -.. code-block:: +.. code-block:: console $ floatcsep run config.yml @@ -105,6 +106,10 @@ Useful Links | :height: 48px | | | :target: https://github.com/sceccode/pycsep | | +---------------------------------------------------------+-----------------------------------------+ +| .. image:: https://img.icons8.com/nolan/64/github.png | **hazard2csep GitHub** | +| :height: 48px | | +| :target: https://github.com/cseptesting/hazard2csep | | ++---------------------------------------------------------+-----------------------------------------+ | .. image:: https://img.icons8.com/nolan/64/europe.png | **European Testing Center** | | :height: 48px | | | :target: http://eqstats.efehr.org | | @@ -116,16 +121,17 @@ Useful Links Collaborators ------------- - * Pablo Iturrieta, GFZ Potsdam (pciturri@gfz-potsdam.de) - * William Savran, University of Nevada, Reno - * Jose Bayona, University of Bristol - * Francesco Serafini, University of Edinburgh - * Khawaja Asim, GFZ Potsdam - * Fabio Silva, Southern California Earthquake Center - * Marcus Hermann, University of Naples ‘Frederico II’ - * Max Werner, University of Bristol - * Danijel Schorlemmner, GFZ Potsdam - * Philip Maechling, Southern California Earthquake Center + * Pablo Iturrieta, GFZ Potsdam, Germany (pciturri@gfz-potsdam.de) + * William Savran, University of Nevada, Reno, USA + * Jose Bayona, University of Bristol, United Kingdom + * Francesco Serafini, University of Edinburgh, United Kingdom + * Kenny Graham, GNS Science, New Zealand + * Khawaja Asim, GFZ Potsdam, Germany + * Fabio Silva, Southern California Earthquake Center, USA + * Marcus Hermann, University of Naples ‘Frederico II’, Italy + * Max Werner, University of Bristol, United Kingdom + * Danijel Schorlemmner, GFZ Potsdam, Germany + * Philip Maechling, Southern California Earthquake Center, USA diff --git a/docs/intro/installation.rst b/docs/intro/installation.rst index 2d66424..d22693a 100644 --- a/docs/intro/installation.rst +++ b/docs/intro/installation.rst @@ -9,7 +9,7 @@ Installation Latest Version -------------- -Recommended to learn the software, run the tutorials, and drafting Testing Experiments. +Recommended to learn the software, run the tutorials, and drafting **Testing Experiments**. 1. Using ``conda`` ~~~~~~~~~~~~~~~~~~ @@ -29,6 +29,10 @@ Then, clone and install the floatCSEP source code using ``pip`` $ cd floatcsep $ pip install . +.. note:: + + Use the ``mamba`` command instead of ``conda`` if `Miniforge` was installed. + 2. Using ``pip`` only ~~~~~~~~~~~~~~~~~~~~~ @@ -93,8 +97,8 @@ It is recommended (not obligatory) to use a ``conda`` environment to make sure y $ conda env create -n csep_dev $ conda activate csep_dev - $ git clone https://github.com/{your_fork}/floatcsep + $ git clone https://github.com/${your_fork}/floatcsep $ cd floatcsep $ pip install .[dev] -This will install (and configure) all the unit-testing, linting and documentation packages. +This will install and configure all the unit-testing, linting and documentation packages. From a8457d1ab12595387530a9915c0da33d48d747f8 Mon Sep 17 00:00:00 2001 From: pciturri Date: Tue, 1 Oct 2024 18:05:44 +0200 Subject: [PATCH 19/19] docs: added experiment classes figure. removed deployment guide, placed it in roadmap. fixed typos. Added sidebar links (and dependencies). --- README.md | 4 ++-- docs/_static/experiment_classes.png | Bin 0 -> 292901 bytes docs/conf.py | 9 +++++++- docs/deployment/intro.rst | 4 ---- docs/guide/evaluation_config.rst | 4 ++-- docs/guide/executing_experiment.rst | 2 ++ docs/index.rst | 20 +++++------------ docs/intro/concepts.rst | 33 ++++++++++++++++++---------- requirements_dev.txt | 1 + setup.cfg | 1 + 10 files changed, 43 insertions(+), 35 deletions(-) create mode 100644 docs/_static/experiment_classes.png delete mode 100644 docs/deployment/intro.rst diff --git a/README.md b/README.md index a9bdf35..94c18b7 100644 --- a/README.md +++ b/README.md @@ -85,11 +85,11 @@ the tutorials**! # Roadmap and Known Issues -* Add report customization * Create tool to check a TD model's interface with ``floatcsep`` * Define a dependency strategy to ensure experiments' reproducibility. * Implement spatial database and HDF5 experiment storage feature -* Set up task paralellization +* Set up task parallelization +* Document the process of an experiment deployment # Contributing diff --git a/docs/_static/experiment_classes.png b/docs/_static/experiment_classes.png new file mode 100644 index 0000000000000000000000000000000000000000..8b76fedf62b5c2d185adaa3123e62849f3fb3125 GIT binary patch literal 292901 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%0DN$`dhEgo#XQ0+2HP(H>syUq36ZYn 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 >mqMy?F!D&;U{uXKb2V-d6XrFM(UFC*mhbgX~ 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 j{Quq^fBgUQZKjs5TsS}1 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index cc35a57..d2b4e4f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -25,6 +25,8 @@ "sphinx.ext.todo", "sphinx.ext.autosummary", "sphinx.ext.coverage", + 'sphinx_toolbox.github', + 'sphinx_toolbox.sidebar_links', "sphinx.ext.mathjax", "sphinx.ext.viewcode", "sphinx.ext.napoleon", @@ -33,6 +35,9 @@ "sphinx_design", ] +github_username = 'cseptesting' +github_repository = 'floatcsep' + language = 'en' autosummary_generate = False autoclass_content = "both" @@ -99,7 +104,9 @@ ), ], } - +extlinks = { + 'github_contrib': ('https://github.com/cseptesting/floatcsep/main/blob/%s', ''), +} rst_epilog = """ .. raw:: html diff --git a/docs/deployment/intro.rst b/docs/deployment/intro.rst deleted file mode 100644 index 1570e66..0000000 --- a/docs/deployment/intro.rst +++ /dev/null @@ -1,4 +0,0 @@ -Introduction -============ - -In construction \ No newline at end of file diff --git a/docs/guide/evaluation_config.rst b/docs/guide/evaluation_config.rst index 89058f3..e01af13 100644 --- a/docs/guide/evaluation_config.rst +++ b/docs/guide/evaluation_config.rst @@ -28,8 +28,8 @@ Each evaluation specifies a ``func`` parameter, representing the evaluation func plot_func: plot_comparison_test -Evaluation Parameters: ----------------------- +Evaluation Parameters +--------------------- Each evaluation listed in ``test_config`` accepts the following parameters: diff --git a/docs/guide/executing_experiment.rst b/docs/guide/executing_experiment.rst index 339c7d8..78ee59c 100644 --- a/docs/guide/executing_experiment.rst +++ b/docs/guide/executing_experiment.rst @@ -111,11 +111,13 @@ The general command structure is: A ``repr_config.yml`` is always generated once an experiment is run with ``floatcsep run``. The ``reproduce`` command re-runs the experiment based on this configuration and compares the newly generated results with the original results to provide reproducibility metrics: - **Statistical Reproducibility**: It analyzes statistical changes of the evaluation results: + - **Forecast Scores**: The numerical difference between the observed scores of the original and reproduced experiments. - **Test Statistics**: Statistical metrics like mean, standard deviation, and skewness of the test distributions are compared. - **Kolmogorov-Smirnov (KS) Test**: The KS-test p-value is computed to assess whether the test distributions from both experiments are significantly different. A p-value below 0.1 indicates a potential difference between distributions. - **Data Reproducibility**: A comparison of the result files, checking for discrepancies in file contents or structure. + - **Hash Comparison (SHA-256)**: Each result file is hashed using the SHA-256 algorithm to check if the content has changed between the original and reproduced experiments. - **Byte-to-Byte Comparison**: This is a direct comparison of the file contents at the byte level, ensuring that no unintended changes have occurred. diff --git a/docs/index.rst b/docs/index.rst index 6b37b29..774dc66 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -172,21 +172,11 @@ Collaborators guide/executing_experiment.rst -.. toctree:: - :hidden: - :maxdepth: 0 +.. sidebar-links:: :caption: Help & Reference + :github: reference/api_reference - - -.. toctree:: - :hidden: - :maxdepth: 2 - :caption: Deploying an Experiment - - deployment/intro.rst - - - - + Getting Help + Contributing + License diff --git a/docs/intro/concepts.rst b/docs/intro/concepts.rst index 0da1f5f..3036290 100644 --- a/docs/intro/concepts.rst +++ b/docs/intro/concepts.rst @@ -5,26 +5,38 @@ Concepts Forecasting Models ----------------------------- -An earthquake **Forecasting Model** is a representation of our understanding of seismicity, constituted by a collection of hypotheses, assumptions, data and methods. It is able to generate **Forecasts**, i.e., `a probabilistic statement about the occurrence of seismicity, which can include information about its magnitude and spatial location` (Check out the `Core Concepts `_ in the **pyCSEP** documentation). +An earthquake **Forecasting Model** is a representation of our understanding of seismicity, consisting of a collection of hypotheses, assumptions, data and methods. It is capable of generating **Forecasts**, i.e., `a probabilistic statement about the future occurrence of seismicity, which may include information about its magnitude and spatial location` (see the `Core Concepts `_ in the **pyCSEP** documentation). For now, we support earthquake forecasts expressed as: + * **Gridded Forecasts**: Expected occurrence rate in a spatial-magnitude-temporal discretization. + * **Catalog Forecasts**: Families of synthetic earthquake catalogs. -From a computational perspective, a Model can be conceptualized as a **black-box system**, which receives an **input** (e.g. catalog, time window, target magnitude) to produce an **output** (a forecast). It may consist of a single Forecast, a collection of Forecasts, or a forecast-generating source-code. For now, we support earthquake forecasts expressed as: - * Mean rate of occurrence in spatial-magnitude-temporal discretizations - * Families of synthetic earthquake catalogs. +From a computational perspective, a **Model** can be conceptualized as a **black-box system**, which receives an **input** (e.g. catalog, time window, target magnitude) to produce an **output** (a forecast). A model may consist of a single or a collection forecast (e.g., no input required and the output is given directly), or a forecast-generating source-code, which could require a training catalog to be calibrated. Forecasting Experiments ----------------------- -A **Forecasting Experiment** is here defined as the complete scientific process that encodes the questions, hypotheses to be addressed by **Forecasting Models** and the **Evaluation** of such hypotheses and their results. -An experiment has the purpose of leading eventually to scientific and methodological improvements in our forecasting capabilities. +A **Forecasting Experiment** is defined here as the complete scientific process that encodes the questions, hypotheses to be addressed by **Forecasting Models**, and the **Evaluation** of such hypotheses and their results. +The purpose of an experiment is to ultimately lead to scientific and methodological improvements in our forecasting capabilities. + +In **Prospective Experiments**, the parameters of the experiment (including forecast generation, data sets, and evaluation metrics) must be defined with zero degrees of freedom before any evaluations begin. Prospective experiments provide the most objective view of a model's forecasting skill, by removing any unconscious (or conscious) bias of the modelers during forecast production. On the other hand, **Retrospective** experiments or **Pseudo-Prospective** experiments, where the testing data is known to the modeler, are also important during model development and should be carried out as standard scientific praxis. + + +.. figure:: ../_static/experiment_classes.png + :alt: Floating Experiments + :width: 80% + :align: center + + Different experiment classes depending on the data temporality and its availability to the modeler. Figure from Mizrahi et al., (2024). + + +Examples of past prospective experiments are: -In **Prospective Experiments**, the parameters of the experiment (including forecast generation, data sets, and evaluation metrics) must be defined with zero degrees of freedom before any evaluations begin. Prospective experimentation provides the most objective view of the forecast skill of a model, due to excluding any unconscious bias from the modelers. Examples of past prospective experiments are: .. list-table:: :header-rows: 1 - :widths: 12 90 + :widths: 20 80 * - Region - References @@ -47,7 +59,7 @@ In **Prospective Experiments**, the parameters of the experiment (including fore Floating Experiments -------------------- -They are a new conceptual framework for modern experiments, whose operation rely on version control systems (i.e. ``git``), open-data repositories ((e.g. `Zenodo `_) and the containerization of computational environments (e.g., `Docker `_), making experiments reproducible, re-usable and shareable during the time scale of the evaluations. **Floating Experiments** are computational reproducibility packages (e.g., `World Bank `_) expanded to a dynamic implementation, as new earthquake data becomes available in time and new testing results can be continuously released. +They are a new conceptual framework for modern prospective experiments, whose operation rely on version control systems (i.e. ``git``), open-data repositories ((e.g. `Zenodo `_) and the containerization of computational environments (e.g., `Docker `_), making experiments reproducible, re-usable and shareable during the time scale of the evaluations. **Floating Experiments** are computational reproducibility packages (e.g., `World Bank `_) expanded to a dynamic implementation, as new earthquake data becomes available in time and new testing results can be continuously released. .. figure:: ../_static/float_scheme.png :alt: Floating Experiments @@ -57,8 +69,7 @@ They are a new conceptual framework for modern experiments, whose operation rely The forecasting experiment is stored along with the system (**floatCSEP**) and testing routines (**pyCSEP**). It can be cloned to a local machine and run to create results, by using a containerized environment. Results can then be published back into the same repositories, tagging a version/release for each update. -**floatCSEP** assists scientists and institutions in the deployment of forecasting experiments, by standardizing and curating the artifacts and methods required to continuously run and/or reproduce an -experiment, without it being coupled to a fixed physical infrastructure. +**floatCSEP** assists scientists and institutions in the deployment of forecasting experiments, by standardizing and curating the artifacts and methods required to continuously run and/or reproduce an experiment, without it being coupled to a fixed physical infrastructure. References diff --git a/requirements_dev.txt b/requirements_dev.txt index 048207b..bb7a198 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -29,6 +29,7 @@ sphinx-autoapi sphinx_design sphinx-gallery sphinx-rtd-theme +sphinx-toolbox sphinx_copybutton tables tox diff --git a/setup.cfg b/setup.cfg index 4b4acd0..5fa97fe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -75,6 +75,7 @@ dev = sphinx sphinx-autoapi sphinx_design + sphinx-toolbox sphinx-gallery sphinx-rtd-theme sphinx_copybutton