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.
Files changed (160) hide show
  1. dapper-1.7.2/PKG-INFO +107 -0
  2. {dapper-1.7.0 → dapper-1.7.2}/README.md +90 -91
  3. dapper-1.7.2/dapper/README.md +17 -0
  4. {dapper-1.7.0 → dapper-1.7.2}/dapper/__init__.py +2 -2
  5. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/README.md +2 -4
  6. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/__init__.py +6 -6
  7. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/baseline.py +7 -2
  8. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/ensemble.py +20 -20
  9. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/other.py +3 -3
  10. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/particle.py +10 -11
  11. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/variational.py +10 -10
  12. {dapper-1.7.0 → dapper-1.7.2}/dapper/dpr_config.py +11 -9
  13. {dapper-1.7.0 → dapper-1.7.2}/dapper/dpr_config.yaml +0 -5
  14. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/__init__.py +1 -0
  15. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/bocquet2019.py +2 -2
  16. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/demo.py +1 -1
  17. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/__init__.py +2 -1
  18. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/evensen2009.py +3 -3
  19. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/raanes2015.py +1 -1
  20. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/__init__.py +7 -6
  21. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/anderson2010rhf.py +1 -1
  22. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/bocquet2012.py +1 -1
  23. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/mandel2016.py +1 -1
  24. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/sakov2012.py +1 -1
  25. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/wiljes2017.py +1 -1
  26. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/__init__.py +1 -1
  27. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/harder.py +1 -1
  28. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/pajonk2012.py +1 -1
  29. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/__init__.py +1 -1
  30. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/anderson2009.py +1 -1
  31. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2010.py +1 -1
  32. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2010_m40.py +1 -1
  33. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/bocquet2015loc.py +2 -2
  34. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/frei2013bridging.py +4 -4
  35. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/hoteit2015.py +1 -1
  36. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/miyoshi2011.py +1 -1
  37. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/pinheiro2019.py +1 -1
  38. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/raanes2016.py +1 -1
  39. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/sakov2008.py +6 -6
  40. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/todter2015.py +1 -1
  41. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/todter2015_G.py +1 -1
  42. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96s/__init__.py +6 -6
  43. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96s/grudzien2020.py +1 -1
  44. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/__init__.py +2 -2
  45. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/illust_LorenzUV.py +6 -2
  46. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/lorenz96.py +1 -1
  47. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/wilks05.py +1 -1
  48. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/__init__.py +1 -1
  49. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/__init__.py +1 -1
  50. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/counillon2009.py +1 -1
  51. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/README.md +4 -4
  52. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/illust_obs.py +1 -1
  53. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/sakov2008.py +1 -1
  54. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/README.md +26 -29
  55. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/VL20/__init__.py +1 -1
  56. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/VL20/demo.py +1 -1
  57. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/__init__.py +69 -59
  58. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/integration.py +12 -6
  59. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/utils.py +21 -20
  60. {dapper-1.7.0 → dapper-1.7.2}/dapper/stats.py +159 -31
  61. dapper-1.7.2/dapper/stats_etc.md +84 -0
  62. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/chronos.py +4 -4
  63. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/colors.py +2 -1
  64. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/linalg.py +2 -2
  65. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/liveplotting.py +3 -3
  66. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/localization.py +6 -6
  67. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/matrices.py +4 -4
  68. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/multiproc.py +3 -3
  69. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/randvars.py +2 -2
  70. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/README.md +61 -48
  71. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/uplink.py +2 -1
  72. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/rounding.py +12 -7
  73. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/series.py +4 -3
  74. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/viz.py +95 -80
  75. {dapper-1.7.0 → dapper-1.7.2}/dapper/xp_launch.py +29 -28
  76. {dapper-1.7.0 → dapper-1.7.2}/dapper/xp_process.py +37 -29
  77. dapper-1.7.2/dapper.egg-info/PKG-INFO +107 -0
  78. {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/SOURCES.txt +1 -2
  79. {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/requires.txt +32 -14
  80. {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/top_level.txt +0 -1
  81. {dapper-1.7.0 → dapper-1.7.2}/pyproject.toml +1 -1
  82. {dapper-1.7.0 → dapper-1.7.2}/setup.py +37 -16
  83. {dapper-1.7.0 → dapper-1.7.2}/tests/test_data.py +2 -2
  84. {dapper-1.7.0 → dapper-1.7.2}/tests/test_round2.py +3 -2
  85. dapper-1.7.0/PKG-INFO +0 -29
  86. dapper-1.7.0/dapper/README.md +0 -43
  87. dapper-1.7.0/dapper.egg-info/PKG-INFO +0 -29
  88. dapper-1.7.0/examples/basic_1.py +0 -102
  89. dapper-1.7.0/examples/basic_2.py +0 -87
  90. {dapper-1.7.0 → dapper-1.7.2}/LICENCE.txt +0 -0
  91. {dapper-1.7.0 → dapper-1.7.2}/dapper/da_methods/extended.py +0 -0
  92. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/demo.py +0 -0
  93. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/DoublePendulum/settings101.py +0 -0
  94. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Id/__init__.py +0 -0
  95. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/__init__.py +0 -0
  96. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/demo.py +0 -0
  97. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Ikeda/some_settings_01.py +0 -0
  98. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/__init__.py +0 -0
  99. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/KS/compare_schemes.py +0 -0
  100. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/demo.py +0 -0
  101. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LA/small.py +0 -0
  102. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/demo.py +0 -0
  103. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz05/settings01.py +0 -0
  104. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/__init__.py +0 -0
  105. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/demo.py +0 -0
  106. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/extras.py +0 -0
  107. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz63/ramgraber2022.py +0 -0
  108. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz84/demo.py +0 -0
  109. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/demo.py +0 -0
  110. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/extras.py +0 -0
  111. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/spantini2019.py +0 -0
  112. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/Lorenz96/spectral_obs.py +0 -0
  113. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/demo.py +0 -0
  114. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LorenzUV/illust_parameterizations.py +0 -0
  115. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/demo.py +0 -0
  116. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/LotkaVolterra/settings101.py +0 -0
  117. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/demo.py +0 -0
  118. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/Makefile +0 -0
  119. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/__init__.py +0 -0
  120. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/calc.f90 +0 -0
  121. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/data.f90 +0 -0
  122. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/helmholtz.f90 +0 -0
  123. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/interface.f90 +0 -0
  124. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/nfw.f90 +0 -0
  125. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/parameters.f90 +0 -0
  126. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_cou09_ens.txt +0 -0
  127. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_cou09_truth.txt +0 -0
  128. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_counillon2009_ens.txt +0 -0
  129. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_counillon2009_truth.txt +0 -0
  130. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sak08.txt +0 -0
  131. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sakov2008.txt +0 -0
  132. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_sample_generation.txt +0 -0
  133. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/prms_test_model.txt +0 -0
  134. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qg.f90 +0 -0
  135. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qgflux.f90 +0 -0
  136. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/qgstep.f90 +0 -0
  137. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/f90/utils.f90 +0 -0
  138. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/QG/governing_eqn.png +0 -0
  139. {dapper-1.7.0 → dapper-1.7.2}/dapper/mods/explore_props.py +0 -0
  140. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/__init__.py +0 -0
  141. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/datafiles.py +0 -0
  142. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/progressbar.py +0 -0
  143. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/__init__.py +0 -0
  144. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/remote/autoscaler.py +0 -0
  145. {dapper-1.7.0 → dapper-1.7.2}/dapper/tools/seeding.py +0 -0
  146. {dapper-1.7.0 → dapper-1.7.2}/dapper.egg-info/dependency_links.txt +0 -0
  147. {dapper-1.7.0 → dapper-1.7.2}/setup.cfg +0 -0
  148. {dapper-1.7.0 → dapper-1.7.2}/tests/__init__.py +0 -0
  149. {dapper-1.7.0 → dapper-1.7.2}/tests/test_HMMs.py +0 -0
  150. {dapper-1.7.0 → dapper-1.7.2}/tests/test_TLMs.py +0 -0
  151. {dapper-1.7.0 → dapper-1.7.2}/tests/test_demos.py +0 -0
  152. {dapper-1.7.0 → dapper-1.7.2}/tests/test_example_2.py +0 -0
  153. {dapper-1.7.0 → dapper-1.7.2}/tests/test_iEnKS.py +0 -0
  154. {dapper-1.7.0 → dapper-1.7.2}/tests/test_localization.py +0 -0
  155. {dapper-1.7.0 → dapper-1.7.2}/tests/test_matrices.py +0 -0
  156. {dapper-1.7.0 → dapper-1.7.2}/tests/test_operator.py +0 -0
  157. {dapper-1.7.0 → dapper-1.7.2}/tests/test_plotting.py +0 -0
  158. {dapper-1.7.0 → dapper-1.7.2}/tests/test_printing.py +0 -0
  159. {dapper-1.7.0 → dapper-1.7.2}/tests/test_randvars.py +0 -0
  160. {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/imgs/logo_wtxt.png" align="left" width="250"/>
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
- [Install](#installation), then
30
- read, run and try to understand `examples/basic_{1,2,3}.py`.
31
- Some of the examples also exist as Jupyter notebooks, and can be run in the cloud
32
- *without installation* (but requiring Google login): [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/nansencenter/DAPPER).
33
- This [screencast](https://www.youtube.com/watch?v=YtalK0Zkzvg&t=6475s)
34
- provides an overview to DAPPER.
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 [![DOI](https://joss.theoj.org/papers/10.21105/joss.05150/status.svg)](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 [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](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 [![DOI](https://joss.theoj.org/papers/10.21105/joss.05150/status.svg)](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
- ![Comparative benchmarks with Lorenz-96 plotted as a function of the ensemble size (N)](./docs/imgs/ex3.svg)
61
+ ![Comparative benchmarks with Lorenz-96 plotted as a function of the ensemble size (N)](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
- ![EnKF - Lorenz-96](./docs/imgs/ex1.jpg)
74
+ ![EnKF - Lorenz-96](https://github.com/nansencenter/DAPPER/raw/master/docs/images/ex1.jpg)
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.9
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 | Literature reproduced
146
- ------------------------------------------------------ | ------------------------
147
- EnKF <sup>1</sup> | [Sakov08](https://nansencenter.github.io/DAPPER/bib.html#bib.sakov2008deterministic), [Hoteit15](https://nansencenter.github.io/DAPPER/bib.html#bib.hoteit2015mitigating), [Grudzien2020](https://nansencenter.github.io/DAPPER/bib.html#bib.grudzien2020numerical)
148
- EnKF-N | [Bocquet12](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2012combining), [Bocquet15](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2015expanding)
149
- EnKS, EnRTS | [Raanes2016](https://nansencenter.github.io/DAPPER/bib.html#bib.raanes2016thesis)
150
- iEnKS / iEnKF / EnRML / ES-MDA <sup>2</sup> | [Sakov12](https://nansencenter.github.io/DAPPER/bib.html#bib.sakov2012iterative), [Bocquet12](https://nansencenter.github.io/DAPPER/bib.html#bib.Bocquet12), [Bocquet14](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2014iterative)
151
- LETKF, local & serial EAKF | [Bocquet11](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2011ensemble)
152
- Sqrt. model noise methods | [Raanes2014](https://nansencenter.github.io/DAPPER/bib.html#bib.raanes2014ext)
153
- Particle filter (bootstrap) <sup>3</sup> | [Bocquet10](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2010beyond)
154
- Optimal/implicit Particle filter <sup>3</sup> | [Bocquet10](https://nansencenter.github.io/DAPPER/bib.html#bib.bocquet2010beyond)
155
- NETF | [Tödter15](https://nansencenter.github.io/DAPPER/bib.html#bib.todter2015second), [Wiljes16](https://nansencenter.github.io/DAPPER/bib.html#bib.wiljes2016second)
156
- Rank histogram filter (RHF) | [Anderson10](https://nansencenter.github.io/DAPPER/bib.html#bib.anderson2010non)
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** | PDE? | Phys.dim. | State len | Lyap≥0 | Implementer
188
- ----------- | --- | ----- | ---- | --------- | --------- | ------ | ----------
189
- Id | Yes | Yes | No | N/A | * | 0 | Raanes
190
- Linear Advect. (LA) | Yes | Yes | Yes | 1d | 1000 * | 51 | Evensen/Raanes
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 * | 1 | Wikipedia/Raanes
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 * | 13 | Raanes
197
- Lorenz96s | No | Yes | No | 1d | 10 * | 4 | Grudzien
198
- LorenzUV | No | Yes | No | 2x 1d | 256 + 8 * | ≈60 | Raanes
199
- LorenzIII | No | No | No | 1d | 960 * | ≈164 | Raanes
200
- Vissio-Lucarini 20 | No | Yes | No | 1d | 36 * | 10 | Yumeng
201
- Kuramoto-Sivashinsky | No | Yes | Yes | 1d | 128 * | 11 | Kassam/Raanes
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 | General
254
- [PDAF][7] | AWI | General
255
- [JEDI][21] | JCSDA (NOAA, NASA, ++)| General
256
- [OpenDA][3] | TU Delft | General
257
- [EMPIRE][4] | Reading (Met) | General
258
- [ERT][2] | Statoil | History matching (Petroleum DA)
259
- [PIPT][14] | CIPR | History matching (Petroleum DA)
260
- [MIKE][9] | DHI | Oceanographic
261
- [OAK][10] | Liège | Oceanographic
262
- [Siroco][11] | OMP | Oceanographic
263
- [Verdandi][6] | INRIA | Biophysical DA
264
- [PyOSSE][8] | Edinburgh, Reading | Earth-observation DA
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
- ![NORCE](./docs/imgs/norce-logo.png)
356
- ![NERSC](./docs/imgs/nansen-logo.png)
357
- <img src="https://github.com/nansencenter/DAPPER/blob/master/docs/imgs/UoR-logo.png?raw=true" height="120" />
358
- <img src="https://github.com/nansencenter/DAPPER/blob/master/docs/imgs/nceologo1000.png?raw=true" height="100">
359
- <img src="./docs/imgs/CW3E-Logo-Horizontal-FullColor.png?raw=true" width="400">
354
+ ![NORCE](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/norce-logo.png)
355
+ ![NERSC](https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nansen-logo.png)
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
- .. include:: ./README.md
4
+ --8<-- "dapper/README.md"
5
5
  """
6
6
 
7
- __version__ = "1.7.0"
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 the section on
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
- `dapper.da_methods.ensemble.EnKF`.
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
- .. include:: ./README.md
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
- .. note::
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
- Example:
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
- .. note::
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 `dapper.xp_launch.run_experiment`).
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 `bib.raanes2016thesis`.
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 (see docs/snippets/sigmoid.jpg) with
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
+ ![](../../images/snippets/sigmoid.jpg){ width="300" }
156
+ <figcaption>Illustration</figcaption>
157
+ </figure>
153
158
  """
154
159
 
155
160
  def sigmoid(k):