dapper 1.7.0__tar.gz → 1.7.1__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.1/PKG-INFO +107 -0
  2. {dapper-1.7.0 → dapper-1.7.1}/README.md +34 -35
  3. dapper-1.7.1/dapper/README.md +17 -0
  4. {dapper-1.7.0 → dapper-1.7.1}/dapper/__init__.py +2 -2
  5. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/README.md +2 -4
  6. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/__init__.py +6 -6
  7. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/baseline.py +7 -2
  8. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/ensemble.py +20 -20
  9. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/other.py +3 -3
  10. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/particle.py +10 -11
  11. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/variational.py +10 -10
  12. {dapper-1.7.0 → dapper-1.7.1}/dapper/dpr_config.py +11 -9
  13. {dapper-1.7.0 → dapper-1.7.1}/dapper/dpr_config.yaml +0 -5
  14. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/DoublePendulum/__init__.py +1 -0
  15. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/KS/bocquet2019.py +2 -2
  16. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/KS/demo.py +1 -1
  17. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LA/__init__.py +2 -1
  18. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LA/evensen2009.py +3 -3
  19. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LA/raanes2015.py +1 -1
  20. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz05/__init__.py +7 -6
  21. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/anderson2010rhf.py +1 -1
  22. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/bocquet2012.py +1 -1
  23. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/mandel2016.py +1 -1
  24. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/sakov2012.py +1 -1
  25. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/wiljes2017.py +1 -1
  26. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz84/__init__.py +1 -1
  27. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz84/harder.py +1 -1
  28. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz84/pajonk2012.py +1 -1
  29. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/__init__.py +1 -1
  30. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/anderson2009.py +1 -1
  31. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/bocquet2010.py +1 -1
  32. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/bocquet2010_m40.py +1 -1
  33. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/bocquet2015loc.py +2 -2
  34. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/frei2013bridging.py +4 -4
  35. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/hoteit2015.py +1 -1
  36. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/miyoshi2011.py +1 -1
  37. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/pinheiro2019.py +1 -1
  38. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/raanes2016.py +1 -1
  39. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/sakov2008.py +6 -6
  40. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/todter2015.py +1 -1
  41. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/todter2015_G.py +1 -1
  42. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96s/__init__.py +6 -6
  43. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96s/grudzien2020.py +1 -1
  44. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/__init__.py +2 -2
  45. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/illust_LorenzUV.py +6 -2
  46. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/lorenz96.py +1 -1
  47. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/wilks05.py +1 -1
  48. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LotkaVolterra/__init__.py +1 -1
  49. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/__init__.py +1 -1
  50. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/counillon2009.py +1 -1
  51. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/README.md +4 -4
  52. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/illust_obs.py +1 -1
  53. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/sakov2008.py +1 -1
  54. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/README.md +26 -29
  55. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/VL20/__init__.py +1 -1
  56. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/VL20/demo.py +1 -1
  57. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/__init__.py +69 -59
  58. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/integration.py +12 -6
  59. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/utils.py +21 -20
  60. {dapper-1.7.0 → dapper-1.7.1}/dapper/stats.py +159 -31
  61. dapper-1.7.1/dapper/stats_etc.md +84 -0
  62. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/chronos.py +4 -4
  63. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/colors.py +2 -1
  64. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/linalg.py +2 -2
  65. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/liveplotting.py +3 -3
  66. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/localization.py +6 -6
  67. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/matrices.py +4 -4
  68. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/multiproc.py +3 -3
  69. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/randvars.py +2 -2
  70. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/remote/README.md +61 -48
  71. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/remote/uplink.py +2 -1
  72. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/rounding.py +12 -7
  73. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/series.py +4 -3
  74. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/viz.py +95 -80
  75. {dapper-1.7.0 → dapper-1.7.1}/dapper/xp_launch.py +29 -28
  76. {dapper-1.7.0 → dapper-1.7.1}/dapper/xp_process.py +37 -29
  77. dapper-1.7.1/dapper.egg-info/PKG-INFO +107 -0
  78. {dapper-1.7.0 → dapper-1.7.1}/dapper.egg-info/SOURCES.txt +1 -2
  79. {dapper-1.7.0 → dapper-1.7.1}/dapper.egg-info/requires.txt +32 -14
  80. {dapper-1.7.0 → dapper-1.7.1}/dapper.egg-info/top_level.txt +0 -1
  81. {dapper-1.7.0 → dapper-1.7.1}/pyproject.toml +1 -1
  82. {dapper-1.7.0 → dapper-1.7.1}/setup.py +36 -15
  83. {dapper-1.7.0 → dapper-1.7.1}/tests/test_data.py +2 -2
  84. {dapper-1.7.0 → dapper-1.7.1}/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.1}/LICENCE.txt +0 -0
  91. {dapper-1.7.0 → dapper-1.7.1}/dapper/da_methods/extended.py +0 -0
  92. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/DoublePendulum/demo.py +0 -0
  93. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/DoublePendulum/settings101.py +0 -0
  94. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Id/__init__.py +0 -0
  95. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Ikeda/__init__.py +0 -0
  96. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Ikeda/demo.py +0 -0
  97. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Ikeda/some_settings_01.py +0 -0
  98. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/KS/__init__.py +0 -0
  99. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/KS/compare_schemes.py +0 -0
  100. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LA/demo.py +0 -0
  101. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LA/small.py +0 -0
  102. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz05/demo.py +0 -0
  103. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz05/settings01.py +0 -0
  104. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/__init__.py +0 -0
  105. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/demo.py +0 -0
  106. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/extras.py +0 -0
  107. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz63/ramgraber2022.py +0 -0
  108. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz84/demo.py +0 -0
  109. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/demo.py +0 -0
  110. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/extras.py +0 -0
  111. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/spantini2019.py +0 -0
  112. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/Lorenz96/spectral_obs.py +0 -0
  113. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/demo.py +0 -0
  114. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LorenzUV/illust_parameterizations.py +0 -0
  115. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LotkaVolterra/demo.py +0 -0
  116. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/LotkaVolterra/settings101.py +0 -0
  117. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/demo.py +0 -0
  118. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/Makefile +0 -0
  119. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/__init__.py +0 -0
  120. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/calc.f90 +0 -0
  121. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/data.f90 +0 -0
  122. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/helmholtz.f90 +0 -0
  123. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/interface.f90 +0 -0
  124. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/nfw.f90 +0 -0
  125. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/parameters.f90 +0 -0
  126. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_cou09_ens.txt +0 -0
  127. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_cou09_truth.txt +0 -0
  128. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_counillon2009_ens.txt +0 -0
  129. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_counillon2009_truth.txt +0 -0
  130. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_sak08.txt +0 -0
  131. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_sakov2008.txt +0 -0
  132. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_sample_generation.txt +0 -0
  133. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/prms_test_model.txt +0 -0
  134. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/qg.f90 +0 -0
  135. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/qgflux.f90 +0 -0
  136. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/qgstep.f90 +0 -0
  137. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/f90/utils.f90 +0 -0
  138. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/QG/governing_eqn.png +0 -0
  139. {dapper-1.7.0 → dapper-1.7.1}/dapper/mods/explore_props.py +0 -0
  140. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/__init__.py +0 -0
  141. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/datafiles.py +0 -0
  142. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/progressbar.py +0 -0
  143. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/remote/__init__.py +0 -0
  144. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/remote/autoscaler.py +0 -0
  145. {dapper-1.7.0 → dapper-1.7.1}/dapper/tools/seeding.py +0 -0
  146. {dapper-1.7.0 → dapper-1.7.1}/dapper.egg-info/dependency_links.txt +0 -0
  147. {dapper-1.7.0 → dapper-1.7.1}/setup.cfg +0 -0
  148. {dapper-1.7.0 → dapper-1.7.1}/tests/__init__.py +0 -0
  149. {dapper-1.7.0 → dapper-1.7.1}/tests/test_HMMs.py +0 -0
  150. {dapper-1.7.0 → dapper-1.7.1}/tests/test_TLMs.py +0 -0
  151. {dapper-1.7.0 → dapper-1.7.1}/tests/test_demos.py +0 -0
  152. {dapper-1.7.0 → dapper-1.7.1}/tests/test_example_2.py +0 -0
  153. {dapper-1.7.0 → dapper-1.7.1}/tests/test_iEnKS.py +0 -0
  154. {dapper-1.7.0 → dapper-1.7.1}/tests/test_localization.py +0 -0
  155. {dapper-1.7.0 → dapper-1.7.1}/tests/test_matrices.py +0 -0
  156. {dapper-1.7.0 → dapper-1.7.1}/tests/test_operator.py +0 -0
  157. {dapper-1.7.0 → dapper-1.7.1}/tests/test_plotting.py +0 -0
  158. {dapper-1.7.0 → dapper-1.7.1}/tests/test_printing.py +0 -0
  159. {dapper-1.7.0 → dapper-1.7.1}/tests/test_randvars.py +0 -0
  160. {dapper-1.7.0 → dapper-1.7.1}/tests/test_rng.py +0 -0
dapper-1.7.1/PKG-INFO ADDED
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.4
2
+ Name: dapper
3
+ Version: 1.7.1
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.9
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" 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`.
@@ -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`
@@ -144,16 +143,16 @@ you'll first need to run `conda activate dapper-env`
144
143
  <!-- markdownlint-disable line-length -->
145
144
  Method | Literature reproduced
146
145
  ------------------------------------------------------ | ------------------------
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)
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)
157
156
  4D-Var |
158
157
  3D-Var |
159
158
  Extended KF |
@@ -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" height="120" />
357
+ <img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/nceologo1000.png?raw=true" height="100">
358
+ <img src="https://github.com/nansencenter/DAPPER/raw/master/docs/images/logos/CW3E-Logo-Horizontal-FullColor.png?raw=true" 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.1"
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):
@@ -28,7 +28,7 @@ class ens_method:
28
28
  class EnKF:
29
29
  """The ensemble Kalman filter.
30
30
 
31
- Refs: `bib.evensen2009ensemble`.
31
+ Refs: [evensen2009a][].
32
32
  """
33
33
 
34
34
  upd_a: str
@@ -67,8 +67,8 @@ def EnKF_analysis(E, Eo, hnoise, y, upd_a, stats=None, ko=None):
67
67
  This implementation includes several flavours and forms,
68
68
  specified by `upd_a`.
69
69
 
70
- Main references: `bib.sakov2008deterministic`,
71
- `bib.sakov2008implications`, `bib.hoteit2015mitigating`
70
+ Main references: [sakov2008b][],
71
+ [sakov2008a][], [hoteit2015a][]
72
72
  """
73
73
  R = hnoise.C # Obs noise cov
74
74
  N, Nx = E.shape # Dimensionality
@@ -113,7 +113,7 @@ def EnKF_analysis(E, Eo, hnoise, y, upd_a, stats=None, ko=None):
113
113
  d = pad0(s**2, N) + N1
114
114
  Pw = (V * d ** (-1.0)) @ V.T
115
115
  T = (V * d ** (-0.5)) @ V.T * sqrt(N1)
116
- # docs/snippets/trHK.jpg
116
+ # docs/images/snippets/trHK.jpg
117
117
  trHK = np.sum((s**2 + N1) ** (-1.0) * s**2)
118
118
  elif "sS" in upd_a:
119
119
  # Same as 'svd', but with slightly different notation
@@ -123,7 +123,7 @@ def EnKF_analysis(E, Eo, hnoise, y, upd_a, stats=None, ko=None):
123
123
  d = pad0(s**2, N) + 1
124
124
  Pw = (V * d ** (-1.0)) @ V.T / N1 # = G/(N1)
125
125
  T = (V * d ** (-0.5)) @ V.T
126
- # docs/snippets/trHK.jpg
126
+ # docs/images/snippets/trHK.jpg
127
127
  trHK = np.sum((s**2 + 1) ** (-1.0) * s**2)
128
128
  else: # 'eig' in upd_a:
129
129
  # Implementation using eig. val. decomp.
@@ -261,7 +261,7 @@ def post_process(E, infl, rot):
261
261
  def add_noise(E, dt, noise, method):
262
262
  """Treatment of additive noise for ensembles.
263
263
 
264
- Refs: `bib.raanes2014ext`
264
+ Refs: [raanes2014][]
265
265
  """
266
266
  if noise.C == 0:
267
267
  return E
@@ -354,7 +354,7 @@ def add_noise(E, dt, noise, method):
354
354
  class EnKS:
355
355
  """The ensemble Kalman smoother.
356
356
 
357
- Refs: `bib.evensen2009ensemble`
357
+ Refs: [evensen2009a][]
358
358
 
359
359
  The only difference to the EnKF
360
360
  is the management of the lag and the reshapings.
@@ -414,7 +414,7 @@ class EnKS:
414
414
  class EnRTS:
415
415
  """EnRTS (Rauch-Tung-Striebel) smoother.
416
416
 
417
- Refs: `bib.raanes2016thesis`
417
+ Refs: [raanes2016thesis][]
418
418
  """
419
419
 
420
420
  upd_a: str
@@ -484,7 +484,7 @@ def serial_inds(upd_a, y, cvR, A):
484
484
  class SL_EAKF:
485
485
  """Serial, covariance-localized EAKF.
486
486
 
487
- Refs: `bib.karspeck2007experimental`.
487
+ Refs: [karspeck2007][].
488
488
 
489
489
  In contrast with LETKF, this iterates over the observations rather
490
490
  than over the state (batches).
@@ -614,10 +614,10 @@ def local_analyses(E, Eo, R, y, state_batches, obs_taperer, mp=map, xN=None, g=0
614
614
  class LETKF:
615
615
  """Same as EnKF (Sqrt), but with localization.
616
616
 
617
- Refs: `bib.hunt2007efficient`.
617
+ Refs: [hunt2007][].
618
618
 
619
- NB: Multiproc. yields slow-down for `dapper.mods.Lorenz96`,
620
- even with `batch_size=(1,)`. But for `dapper.mods.QG`
619
+ NB: Multiproc. yields slow-down for [`mods.Lorenz96`][],
620
+ even with `batch_size=(1,)`. But for [`mods.QG`][]
621
621
  (`batch_size=(2,2)` or less) it is quicker.
622
622
 
623
623
  NB: If `len(ii)` is small, analysis may be slowed-down with '-N' infl.
@@ -778,7 +778,7 @@ def hyperprior_coeffs(s, N, xN=1, g=0):
778
778
 
779
779
  - Reason 1: mode correction.
780
780
  These parameters bridge the Jeffreys (`xN=1`) and Dirac (`xN=Inf`) hyperpriors
781
- for the prior covariance, B, as discussed in `bib.bocquet2015expanding`.
781
+ for the prior covariance, B, as discussed in [bocquet2015][].
782
782
  Indeed, mode correction becomes necessary when $$ R \rightarrow \infty $$
783
783
  because then there should be no ensemble update (and also no inflation!).
784
784
  More specifically, the mode of `l1`'s should be adjusted towards 1
@@ -790,7 +790,7 @@ def hyperprior_coeffs(s, N, xN=1, g=0):
790
790
  - Reason 2: Boosting the inflation prior's certainty from N to xN*N.
791
791
  The aim is to take advantage of the fact that the ensemble may not
792
792
  have quite as much sampling error as a fully stochastic sample,
793
- as illustrated in section 2.1 of `bib.raanes2019adaptive`.
793
+ as illustrated in section 2.1 of [raanes2019a][].
794
794
 
795
795
  - Its damping effect is similar to work done by J. Anderson.
796
796
 
@@ -809,7 +809,7 @@ def hyperprior_coeffs(s, N, xN=1, g=0):
809
809
  eN = (N + 1) / N
810
810
  cL = (N + g) / N1
811
811
 
812
- # Mode correction (almost) as in eqn 36 of `bib.bocquet2015expanding`
812
+ # Mode correction (almost) as in eqn 36 of [bocquet2015][]
813
813
  prior_mode = eN / cL # Mode of l1 (before correction)
814
814
  diagonal = pad0(s**2, N) + N1 # diag of Y@R.inv@Y + N1*I
815
815
  # (Hessian of J)
@@ -834,7 +834,7 @@ def zeta_a(eN, cL, w):
834
834
  Returns `zeta_a = (N-1)/pre-inflation^2`.
835
835
 
836
836
  Using this inside an iterative minimization as in the
837
- `dapper.da_methods.variational.iEnKS` effectively blends
837
+ [`da_methods.variational.iEnKS`][] effectively blends
838
838
  the distinction between the primal and dual EnKF-N.
839
839
  """
840
840
  N = len(w)
@@ -847,12 +847,12 @@ def zeta_a(eN, cL, w):
847
847
  class EnKF_N:
848
848
  """Finite-size EnKF (EnKF-N).
849
849
 
850
- Refs: `bib.bocquet2011ensemble`, `bib.bocquet2015expanding`
850
+ Refs: [bocquet2011][], [bocquet2015][]
851
851
 
852
852
  This implementation is pedagogical, prioritizing the "dual" form.
853
853
  In consequence, the efficiency of the "primal" form suffers a bit.
854
854
  The primal form is included for completeness and to demonstrate equivalence.
855
- In `dapper.da_methods.variational.iEnKS`, however,
855
+ In [`da_methods.variational.iEnKS`][], however,
856
856
  the primal form is preferred because it
857
857
  already does optimization for w (as treatment for nonlinear models).
858
858
 
@@ -985,7 +985,7 @@ class EnKF_N:
985
985
  # l1 = 1.0
986
986
 
987
987
  # Explicitly inflate prior
988
- # => formulae look different from `bib.bocquet2015expanding`.
988
+ # => formulae look different from [bocquet2015][].
989
989
  A *= l1
990
990
  Y *= l1
991
991
 
@@ -1000,7 +1000,7 @@ class EnKF_N:
1000
1000
  else:
1001
1001
  # Also include angular-radial co-dependence.
1002
1002
  # Note: denominator not squared coz
1003
- # unlike `bib.bocquet2015expanding` we have inflated Y.
1003
+ # unlike [bocquet2015][] we have inflated Y.
1004
1004
  Hw = (
1005
1005
  Y @ R.inv @ Y.T / N1
1006
1006
  + eye(N)
@@ -15,7 +15,7 @@ from .ensemble import ens_method
15
15
  class RHF:
16
16
  """Rank histogram filter.
17
17
 
18
- Refs: `bib.anderson2010non`.
18
+ Refs: [anderson2010][].
19
19
 
20
20
  Quick & dirty implementation without attention to (de)tails.
21
21
  """
@@ -86,9 +86,9 @@ class RHF:
86
86
  class LNETF:
87
87
  """The Nonlinear-Ensemble-Transform-Filter (localized).
88
88
 
89
- Refs: `bib.wiljes2016second`, `bib.todter2015second`.
89
+ Refs: [wiljes2016][], [todter2015a][].
90
90
 
91
- It is (supposedly) a deterministic upgrade of the NLEAF of `bib.lei2011moment`.
91
+ It is (supposedly) a deterministic upgrade of the NLEAF of [lei2011][].
92
92
  """
93
93
 
94
94
  N: int
@@ -23,7 +23,7 @@ class particle_method:
23
23
  class PartFilt:
24
24
  r"""Particle filter ≡ Sequential importance (re)sampling SIS (SIR).
25
25
 
26
- Refs: `bib.wikle2007bayesian`, `bib.van2009particle`, `bib.chen2003bayesian`
26
+ Refs: [wikle2007][], [van2009][], [chen2003][]
27
27
 
28
28
  This is the bootstrap version: the proposal density is just
29
29
 
@@ -37,7 +37,7 @@ class PartFilt:
37
37
  - qroot: "Inflate" (anneal) the proposal noise kernels
38
38
  by this root to increase diversity.
39
39
  The weights are updated to maintain un-biased-ness.
40
- See `bib.chen2003bayesian`, section VI-M.2
40
+ See [chen2003][], section VI-M.2
41
41
  """
42
42
 
43
43
  N: int
@@ -92,11 +92,10 @@ class PartFilt:
92
92
  class OptPF:
93
93
  """'Optimal proposal' particle filter, also known as 'Implicit particle filter'.
94
94
 
95
- Ref: `bib.bocquet2010beyond`.
95
+ Ref: [bocquet2010a][].
96
96
 
97
- .. note:: Regularization (`Qs`) is here added BEFORE Bayes' rule.
98
- If `Qs==0`: OptPF should be equal to
99
- the bootstrap filter `PartFilt`.
97
+ !!! note Regularization (`Qs`) is here added BEFORE Bayes' rule.
98
+ If `Qs==0`: OptPF should be equal to the bootstrap filter `PartFilt`.
100
99
  """
101
100
 
102
101
  N: int
@@ -521,7 +520,7 @@ def mask_unique_of_sorted(idx):
521
520
  def auto_bandw(N, M):
522
521
  """Optimal bandwidth (not bandwidth^2), as per Scott's rule-of-thumb.
523
522
 
524
- Refs: `bib.doucet2001sequential` section 12.2.2, [Wik17]_ section "Rule_of_thumb"
523
+ Refs: [doucet2001sequential][] section 12.2.2, [Wik17]_ section "Rule_of_thumb"
525
524
  """
526
525
  return N ** (-1 / (M + 4))
527
526
 
@@ -535,7 +534,7 @@ def regularize(C12, E, idx, no_uniq_jitter):
535
534
  (so-named because Dirac-deltas are approximated Gaussian kernels),
536
535
  which controls the strength of the jitter.
537
536
  This causes a bias. But, as N-->∞, the reg. bandwidth-->0, i.e. bias-->0.
538
- Ref: `bib.doucet2001sequential`, section 12.2.2.
537
+ Ref: [doucet2001sequential][], section 12.2.2.
539
538
  """
540
539
  # Select
541
540
  E = E[idx]
@@ -555,7 +554,7 @@ def regularize(C12, E, idx, no_uniq_jitter):
555
554
  def resample(w, kind="Systematic", N=None, wroot=1.0):
556
555
  """Multinomial resampling.
557
556
 
558
- Refs: `bib.doucet2009tutorial`, `bib.van2009particle`, `bib.liu2001theoretical`.
557
+ Refs: [doucet2009][], [van2009][], [liu2001theoretical][].
559
558
 
560
559
  - kind: 'Systematic', 'Residual' or 'Stochastic'.
561
560
  'Stochastic' corresponds to `rng.choice` or `rng.multinomial`.
@@ -564,7 +563,7 @@ def resample(w, kind="Systematic", N=None, wroot=1.0):
564
563
  Among the three, 'Systematic' is fastest, introduces the least noise,
565
564
  and brings continuity benefits for localized particle filters,
566
565
  and is therefore generally prefered.
567
- Example: see docs/snippets/ex_resample.py.
566
+ Example: see `docs/images/snippets/ex_resample.py`.
568
567
 
569
568
  - N can be different from len(w)
570
569
  (e.g. in case some particles have been elimintated).
@@ -572,7 +571,7 @@ def resample(w, kind="Systematic", N=None, wroot=1.0):
572
571
  - wroot: Adjust weights before resampling by this root to
573
572
  promote particle diversity and mitigate thinning.
574
573
  The outcomes of the resampling are then weighted to maintain un-biased-ness.
575
- Ref: `bib.liu2001theoretical`, section 3.1
574
+ Ref: [liu2001theoretical][], section 3.1
576
575
 
577
576
  Note: (a) resampling methods are beneficial because they discard
578
577
  low-weight ("doomed") particles and reduce the variance of the weights.