dapper 1.7.0__tar.gz → 1.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dapper-1.7.2/PKG-INFO +107 -0
- {dapper-1.7.0 → dapper-1.7.2}/README.md +90 -91
- dapper-1.7.2/dapper/README.md +17 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/__init__.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/README.md +2 -4
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/__init__.py +6 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/baseline.py +7 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/ensemble.py +20 -20
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/other.py +3 -3
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/particle.py +10 -11
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/variational.py +10 -10
- {dapper-1.7.0 → dapper-1.7.2}/dapper/dpr_config.py +11 -9
- {dapper-1.7.0 → dapper-1.7.2}/dapper/dpr_config.yaml +0 -5
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/__init__.py +1 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/bocquet2019.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/demo.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/__init__.py +2 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/evensen2009.py +3 -3
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/raanes2015.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/__init__.py +7 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/anderson2010rhf.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/bocquet2012.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/mandel2016.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/sakov2012.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/wiljes2017.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/__init__.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/harder.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/pajonk2012.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/__init__.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/anderson2009.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2010.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2010_m40.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2015loc.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/frei2013bridging.py +4 -4
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/hoteit2015.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/miyoshi2011.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/pinheiro2019.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/raanes2016.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/sakov2008.py +6 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/todter2015.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/todter2015_G.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96s/__init__.py +6 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96s/grudzien2020.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/__init__.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/illust_LorenzUV.py +6 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/lorenz96.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/wilks05.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/__init__.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/__init__.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/counillon2009.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/README.md +4 -4
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/illust_obs.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/sakov2008.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/README.md +26 -29
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/VL20/__init__.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/VL20/demo.py +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/__init__.py +69 -59
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/integration.py +12 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/utils.py +21 -20
- {dapper-1.7.0 → dapper-1.7.2}/dapper/stats.py +159 -31
- dapper-1.7.2/dapper/stats_etc.md +84 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/chronos.py +4 -4
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/colors.py +2 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/linalg.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/liveplotting.py +3 -3
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/localization.py +6 -6
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/matrices.py +4 -4
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/multiproc.py +3 -3
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/randvars.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/README.md +61 -48
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/uplink.py +2 -1
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/rounding.py +12 -7
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/series.py +4 -3
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/viz.py +95 -80
- {dapper-1.7.0 → dapper-1.7.2}/dapper/xp_launch.py +29 -28
- {dapper-1.7.0 → dapper-1.7.2}/dapper/xp_process.py +37 -29
- dapper-1.7.2/dapper.egg-info/PKG-INFO +107 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/SOURCES.txt +1 -2
- {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/requires.txt +32 -14
- {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/top_level.txt +0 -1
- {dapper-1.7.0 → dapper-1.7.2}/pyproject.toml +1 -1
- {dapper-1.7.0 → dapper-1.7.2}/setup.py +37 -16
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_data.py +2 -2
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_round2.py +3 -2
- dapper-1.7.0/PKG-INFO +0 -29
- dapper-1.7.0/dapper/README.md +0 -43
- dapper-1.7.0/dapper.egg-info/PKG-INFO +0 -29
- dapper-1.7.0/examples/basic_1.py +0 -102
- dapper-1.7.0/examples/basic_2.py +0 -87
- {dapper-1.7.0 → dapper-1.7.2}/LICENCE.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/extended.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/settings101.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Id/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/some_settings_01.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/compare_schemes.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/small.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/settings01.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/extras.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/ramgraber2022.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/extras.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/spantini2019.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/spectral_obs.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/illust_parameterizations.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/settings101.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/demo.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/Makefile +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/calc.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/data.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/helmholtz.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/interface.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/nfw.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/parameters.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_cou09_ens.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_cou09_truth.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_counillon2009_ens.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_counillon2009_truth.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sak08.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sakov2008.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sample_generation.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_test_model.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qg.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qgflux.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qgstep.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/utils.f90 +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/governing_eqn.png +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/explore_props.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/datafiles.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/progressbar.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/autoscaler.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/seeding.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/dependency_links.txt +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/setup.cfg +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/__init__.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_HMMs.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_TLMs.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_demos.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_example_2.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_iEnKS.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_localization.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_matrices.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_operator.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_plotting.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_printing.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_randvars.py +0 -0
- {dapper-1.7.0 → dapper-1.7.2}/tests/test_rng.py +0 -0
dapper-1.7.2/PKG-INFO
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dapper
|
|
3
|
+
Version: 1.7.2
|
|
4
|
+
Summary: DAPPER benchmarks the performance of data assimilation (DA) methods.
|
|
5
|
+
Author: Patrick N. Raanes
|
|
6
|
+
Author-email: patrick.n.raanes@gmail.com
|
|
7
|
+
Project-URL: Documentation, https://nansencenter.github.io/DAPPER/
|
|
8
|
+
Project-URL: Source, https://github.com/nansencenter/DAPPER
|
|
9
|
+
Project-URL: Tracker, https://github.com/nansencenter/DAPPER/issues
|
|
10
|
+
Keywords: data-assimilation enkf kalman-filtering state-estimation particle-filter kalman bayesian-methods bayesian-filter chaos
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Science/Research
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Requires-Python: >=3.12
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENCE.txt
|
|
20
|
+
Requires-Dist: scipy>=1.14
|
|
21
|
+
Requires-Dist: numpy~=2.0
|
|
22
|
+
Requires-Dist: matplotlib>=3.10
|
|
23
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
24
|
+
Requires-Dist: ipython>=7.34
|
|
25
|
+
Requires-Dist: ipdb
|
|
26
|
+
Requires-Dist: jupyter
|
|
27
|
+
Requires-Dist: notebook<7
|
|
28
|
+
Requires-Dist: mpl-tools==0.4.1
|
|
29
|
+
Requires-Dist: tqdm~=4.67
|
|
30
|
+
Requires-Dist: colorama~=0.4.1
|
|
31
|
+
Requires-Dist: tabulate~=0.8.3
|
|
32
|
+
Requires-Dist: pathos~=0.3
|
|
33
|
+
Requires-Dist: dill==0.3.8
|
|
34
|
+
Requires-Dist: patlib==0.3.7
|
|
35
|
+
Requires-Dist: struct-tools==0.2.5
|
|
36
|
+
Requires-Dist: threadpoolctl<4.0.0,>=3.0.0
|
|
37
|
+
Provides-Extra: qt
|
|
38
|
+
Requires-Dist: PyQt5; extra == "qt"
|
|
39
|
+
Requires-Dist: qtpy; extra == "qt"
|
|
40
|
+
Provides-Extra: debug
|
|
41
|
+
Requires-Dist: line_profiler; extra == "debug"
|
|
42
|
+
Requires-Dist: pre-commit; extra == "debug"
|
|
43
|
+
Provides-Extra: test
|
|
44
|
+
Requires-Dist: tox; extra == "test"
|
|
45
|
+
Requires-Dist: coverage>=5.1; extra == "test"
|
|
46
|
+
Requires-Dist: pytest; extra == "test"
|
|
47
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
48
|
+
Requires-Dist: pytest-sugar; extra == "test"
|
|
49
|
+
Requires-Dist: pytest-benchmark; extra == "test"
|
|
50
|
+
Requires-Dist: pytest-clarity; extra == "test"
|
|
51
|
+
Requires-Dist: pytest-xdist; extra == "test"
|
|
52
|
+
Requires-Dist: pytest-timeout; extra == "test"
|
|
53
|
+
Provides-Extra: lint
|
|
54
|
+
Requires-Dist: ruff; extra == "lint"
|
|
55
|
+
Provides-Extra: doc
|
|
56
|
+
Requires-Dist: mkdocs-material; extra == "doc"
|
|
57
|
+
Requires-Dist: mkdocstrings; extra == "doc"
|
|
58
|
+
Requires-Dist: mkdocstrings-python; extra == "doc"
|
|
59
|
+
Requires-Dist: mkdocs-gen-files; extra == "doc"
|
|
60
|
+
Requires-Dist: mkdocs-literate-nav; extra == "doc"
|
|
61
|
+
Requires-Dist: mkdocs-section-index; extra == "doc"
|
|
62
|
+
Requires-Dist: mkdocs-glightbox; extra == "doc"
|
|
63
|
+
Requires-Dist: mkdocs-jupyter; extra == "doc"
|
|
64
|
+
Requires-Dist: pybtex; extra == "doc"
|
|
65
|
+
Provides-Extra: build
|
|
66
|
+
Requires-Dist: twine; extra == "build"
|
|
67
|
+
Requires-Dist: jupytext<=1.15; extra == "build"
|
|
68
|
+
Provides-Extra: dev
|
|
69
|
+
Requires-Dist: line_profiler; extra == "dev"
|
|
70
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
71
|
+
Requires-Dist: tox; extra == "dev"
|
|
72
|
+
Requires-Dist: coverage>=5.1; extra == "dev"
|
|
73
|
+
Requires-Dist: pytest; extra == "dev"
|
|
74
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
75
|
+
Requires-Dist: pytest-sugar; extra == "dev"
|
|
76
|
+
Requires-Dist: pytest-benchmark; extra == "dev"
|
|
77
|
+
Requires-Dist: pytest-clarity; extra == "dev"
|
|
78
|
+
Requires-Dist: pytest-xdist; extra == "dev"
|
|
79
|
+
Requires-Dist: pytest-timeout; extra == "dev"
|
|
80
|
+
Requires-Dist: ruff; extra == "dev"
|
|
81
|
+
Requires-Dist: twine; extra == "dev"
|
|
82
|
+
Requires-Dist: jupytext<=1.15; extra == "dev"
|
|
83
|
+
Requires-Dist: mkdocs-material; extra == "dev"
|
|
84
|
+
Requires-Dist: mkdocstrings; extra == "dev"
|
|
85
|
+
Requires-Dist: mkdocstrings-python; extra == "dev"
|
|
86
|
+
Requires-Dist: mkdocs-gen-files; extra == "dev"
|
|
87
|
+
Requires-Dist: mkdocs-literate-nav; extra == "dev"
|
|
88
|
+
Requires-Dist: mkdocs-section-index; extra == "dev"
|
|
89
|
+
Requires-Dist: mkdocs-glightbox; extra == "dev"
|
|
90
|
+
Requires-Dist: mkdocs-jupyter; extra == "dev"
|
|
91
|
+
Requires-Dist: pybtex; extra == "dev"
|
|
92
|
+
Dynamic: author
|
|
93
|
+
Dynamic: author-email
|
|
94
|
+
Dynamic: classifier
|
|
95
|
+
Dynamic: description
|
|
96
|
+
Dynamic: description-content-type
|
|
97
|
+
Dynamic: keywords
|
|
98
|
+
Dynamic: license-file
|
|
99
|
+
Dynamic: project-url
|
|
100
|
+
Dynamic: provides-extra
|
|
101
|
+
Dynamic: requires-dist
|
|
102
|
+
Dynamic: requires-python
|
|
103
|
+
Dynamic: summary
|
|
104
|
+
|
|
105
|
+
It is usually best to install from source (github),
|
|
106
|
+
so that you the code is readily available to play with.
|
|
107
|
+
See full README on [github](https://github.com/nansencenter/DAPPER).
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
!
|
|
9
9
|
-->
|
|
10
10
|
|
|
11
|
-
<img src="/docs/
|
|
11
|
+
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/logo_wtxt.png" alt="DAPPER logo" align="left" width="250"/>
|
|
12
12
|
|
|
13
13
|
DAPPER is a set of templates for **benchmarking** the performance of **data assimilation** (DA) methods.
|
|
14
14
|
The numerical experiments provide support and guidance for new developments in DA.
|
|
@@ -26,20 +26,19 @@ and then estimate that truth given the models and noisy observations.
|
|
|
26
26
|
|
|
27
27
|
## Getting started
|
|
28
28
|
|
|
29
|
-
[
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
The [documentation](https://nansencenter.github.io/DAPPER)
|
|
36
|
-
includes general guidelines and the API reference,
|
|
37
|
-
but most users must expect to read the code as well.
|
|
38
|
-
If used towards a publication, please cite as
|
|
39
|
-
*The experiments used (inspiration from) DAPPER [ref], version 1.6.0*,
|
|
40
|
-
or similar, where [ref] points to [](https://doi.org/10.21105/joss.05150).
|
|
41
|
-
Also see the interactive [tutorials on DA theory](https://github.com/nansencenter/DA-tutorials)
|
|
42
|
-
with Python.
|
|
29
|
+
- Read & run [examples](examples)/`basic_1.py` and `basic_2.py`,
|
|
30
|
+
or their corresponding notebooks [](http://colab.research.google.com/github/nansencenter/DAPPER)
|
|
31
|
+
(requires Google login).
|
|
32
|
+
- This [screencast](https://www.youtube.com/watch?v=YtalK0Zkzvg&t=6475s)
|
|
33
|
+
provides an overview to DAPPER.
|
|
34
|
+
- [Install](#installation).
|
|
35
|
+
- The [documentation](https://nansencenter.github.io/DAPPER)
|
|
36
|
+
includes general guidelines and the API reference,
|
|
37
|
+
but most users must expect to read the code as well.
|
|
38
|
+
- If used towards a publication, please cite as
|
|
39
|
+
*The experiments used (inspiration from) DAPPER [ref], version 1.6.0*,
|
|
40
|
+
or similar, where [ref] points to [](https://doi.org/10.21105/joss.05150).
|
|
41
|
+
- Also see the interactive [tutorials on DA theory](https://github.com/nansencenter/DA-tutorials) with Python.
|
|
43
42
|
|
|
44
43
|
## Highlights
|
|
45
44
|
|
|
@@ -49,7 +48,7 @@ through a variety of typical [test cases](#test-cases-models) and statistics. It
|
|
|
49
48
|
(b) facilitates comparative studies, thus promoting the
|
|
50
49
|
(a) reliability and
|
|
51
50
|
(b) relevance of the results.
|
|
52
|
-
For example, the figure below is generated by `examples/basic_3.py`,
|
|
51
|
+
For example, the figure below is generated by `docs/examples/basic_3.py`,
|
|
53
52
|
reproduces figure 5.7 of [these lecture notes](http://cerea.enpc.fr/HomePages/bocquet/teaching/assim-mb-en.pdf).
|
|
54
53
|
DAPPER is
|
|
55
54
|
(c) open source, written in Python, and
|
|
@@ -59,10 +58,10 @@ this promotes the
|
|
|
59
58
|
(d) dissemination of the underlying science,
|
|
60
59
|
and makes it easy to adapt and extend.
|
|
61
60
|
|
|
62
|
-
](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex3.svg)
|
|
63
62
|
|
|
64
63
|
DAPPER demonstrates how to parallelise ensemble forecasts (e.g., the QG model),
|
|
65
|
-
local analyses (e.g., the LETKF), and independent experiments (e.g., `examples/basic_3.py`).
|
|
64
|
+
local analyses (e.g., the LETKF), and independent experiments (e.g., `docs/examples/basic_3.py`).
|
|
66
65
|
It includes a battery of diagnostics and statistics,
|
|
67
66
|
which all get averaged over subdomains (e.g., "ocean" and "land") and then in time.
|
|
68
67
|
Confidence intervals are computed, including correction for auto-correlations,
|
|
@@ -72,7 +71,7 @@ which may be paused for further interactive inspection.
|
|
|
72
71
|
In summary, DAPPER is well suited for teaching and fundamental DA research.
|
|
73
72
|
Also see its [drawbacks](#similar-projects).
|
|
74
73
|
|
|
75
|
-

|
|
76
75
|
|
|
77
76
|
<!-- Non-highlighted features:
|
|
78
77
|
- Time sequences use via `tools.chronos.Chronology` and `tools.chronos.Ticker`.
|
|
@@ -89,7 +88,7 @@ Also see its [drawbacks](#similar-projects).
|
|
|
89
88
|
|
|
90
89
|
Successfully tested on Linux/Mac/Windows.
|
|
91
90
|
|
|
92
|
-
### Prerequisite: Python>=3.
|
|
91
|
+
### Prerequisite: Python>=3.12
|
|
93
92
|
|
|
94
93
|
If you're an expert, setup a python environment however you like.
|
|
95
94
|
Otherwise:
|
|
@@ -132,7 +131,7 @@ You should now be able to do run your script with
|
|
|
132
131
|
`python path/to/script.py`.
|
|
133
132
|
For example, if you are in the DAPPER dir,
|
|
134
133
|
|
|
135
|
-
python examples/basic_1.py
|
|
134
|
+
python docs/examples/basic_1.py
|
|
136
135
|
|
|
137
136
|
**PS**: If you closed the terminal (or shut down your computer),
|
|
138
137
|
you'll first need to run `conda activate dapper-env`
|
|
@@ -142,23 +141,23 @@ you'll first need to run `conda activate dapper-env`
|
|
|
142
141
|
|
|
143
142
|
<!-- markdownlint-capture -->
|
|
144
143
|
<!-- markdownlint-disable line-length -->
|
|
145
|
-
Method
|
|
146
|
-
|
|
147
|
-
EnKF <sup>1</sup>
|
|
148
|
-
EnKF-N
|
|
149
|
-
EnKS, EnRTS
|
|
150
|
-
iEnKS / iEnKF / EnRML / ES-MDA <sup>2</sup>
|
|
151
|
-
LETKF, local & serial EAKF
|
|
152
|
-
Sqrt. model noise methods
|
|
153
|
-
Particle filter (bootstrap) <sup>3</sup>
|
|
154
|
-
Optimal/implicit Particle filter <sup>3</sup>
|
|
155
|
-
NETF
|
|
156
|
-
Rank histogram filter (RHF)
|
|
157
|
-
4D-Var
|
|
158
|
-
3D-Var
|
|
159
|
-
Extended KF
|
|
160
|
-
Optimal interpolation
|
|
161
|
-
Climatology
|
|
144
|
+
| Method | Literature reproduced |
|
|
145
|
+
|------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------|
|
|
146
|
+
| EnKF <sup>1</sup> | [Sakov08](https://nansencenter.github.io/DAPPER/references/#sakov2008b), [Hoteit15](https://nansencenter.github.io/DAPPER/references/#hoteit2015a), [Grudzien2020](https://nansencenter.github.io/DAPPER/references/#grudzien2020a) |
|
|
147
|
+
| EnKF-N | [Bocquet12](https://nansencenter.github.io/DAPPER/references/#bocquet2012a), [Bocquet15](https://nansencenter.github.io/DAPPER/references/#bocquet2015) |
|
|
148
|
+
| EnKS, EnRTS | [Raanes2016](https://nansencenter.github.io/DAPPER/references/#raanes2016thesis) |
|
|
149
|
+
| iEnKS / iEnKF / EnRML / ES-MDA <sup>2</sup> | [Sakov12](https://nansencenter.github.io/DAPPER/references/#sakov2012a), [Bocquet12](https://nansencenter.github.io/DAPPER/references/#Bocquet12), [Bocquet14](https://nansencenter.github.io/DAPPER/references/#bocquet2014) |
|
|
150
|
+
| LETKF, local & serial EAKF | [Bocquet11](https://nansencenter.github.io/DAPPER/references/#bocquet2011) |
|
|
151
|
+
| Sqrt. model noise methods | [Raanes2014](https://nansencenter.github.io/DAPPER/references/#raanes2014) |
|
|
152
|
+
| Particle filter (bootstrap) <sup>3</sup> | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a) |
|
|
153
|
+
| Optimal/implicit Particle filter <sup>3</sup> | [Bocquet10](https://nansencenter.github.io/DAPPER/references/#bocquet2010a) |
|
|
154
|
+
| NETF | [Tödter15](https://nansencenter.github.io/DAPPER/references/#todter2015a), [Wiljes16](https://nansencenter.github.io/DAPPER/references/#wiljes2016) |
|
|
155
|
+
| Rank histogram filter (RHF) | [Anderson10](https://nansencenter.github.io/DAPPER/references/#anderson2010) |
|
|
156
|
+
| 4D-Var | |
|
|
157
|
+
| 3D-Var | |
|
|
158
|
+
| Extended KF | |
|
|
159
|
+
| Optimal interpolation | |
|
|
160
|
+
| Climatology | |
|
|
162
161
|
<!-- markdownlint-restore -->
|
|
163
162
|
|
|
164
163
|
<sup>1</sup>: Stochastic, DEnKF (i.e. half-update), ETKF (i.e. sym. sqrt.).
|
|
@@ -184,22 +183,22 @@ grep -r "xp.*iEnKS" dapper/mods
|
|
|
184
183
|
Simple models facilitate the reliability, reproducibility,
|
|
185
184
|
and interpretability of experiment results.
|
|
186
185
|
|
|
187
|
-
Model | Lin | TLM
|
|
188
|
-
|
|
189
|
-
Id | Yes | Yes | No | N/A |
|
|
190
|
-
Linear Advect. (LA) | Yes | Yes | Yes | 1d | 1000
|
|
191
|
-
DoublePendulum | No | Yes | No | 0d | 4 | 2 | Matplotlib/Raanes
|
|
192
|
-
Ikeda | No | Yes | No | 0d | 2 | 1 | Raanes
|
|
193
|
-
LotkaVolterra | No | Yes | No | 0d | 5
|
|
194
|
-
Lorenz63 | No | Yes | "Yes" | 0d | 3 | 2 | Sakov
|
|
195
|
-
Lorenz84 | No | Yes | No | 0d | 3 | 2 | Raanes
|
|
196
|
-
Lorenz96 | No | Yes | No | 1d | 40
|
|
197
|
-
Lorenz96s | No | Yes | No | 1d | 10
|
|
198
|
-
LorenzUV | No | Yes | No | 2x 1d | 256 + 8
|
|
199
|
-
LorenzIII | No | No | No | 1d | 960
|
|
200
|
-
Vissio-Lucarini 20 | No | Yes | No | 1d | 36
|
|
201
|
-
Kuramoto-Sivashinsky | No | Yes | Yes | 1d | 128
|
|
202
|
-
Quasi-Geost (QG) | No | No | Yes | 2d | 129²≈17k | ≈140 | Sakov
|
|
186
|
+
| Model | Lin | TLM`**` | PDE? | Phys.dim. | State len | Lyap≥0 | Implementer |
|
|
187
|
+
|----------------------|-----|-------|-------|-----------|-----------|--------|---------------------|
|
|
188
|
+
| Id | Yes | Yes | No | N/A | `*` | 0 | Raanes |
|
|
189
|
+
| Linear Advect. (LA) | Yes | Yes | Yes | 1d | 1000 `*` | 51 | Evensen/Raanes |
|
|
190
|
+
| DoublePendulum | No | Yes | No | 0d | 4 | 2 | Matplotlib/Raanes |
|
|
191
|
+
| Ikeda | No | Yes | No | 0d | 2 | 1 | Raanes |
|
|
192
|
+
| LotkaVolterra | No | Yes | No | 0d | 5 `*` | 1 | Wikipedia/Raanes |
|
|
193
|
+
| Lorenz63 | No | Yes | "Yes" | 0d | 3 | 2 | Sakov |
|
|
194
|
+
| Lorenz84 | No | Yes | No | 0d | 3 | 2 | Raanes |
|
|
195
|
+
| Lorenz96 | No | Yes | No | 1d | 40 `*` | 13 | Raanes |
|
|
196
|
+
| Lorenz96s | No | Yes | No | 1d | 10 `*` | 4 | Grudzien |
|
|
197
|
+
| LorenzUV | No | Yes | No | 2x 1d | 256 + 8 `*` | ≈60 | Raanes |
|
|
198
|
+
| LorenzIII | No | No | No | 1d | 960 `*` | ≈164 | Raanes |
|
|
199
|
+
| Vissio-Lucarini 20 | No | Yes | No | 1d | 36 `*` | 10 | Yumeng |
|
|
200
|
+
| Kuramoto-Sivashinsky | No | Yes | Yes | 1d | 128 `*` | 11 | Kassam/Raanes |
|
|
201
|
+
| Quasi-Geost (QG) | No | No | Yes | 2d | 129²≈17k | ≈140 | Sakov |
|
|
203
202
|
|
|
204
203
|
- `*`: Flexible; set as necessary
|
|
205
204
|
- `**`: Tangent Linear Model included?
|
|
@@ -248,42 +247,42 @@ Therefore, if you have an *operational* or real-world application,
|
|
|
248
247
|
such as WRF, you should look into one of the alternatives,
|
|
249
248
|
sorted by approximate project size.
|
|
250
249
|
|
|
251
|
-
Name | Developers | Purpose (approximately)
|
|
252
|
-
|
|
253
|
-
[DART][1] | NCAR
|
|
254
|
-
[PDAF][7] | AWI
|
|
255
|
-
[JEDI][21] | JCSDA (NOAA, NASA, ++)| General
|
|
256
|
-
[OpenDA][3] | TU Delft
|
|
257
|
-
[EMPIRE][4] | Reading (Met)
|
|
258
|
-
[ERT][2] | Statoil
|
|
259
|
-
[PIPT][14] | CIPR
|
|
260
|
-
[MIKE][9] | DHI
|
|
261
|
-
[OAK][10] | Liège
|
|
262
|
-
[Siroco][11] | OMP
|
|
263
|
-
[Verdandi][6] | INRIA
|
|
264
|
-
[PyOSSE][8] | Edinburgh, Reading
|
|
250
|
+
| Name | Developers | Purpose (approximately) |
|
|
251
|
+
|--------------------|----------------------|-----------------------------------|
|
|
252
|
+
| [DART][1] | NCAR | General |
|
|
253
|
+
| [PDAF][7] | AWI | General |
|
|
254
|
+
| [JEDI][21] | JCSDA (NOAA, NASA, ++)| General |
|
|
255
|
+
| [OpenDA][3] | TU Delft | General |
|
|
256
|
+
| [EMPIRE][4] | Reading (Met) | General |
|
|
257
|
+
| [ERT][2] | Statoil | History matching (Petroleum DA) |
|
|
258
|
+
| [PIPT][14] | CIPR | History matching (Petroleum DA) |
|
|
259
|
+
| [MIKE][9] | DHI | Oceanographic |
|
|
260
|
+
| [OAK][10] | Liège | Oceanographic |
|
|
261
|
+
| [Siroco][11] | OMP | Oceanographic |
|
|
262
|
+
| [Verdandi][6] | INRIA | Biophysical DA |
|
|
263
|
+
| [PyOSSE][8] | Edinburgh, Reading | Earth-observation DA |
|
|
265
264
|
|
|
266
265
|
Below is a list of projects with a purpose more similar to DAPPER's
|
|
267
266
|
(research *in* DA, and not so much *using* DA):
|
|
268
267
|
|
|
269
|
-
Name | Developers | Notes
|
|
270
|
-
|
|
271
|
-
[DAPPER][22] | Raanes, Chen, Grudzien | Python
|
|
272
|
-
[SANGOMA][5] | Conglomerate* | Fortran, Matlab
|
|
273
|
-
[hIPPYlib][25] | Villa, Petra, Ghattas | Python, adjoint-based PDE methods
|
|
274
|
-
[FilterPy][12] | R. Labbe | Python. Engineering oriented.
|
|
275
|
-
[DASoftware][13] | Yue Li, Stanford | Matlab. Large inverse probs.
|
|
276
|
-
[Pomp][18] | U of Michigan | R
|
|
277
|
-
[EnKF-Matlab][15] | Sakov | Matlab
|
|
278
|
-
[EnKF-C][17] | Sakov | C. Light-weight, off-line DA
|
|
279
|
-
[pyda][16] | Hickman | Python
|
|
280
|
-
[PyDA][19] | Shady-Ahmed | Python
|
|
281
|
-
[DasPy][20] | Xujun Han | Python
|
|
282
|
-
[DataAssim.jl][23] | Alexander-Barth | Julia
|
|
283
|
-
[DataAssimilationBenchmarks.jl][24] | Grudzien | Julia, Python
|
|
284
|
-
[EnsembleKalmanProcesses.jl][26] | Clim. Modl. Alliance | Julia, EKI (optim)
|
|
285
|
-
Datum | Raanes | Matlab
|
|
286
|
-
IEnKS code | Bocquet | Python
|
|
268
|
+
| Name | Developers | Notes |
|
|
269
|
+
|--------------------------------------|---------------------------|------------------------------------|
|
|
270
|
+
| [DAPPER][22] | Raanes, Chen, Grudzien | Python |
|
|
271
|
+
| [SANGOMA][5] | Conglomerate* | Fortran, Matlab |
|
|
272
|
+
| [hIPPYlib][25] | Villa, Petra, Ghattas | Python, adjoint-based PDE methods |
|
|
273
|
+
| [FilterPy][12] | R. Labbe | Python. Engineering oriented. |
|
|
274
|
+
| [DASoftware][13] | Yue Li, Stanford | Matlab. Large inverse probs. |
|
|
275
|
+
| [Pomp][18] | U of Michigan | R |
|
|
276
|
+
| [EnKF-Matlab][15] | Sakov | Matlab |
|
|
277
|
+
| [EnKF-C][17] | Sakov | C. Light-weight, off-line DA |
|
|
278
|
+
| [pyda][16] | Hickman | Python |
|
|
279
|
+
| [PyDA][19] | Shady-Ahmed | Python |
|
|
280
|
+
| [DasPy][20] | Xujun Han | Python |
|
|
281
|
+
| [DataAssim.jl][23] | Alexander-Barth | Julia |
|
|
282
|
+
| [DataAssimilationBenchmarks.jl][24] | Grudzien | Julia, Python |
|
|
283
|
+
| [EnsembleKalmanProcesses.jl][26] | Clim. Modl. Alliance | Julia, EKI (optim) |
|
|
284
|
+
| Datum | Raanes | Matlab |
|
|
285
|
+
| IEnKS code | Bocquet | Python |
|
|
287
286
|
|
|
288
287
|
The `EnKF-Matlab` and `IEnKS` codes have been inspirational
|
|
289
288
|
in the development of DAPPER.
|
|
@@ -352,11 +351,11 @@ and the Center for Western Weather and Water Extremes (CW3E).
|
|
|
352
351
|
|
|
353
352
|
<!-- markdownlint-capture -->
|
|
354
353
|
<!-- markdownlint-disable line-length -->
|
|
355
|
-

|
|
355
|
+

|
|
356
|
+
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/UoR-logo.png?raw=true" alt="University of Reading logo" height="120" />
|
|
357
|
+
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nceologo1000.png?raw=true" alt="NCEO logo" height="100">
|
|
358
|
+
<img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/CW3E-Logo-Horizontal-FullColor.png?raw=true" alt="CW3E logo" width="400">
|
|
360
359
|
<!-- markdownlint-restore -->
|
|
361
360
|
|
|
362
361
|
## Publications
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## Adding your own model/method
|
|
2
|
+
|
|
3
|
+
If you wish to illustrate and run benchmarks with
|
|
4
|
+
your own **model** or **method**, then
|
|
5
|
+
|
|
6
|
+
- If it is a complex one, you may be better off using DAPPER
|
|
7
|
+
merely as *inspiration* (but you can still
|
|
8
|
+
[cite it](../#getting-started))
|
|
9
|
+
rather than trying to squeeze everything into its templates.
|
|
10
|
+
- If it is relatively simple, however, you may well want to use DAPPER.
|
|
11
|
+
In that case, read this:
|
|
12
|
+
- [`mods`](mods)
|
|
13
|
+
- [`da_methods`](da_methods)
|
|
14
|
+
|
|
15
|
+
Since the generality of DAPPER is
|
|
16
|
+
[limited](../#similar-projects)
|
|
17
|
+
it is quite likely you will also need to make changes to the DAPPER code itself.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""Root package of **DAPPER**
|
|
2
2
|
(Data Assimilation with Python: a Package for Experimental Research)
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
--8<-- "dapper/README.md"
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
__version__ = "1.7.
|
|
7
|
+
__version__ = "1.7.2"
|
|
8
8
|
|
|
9
9
|
# A parsimonious list of imports used in the examples
|
|
10
10
|
from .dpr_config import rc
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
Also see
|
|
2
|
-
[DA Methods](https://github.com/nansencenter/DAPPER#DA-Methods)
|
|
3
|
-
in the main README
|
|
1
|
+
Also see [this section on DA Methods](../../#da-methods)
|
|
4
2
|
for an overview of the methods included with DAPPER.
|
|
5
3
|
|
|
6
4
|
## Defining your own method
|
|
@@ -8,7 +6,7 @@ for an overview of the methods included with DAPPER.
|
|
|
8
6
|
Follow the example of one of the methods within one of the
|
|
9
7
|
sub-directories/packages.
|
|
10
8
|
The simplest example is perhaps
|
|
11
|
-
`
|
|
9
|
+
[`da_methods.ensemble.EnKF`][].
|
|
12
10
|
|
|
13
11
|
## General advice for programming/debugging scientific experiments
|
|
14
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Contains the data assimilation methods included with DAPPER.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
--8<-- "dapper/da_methods/README.md"
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from pathlib import Path
|
|
@@ -16,7 +16,7 @@ def da_method(*default_dataclasses):
|
|
|
16
16
|
The decorated classes are defined like a `dataclass`,
|
|
17
17
|
but are decorated by `@da_method()` instead of `@dataclass`.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
!!! note
|
|
20
20
|
The classes must define a method called `assimilate`.
|
|
21
21
|
This method gets slightly enhanced by this wrapper which provides:
|
|
22
22
|
|
|
@@ -25,7 +25,8 @@ def da_method(*default_dataclasses):
|
|
|
25
25
|
- Duration timing
|
|
26
26
|
- Progressbar naming magic.
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
29
30
|
>>> @da_method()
|
|
30
31
|
... class Sleeper():
|
|
31
32
|
... "Do nothing."
|
|
@@ -43,7 +44,6 @@ def da_method(*default_dataclasses):
|
|
|
43
44
|
which enables defining default parameters which can be inherited,
|
|
44
45
|
similar to subclassing.
|
|
45
46
|
|
|
46
|
-
Example:
|
|
47
47
|
>>> class ens_defaults:
|
|
48
48
|
... infl : float = 1.0
|
|
49
49
|
... rot : bool = False
|
|
@@ -56,13 +56,13 @@ def da_method(*default_dataclasses):
|
|
|
56
56
|
... def assimilate(self, HMM, xx, yy):
|
|
57
57
|
... ...
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
!!! note
|
|
60
60
|
Apart from what's listed in the above `Note`, there is nothing special to the
|
|
61
61
|
resulting `xp`. That is, just like any Python object, it can serve as a data
|
|
62
62
|
container, and you can write any number of attributes to it (at creation-time,
|
|
63
63
|
or later). For example, you can set attributes that are not used by the
|
|
64
64
|
`assimilate` method, but are instead used to customize other aspects of the
|
|
65
|
-
experiments (see `
|
|
65
|
+
experiments (see [`xp_launch.run_experiment`][]).
|
|
66
66
|
"""
|
|
67
67
|
import dataclasses
|
|
68
68
|
import functools
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Unsophisticated" but robust (widely applicable) DA methods.
|
|
2
2
|
|
|
3
|
-
Many are based on
|
|
3
|
+
Many are based on [raanes2016thesis][].
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from typing import Callable, Optional
|
|
@@ -146,10 +146,15 @@ def fit_sigmoid(Sb, L, kb):
|
|
|
146
146
|
|
|
147
147
|
The "normalized" sigmoid, `S1`, is symmetric around 0, and `S1(-∞)=0` and `S1(∞)=1`.
|
|
148
148
|
|
|
149
|
-
The sigmoid `S(k) = S1(a*(k-kb) + b)` is fitted
|
|
149
|
+
The sigmoid `S(k) = S1(a*(k-kb) + b)` is fitted with
|
|
150
150
|
|
|
151
151
|
- `a` corresponding to a given corr. length `L`.
|
|
152
152
|
- `b` to match values of `S(kb)` and `Sb`
|
|
153
|
+
|
|
154
|
+
<figure markdown="span">
|
|
155
|
+
{ width="300" }
|
|
156
|
+
<figcaption>Illustration</figcaption>
|
|
157
|
+
</figure>
|
|
153
158
|
"""
|
|
154
159
|
|
|
155
160
|
def sigmoid(k):
|