HydPy 6.2.dev1__cp313-cp313-win_amd64.whl

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 (890) hide show
  1. hydpy/__init__.py +275 -0
  2. hydpy/aliases.py +2554 -0
  3. hydpy/auxs/__init__.py +0 -0
  4. hydpy/auxs/anntools.py +1305 -0
  5. hydpy/auxs/armatools.py +883 -0
  6. hydpy/auxs/calibtools.py +3337 -0
  7. hydpy/auxs/interptools.py +1094 -0
  8. hydpy/auxs/iuhtools.py +543 -0
  9. hydpy/auxs/networktools.py +597 -0
  10. hydpy/auxs/ppolytools.py +809 -0
  11. hydpy/auxs/quadtools.py +61 -0
  12. hydpy/auxs/roottools.py +228 -0
  13. hydpy/auxs/smoothtools.py +273 -0
  14. hydpy/auxs/statstools.py +2125 -0
  15. hydpy/auxs/validtools.py +81 -0
  16. hydpy/conf/HydPyConfigBase.xsd +68637 -0
  17. hydpy/conf/HydPyConfigBase.xsdt +358 -0
  18. hydpy/conf/HydPyConfigMultipleRuns.xsd +25 -0
  19. hydpy/conf/HydPyConfigSingleRun.xsd +24 -0
  20. hydpy/conf/__init__.py +0 -0
  21. hydpy/conf/a_coefficients_explicit_lobatto_sequence.npy +0 -0
  22. hydpy/conf/support_points_for_smoothpar_logistic2.npy +0 -0
  23. hydpy/config.py +42 -0
  24. hydpy/core/__init__.py +0 -0
  25. hydpy/core/aliastools.py +214 -0
  26. hydpy/core/autodoctools.py +1947 -0
  27. hydpy/core/auxfiletools.py +1169 -0
  28. hydpy/core/devicetools.py +3810 -0
  29. hydpy/core/exceptiontools.py +269 -0
  30. hydpy/core/filetools.py +1985 -0
  31. hydpy/core/hydpytools.py +3089 -0
  32. hydpy/core/importtools.py +1398 -0
  33. hydpy/core/indextools.py +345 -0
  34. hydpy/core/itemtools.py +1849 -0
  35. hydpy/core/masktools.py +460 -0
  36. hydpy/core/modeltools.py +4868 -0
  37. hydpy/core/netcdftools.py +2683 -0
  38. hydpy/core/objecttools.py +2023 -0
  39. hydpy/core/optiontools.py +1045 -0
  40. hydpy/core/parametertools.py +4674 -0
  41. hydpy/core/printtools.py +222 -0
  42. hydpy/core/propertytools.py +643 -0
  43. hydpy/core/pubtools.py +254 -0
  44. hydpy/core/selectiontools.py +1571 -0
  45. hydpy/core/sequencetools.py +4476 -0
  46. hydpy/core/seriestools.py +339 -0
  47. hydpy/core/testtools.py +2483 -0
  48. hydpy/core/timetools.py +3567 -0
  49. hydpy/core/typingtools.py +333 -0
  50. hydpy/core/variabletools.py +2615 -0
  51. hydpy/cythons/__init__.py +24 -0
  52. hydpy/cythons/annutils.pxd +33 -0
  53. hydpy/cythons/annutils.pyi +25 -0
  54. hydpy/cythons/annutils.pyx +120 -0
  55. hydpy/cythons/autogen/__init__.py +0 -0
  56. hydpy/cythons/autogen/annutils.cp313-win_amd64.pyd +0 -0
  57. hydpy/cythons/autogen/annutils.pxd +42 -0
  58. hydpy/cythons/autogen/annutils.pyx +129 -0
  59. hydpy/cythons/autogen/c_arma.cp313-win_amd64.pyd +0 -0
  60. hydpy/cythons/autogen/c_arma.pxd +179 -0
  61. hydpy/cythons/autogen/c_arma.pyx +356 -0
  62. hydpy/cythons/autogen/c_arma_rimorido.cp313-win_amd64.pyd +0 -0
  63. hydpy/cythons/autogen/c_arma_rimorido.pxd +179 -0
  64. hydpy/cythons/autogen/c_arma_rimorido.pyx +356 -0
  65. hydpy/cythons/autogen/c_conv.cp313-win_amd64.pyd +0 -0
  66. hydpy/cythons/autogen/c_conv.pxd +198 -0
  67. hydpy/cythons/autogen/c_conv.pyx +491 -0
  68. hydpy/cythons/autogen/c_conv_idw.cp313-win_amd64.pyd +0 -0
  69. hydpy/cythons/autogen/c_conv_idw.pxd +124 -0
  70. hydpy/cythons/autogen/c_conv_idw.pyx +264 -0
  71. hydpy/cythons/autogen/c_conv_idw_ed.cp313-win_amd64.pyd +0 -0
  72. hydpy/cythons/autogen/c_conv_idw_ed.pxd +197 -0
  73. hydpy/cythons/autogen/c_conv_idw_ed.pyx +481 -0
  74. hydpy/cythons/autogen/c_conv_nn.cp313-win_amd64.pyd +0 -0
  75. hydpy/cythons/autogen/c_conv_nn.pxd +120 -0
  76. hydpy/cythons/autogen/c_conv_nn.pyx +224 -0
  77. hydpy/cythons/autogen/c_dam.cp313-win_amd64.pyd +0 -0
  78. hydpy/cythons/autogen/c_dam.pxd +805 -0
  79. hydpy/cythons/autogen/c_dam.pyx +1477 -0
  80. hydpy/cythons/autogen/c_dam_llake.cp313-win_amd64.pyd +0 -0
  81. hydpy/cythons/autogen/c_dam_llake.pxd +364 -0
  82. hydpy/cythons/autogen/c_dam_llake.pyx +705 -0
  83. hydpy/cythons/autogen/c_dam_lreservoir.cp313-win_amd64.pyd +0 -0
  84. hydpy/cythons/autogen/c_dam_lreservoir.pxd +365 -0
  85. hydpy/cythons/autogen/c_dam_lreservoir.pyx +708 -0
  86. hydpy/cythons/autogen/c_dam_lretention.cp313-win_amd64.pyd +0 -0
  87. hydpy/cythons/autogen/c_dam_lretention.pxd +340 -0
  88. hydpy/cythons/autogen/c_dam_lretention.pyx +625 -0
  89. hydpy/cythons/autogen/c_dam_pump.cp313-win_amd64.pyd +0 -0
  90. hydpy/cythons/autogen/c_dam_pump.pxd +402 -0
  91. hydpy/cythons/autogen/c_dam_pump.pyx +724 -0
  92. hydpy/cythons/autogen/c_dam_pump_sluice.cp313-win_amd64.pyd +0 -0
  93. hydpy/cythons/autogen/c_dam_pump_sluice.pxd +452 -0
  94. hydpy/cythons/autogen/c_dam_pump_sluice.pyx +829 -0
  95. hydpy/cythons/autogen/c_dam_sluice.cp313-win_amd64.pyd +0 -0
  96. hydpy/cythons/autogen/c_dam_sluice.pxd +404 -0
  97. hydpy/cythons/autogen/c_dam_sluice.pyx +726 -0
  98. hydpy/cythons/autogen/c_dam_v001.cp313-win_amd64.pyd +0 -0
  99. hydpy/cythons/autogen/c_dam_v001.pxd +452 -0
  100. hydpy/cythons/autogen/c_dam_v001.pyx +816 -0
  101. hydpy/cythons/autogen/c_dam_v002.cp313-win_amd64.pyd +0 -0
  102. hydpy/cythons/autogen/c_dam_v002.pxd +394 -0
  103. hydpy/cythons/autogen/c_dam_v002.pyx +703 -0
  104. hydpy/cythons/autogen/c_dam_v003.cp313-win_amd64.pyd +0 -0
  105. hydpy/cythons/autogen/c_dam_v003.pxd +417 -0
  106. hydpy/cythons/autogen/c_dam_v003.pyx +744 -0
  107. hydpy/cythons/autogen/c_dam_v004.cp313-win_amd64.pyd +0 -0
  108. hydpy/cythons/autogen/c_dam_v004.pxd +486 -0
  109. hydpy/cythons/autogen/c_dam_v004.pyx +891 -0
  110. hydpy/cythons/autogen/c_dam_v005.cp313-win_amd64.pyd +0 -0
  111. hydpy/cythons/autogen/c_dam_v005.pxd +524 -0
  112. hydpy/cythons/autogen/c_dam_v005.pyx +928 -0
  113. hydpy/cythons/autogen/c_dummy.cp313-win_amd64.pyd +0 -0
  114. hydpy/cythons/autogen/c_dummy.pxd +151 -0
  115. hydpy/cythons/autogen/c_dummy.pyx +263 -0
  116. hydpy/cythons/autogen/c_dummy_interceptedwater.cp313-win_amd64.pyd +0 -0
  117. hydpy/cythons/autogen/c_dummy_interceptedwater.pxd +69 -0
  118. hydpy/cythons/autogen/c_dummy_interceptedwater.pyx +104 -0
  119. hydpy/cythons/autogen/c_dummy_node2node.cp313-win_amd64.pyd +0 -0
  120. hydpy/cythons/autogen/c_dummy_node2node.pxd +89 -0
  121. hydpy/cythons/autogen/c_dummy_node2node.pyx +148 -0
  122. hydpy/cythons/autogen/c_dummy_snowalbedo.cp313-win_amd64.pyd +0 -0
  123. hydpy/cythons/autogen/c_dummy_snowalbedo.pxd +69 -0
  124. hydpy/cythons/autogen/c_dummy_snowalbedo.pyx +104 -0
  125. hydpy/cythons/autogen/c_dummy_snowcover.cp313-win_amd64.pyd +0 -0
  126. hydpy/cythons/autogen/c_dummy_snowcover.pxd +69 -0
  127. hydpy/cythons/autogen/c_dummy_snowcover.pyx +104 -0
  128. hydpy/cythons/autogen/c_dummy_snowycanopy.cp313-win_amd64.pyd +0 -0
  129. hydpy/cythons/autogen/c_dummy_snowycanopy.pxd +69 -0
  130. hydpy/cythons/autogen/c_dummy_snowycanopy.pyx +104 -0
  131. hydpy/cythons/autogen/c_dummy_soilwater.cp313-win_amd64.pyd +0 -0
  132. hydpy/cythons/autogen/c_dummy_soilwater.pxd +69 -0
  133. hydpy/cythons/autogen/c_dummy_soilwater.pyx +104 -0
  134. hydpy/cythons/autogen/c_evap.cp313-win_amd64.pyd +0 -0
  135. hydpy/cythons/autogen/c_evap.pxd +1029 -0
  136. hydpy/cythons/autogen/c_evap.pyx +2601 -0
  137. hydpy/cythons/autogen/c_evap_aet_hbv96.cp313-win_amd64.pyd +0 -0
  138. hydpy/cythons/autogen/c_evap_aet_hbv96.pxd +227 -0
  139. hydpy/cythons/autogen/c_evap_aet_hbv96.pyx +584 -0
  140. hydpy/cythons/autogen/c_evap_aet_minhas.cp313-win_amd64.pyd +0 -0
  141. hydpy/cythons/autogen/c_evap_aet_minhas.pxd +193 -0
  142. hydpy/cythons/autogen/c_evap_aet_minhas.pyx +478 -0
  143. hydpy/cythons/autogen/c_evap_aet_morsim.cp313-win_amd64.pyd +0 -0
  144. hydpy/cythons/autogen/c_evap_aet_morsim.pxd +681 -0
  145. hydpy/cythons/autogen/c_evap_aet_morsim.pyx +1642 -0
  146. hydpy/cythons/autogen/c_evap_pet_ambav1.cp313-win_amd64.pyd +0 -0
  147. hydpy/cythons/autogen/c_evap_pet_ambav1.pxd +532 -0
  148. hydpy/cythons/autogen/c_evap_pet_ambav1.pyx +1296 -0
  149. hydpy/cythons/autogen/c_evap_pet_hbv96.cp313-win_amd64.pyd +0 -0
  150. hydpy/cythons/autogen/c_evap_pet_hbv96.pxd +179 -0
  151. hydpy/cythons/autogen/c_evap_pet_hbv96.pyx +328 -0
  152. hydpy/cythons/autogen/c_evap_pet_m.cp313-win_amd64.pyd +0 -0
  153. hydpy/cythons/autogen/c_evap_pet_m.pxd +124 -0
  154. hydpy/cythons/autogen/c_evap_pet_m.pyx +214 -0
  155. hydpy/cythons/autogen/c_evap_pet_mlc.cp313-win_amd64.pyd +0 -0
  156. hydpy/cythons/autogen/c_evap_pet_mlc.pxd +126 -0
  157. hydpy/cythons/autogen/c_evap_pet_mlc.pyx +214 -0
  158. hydpy/cythons/autogen/c_evap_ret_fao56.cp313-win_amd64.pyd +0 -0
  159. hydpy/cythons/autogen/c_evap_ret_fao56.pxd +305 -0
  160. hydpy/cythons/autogen/c_evap_ret_fao56.pyx +624 -0
  161. hydpy/cythons/autogen/c_evap_ret_io.cp313-win_amd64.pyd +0 -0
  162. hydpy/cythons/autogen/c_evap_ret_io.pxd +112 -0
  163. hydpy/cythons/autogen/c_evap_ret_io.pyx +176 -0
  164. hydpy/cythons/autogen/c_evap_ret_tw2002.cp313-win_amd64.pyd +0 -0
  165. hydpy/cythons/autogen/c_evap_ret_tw2002.pxd +139 -0
  166. hydpy/cythons/autogen/c_evap_ret_tw2002.pyx +273 -0
  167. hydpy/cythons/autogen/c_exch.cp313-win_amd64.pyd +0 -0
  168. hydpy/cythons/autogen/c_exch.pxd +230 -0
  169. hydpy/cythons/autogen/c_exch.pyx +462 -0
  170. hydpy/cythons/autogen/c_exch_branch_hbv96.cp313-win_amd64.pyd +0 -0
  171. hydpy/cythons/autogen/c_exch_branch_hbv96.pxd +134 -0
  172. hydpy/cythons/autogen/c_exch_branch_hbv96.pyx +255 -0
  173. hydpy/cythons/autogen/c_exch_waterlevel.cp313-win_amd64.pyd +0 -0
  174. hydpy/cythons/autogen/c_exch_waterlevel.pxd +54 -0
  175. hydpy/cythons/autogen/c_exch_waterlevel.pyx +78 -0
  176. hydpy/cythons/autogen/c_exch_weir_hbv96.cp313-win_amd64.pyd +0 -0
  177. hydpy/cythons/autogen/c_exch_weir_hbv96.pxd +156 -0
  178. hydpy/cythons/autogen/c_exch_weir_hbv96.pyx +282 -0
  179. hydpy/cythons/autogen/c_ga.cp313-win_amd64.pyd +0 -0
  180. hydpy/cythons/autogen/c_ga.pxd +353 -0
  181. hydpy/cythons/autogen/c_ga.pyx +1204 -0
  182. hydpy/cythons/autogen/c_ga_garto.cp313-win_amd64.pyd +0 -0
  183. hydpy/cythons/autogen/c_ga_garto.pxd +330 -0
  184. hydpy/cythons/autogen/c_ga_garto.pyx +1105 -0
  185. hydpy/cythons/autogen/c_ga_garto_submodel1.cp313-win_amd64.pyd +0 -0
  186. hydpy/cythons/autogen/c_ga_garto_submodel1.pxd +236 -0
  187. hydpy/cythons/autogen/c_ga_garto_submodel1.pyx +944 -0
  188. hydpy/cythons/autogen/c_gland.cp313-win_amd64.pyd +0 -0
  189. hydpy/cythons/autogen/c_gland.pxd +437 -0
  190. hydpy/cythons/autogen/c_gland.pyx +726 -0
  191. hydpy/cythons/autogen/c_gland_gr4.cp313-win_amd64.pyd +0 -0
  192. hydpy/cythons/autogen/c_gland_gr4.pxd +382 -0
  193. hydpy/cythons/autogen/c_gland_gr4.pyx +605 -0
  194. hydpy/cythons/autogen/c_gland_gr5.cp313-win_amd64.pyd +0 -0
  195. hydpy/cythons/autogen/c_gland_gr5.pxd +368 -0
  196. hydpy/cythons/autogen/c_gland_gr5.pyx +568 -0
  197. hydpy/cythons/autogen/c_gland_gr6.cp313-win_amd64.pyd +0 -0
  198. hydpy/cythons/autogen/c_gland_gr6.pxd +420 -0
  199. hydpy/cythons/autogen/c_gland_gr6.pyx +673 -0
  200. hydpy/cythons/autogen/c_hland.cp313-win_amd64.pyd +0 -0
  201. hydpy/cythons/autogen/c_hland.pxd +855 -0
  202. hydpy/cythons/autogen/c_hland.pyx +2486 -0
  203. hydpy/cythons/autogen/c_hland_96.cp313-win_amd64.pyd +0 -0
  204. hydpy/cythons/autogen/c_hland_96.pxd +631 -0
  205. hydpy/cythons/autogen/c_hland_96.pyx +1724 -0
  206. hydpy/cythons/autogen/c_hland_96c.cp313-win_amd64.pyd +0 -0
  207. hydpy/cythons/autogen/c_hland_96c.pxd +621 -0
  208. hydpy/cythons/autogen/c_hland_96c.pyx +1822 -0
  209. hydpy/cythons/autogen/c_hland_96p.cp313-win_amd64.pyd +0 -0
  210. hydpy/cythons/autogen/c_hland_96p.pxd +683 -0
  211. hydpy/cythons/autogen/c_hland_96p.pyx +1911 -0
  212. hydpy/cythons/autogen/c_kinw.cp313-win_amd64.pyd +0 -0
  213. hydpy/cythons/autogen/c_kinw.pxd +509 -0
  214. hydpy/cythons/autogen/c_kinw.pyx +965 -0
  215. hydpy/cythons/autogen/c_kinw_williams.cp313-win_amd64.pyd +0 -0
  216. hydpy/cythons/autogen/c_kinw_williams.pxd +409 -0
  217. hydpy/cythons/autogen/c_kinw_williams.pyx +763 -0
  218. hydpy/cythons/autogen/c_kinw_williams_ext.cp313-win_amd64.pyd +0 -0
  219. hydpy/cythons/autogen/c_kinw_williams_ext.pxd +220 -0
  220. hydpy/cythons/autogen/c_kinw_williams_ext.pyx +440 -0
  221. hydpy/cythons/autogen/c_lland.cp313-win_amd64.pyd +0 -0
  222. hydpy/cythons/autogen/c_lland.pxd +1386 -0
  223. hydpy/cythons/autogen/c_lland.pyx +3679 -0
  224. hydpy/cythons/autogen/c_lland_dd.cp313-win_amd64.pyd +0 -0
  225. hydpy/cythons/autogen/c_lland_dd.pxd +679 -0
  226. hydpy/cythons/autogen/c_lland_dd.pyx +1719 -0
  227. hydpy/cythons/autogen/c_lland_knauf.cp313-win_amd64.pyd +0 -0
  228. hydpy/cythons/autogen/c_lland_knauf.pxd +1096 -0
  229. hydpy/cythons/autogen/c_lland_knauf.pyx +2784 -0
  230. hydpy/cythons/autogen/c_lland_knauf_ic.cp313-win_amd64.pyd +0 -0
  231. hydpy/cythons/autogen/c_lland_knauf_ic.pxd +1369 -0
  232. hydpy/cythons/autogen/c_lland_knauf_ic.pyx +3625 -0
  233. hydpy/cythons/autogen/c_meteo.cp313-win_amd64.pyd +0 -0
  234. hydpy/cythons/autogen/c_meteo.pxd +469 -0
  235. hydpy/cythons/autogen/c_meteo.pyx +879 -0
  236. hydpy/cythons/autogen/c_meteo_clear_glob_io.cp313-win_amd64.pyd +0 -0
  237. hydpy/cythons/autogen/c_meteo_clear_glob_io.pxd +75 -0
  238. hydpy/cythons/autogen/c_meteo_clear_glob_io.pyx +107 -0
  239. hydpy/cythons/autogen/c_meteo_glob_fao56.cp313-win_amd64.pyd +0 -0
  240. hydpy/cythons/autogen/c_meteo_glob_fao56.pxd +209 -0
  241. hydpy/cythons/autogen/c_meteo_glob_fao56.pyx +339 -0
  242. hydpy/cythons/autogen/c_meteo_glob_io.cp313-win_amd64.pyd +0 -0
  243. hydpy/cythons/autogen/c_meteo_glob_io.pxd +63 -0
  244. hydpy/cythons/autogen/c_meteo_glob_io.pyx +91 -0
  245. hydpy/cythons/autogen/c_meteo_glob_morsim.cp313-win_amd64.pyd +0 -0
  246. hydpy/cythons/autogen/c_meteo_glob_morsim.pxd +289 -0
  247. hydpy/cythons/autogen/c_meteo_glob_morsim.pyx +527 -0
  248. hydpy/cythons/autogen/c_meteo_precip_io.cp313-win_amd64.pyd +0 -0
  249. hydpy/cythons/autogen/c_meteo_precip_io.pxd +112 -0
  250. hydpy/cythons/autogen/c_meteo_precip_io.pyx +176 -0
  251. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.cp313-win_amd64.pyd +0 -0
  252. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pxd +87 -0
  253. hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pyx +123 -0
  254. hydpy/cythons/autogen/c_meteo_sun_fao56.cp313-win_amd64.pyd +0 -0
  255. hydpy/cythons/autogen/c_meteo_sun_fao56.pxd +209 -0
  256. hydpy/cythons/autogen/c_meteo_sun_fao56.pyx +343 -0
  257. hydpy/cythons/autogen/c_meteo_sun_morsim.cp313-win_amd64.pyd +0 -0
  258. hydpy/cythons/autogen/c_meteo_sun_morsim.pxd +286 -0
  259. hydpy/cythons/autogen/c_meteo_sun_morsim.pyx +519 -0
  260. hydpy/cythons/autogen/c_meteo_temp_io.cp313-win_amd64.pyd +0 -0
  261. hydpy/cythons/autogen/c_meteo_temp_io.pxd +112 -0
  262. hydpy/cythons/autogen/c_meteo_temp_io.pyx +176 -0
  263. hydpy/cythons/autogen/c_musk.cp313-win_amd64.pyd +0 -0
  264. hydpy/cythons/autogen/c_musk.pxd +282 -0
  265. hydpy/cythons/autogen/c_musk.pyx +605 -0
  266. hydpy/cythons/autogen/c_musk_classic.cp313-win_amd64.pyd +0 -0
  267. hydpy/cythons/autogen/c_musk_classic.pxd +138 -0
  268. hydpy/cythons/autogen/c_musk_classic.pyx +226 -0
  269. hydpy/cythons/autogen/c_musk_mct.cp313-win_amd64.pyd +0 -0
  270. hydpy/cythons/autogen/c_musk_mct.pxd +282 -0
  271. hydpy/cythons/autogen/c_musk_mct.pyx +609 -0
  272. hydpy/cythons/autogen/c_rconc.cp313-win_amd64.pyd +0 -0
  273. hydpy/cythons/autogen/c_rconc.pxd +119 -0
  274. hydpy/cythons/autogen/c_rconc.pyx +174 -0
  275. hydpy/cythons/autogen/c_rconc_nash.cp313-win_amd64.pyd +0 -0
  276. hydpy/cythons/autogen/c_rconc_nash.pxd +111 -0
  277. hydpy/cythons/autogen/c_rconc_nash.pyx +185 -0
  278. hydpy/cythons/autogen/c_rconc_uh.cp313-win_amd64.pyd +0 -0
  279. hydpy/cythons/autogen/c_rconc_uh.pxd +92 -0
  280. hydpy/cythons/autogen/c_rconc_uh.pyx +125 -0
  281. hydpy/cythons/autogen/c_sw1d.cp313-win_amd64.pyd +0 -0
  282. hydpy/cythons/autogen/c_sw1d.pxd +511 -0
  283. hydpy/cythons/autogen/c_sw1d.pyx +1263 -0
  284. hydpy/cythons/autogen/c_sw1d_channel.cp313-win_amd64.pyd +0 -0
  285. hydpy/cythons/autogen/c_sw1d_channel.pxd +119 -0
  286. hydpy/cythons/autogen/c_sw1d_channel.pyx +300 -0
  287. hydpy/cythons/autogen/c_sw1d_gate_out.cp313-win_amd64.pyd +0 -0
  288. hydpy/cythons/autogen/c_sw1d_gate_out.pxd +240 -0
  289. hydpy/cythons/autogen/c_sw1d_gate_out.pyx +476 -0
  290. hydpy/cythons/autogen/c_sw1d_lias.cp313-win_amd64.pyd +0 -0
  291. hydpy/cythons/autogen/c_sw1d_lias.pxd +320 -0
  292. hydpy/cythons/autogen/c_sw1d_lias.pyx +619 -0
  293. hydpy/cythons/autogen/c_sw1d_lias_sluice.cp313-win_amd64.pyd +0 -0
  294. hydpy/cythons/autogen/c_sw1d_lias_sluice.pxd +325 -0
  295. hydpy/cythons/autogen/c_sw1d_lias_sluice.pyx +644 -0
  296. hydpy/cythons/autogen/c_sw1d_network.cp313-win_amd64.pyd +0 -0
  297. hydpy/cythons/autogen/c_sw1d_network.pxd +90 -0
  298. hydpy/cythons/autogen/c_sw1d_network.pyx +246 -0
  299. hydpy/cythons/autogen/c_sw1d_pump.cp313-win_amd64.pyd +0 -0
  300. hydpy/cythons/autogen/c_sw1d_pump.pxd +256 -0
  301. hydpy/cythons/autogen/c_sw1d_pump.pyx +502 -0
  302. hydpy/cythons/autogen/c_sw1d_q_in.cp313-win_amd64.pyd +0 -0
  303. hydpy/cythons/autogen/c_sw1d_q_in.pxd +224 -0
  304. hydpy/cythons/autogen/c_sw1d_q_in.pyx +383 -0
  305. hydpy/cythons/autogen/c_sw1d_q_out.cp313-win_amd64.pyd +0 -0
  306. hydpy/cythons/autogen/c_sw1d_q_out.pxd +224 -0
  307. hydpy/cythons/autogen/c_sw1d_q_out.pyx +383 -0
  308. hydpy/cythons/autogen/c_sw1d_storage.cp313-win_amd64.pyd +0 -0
  309. hydpy/cythons/autogen/c_sw1d_storage.pxd +193 -0
  310. hydpy/cythons/autogen/c_sw1d_storage.pyx +349 -0
  311. hydpy/cythons/autogen/c_sw1d_weir_out.cp313-win_amd64.pyd +0 -0
  312. hydpy/cythons/autogen/c_sw1d_weir_out.pxd +212 -0
  313. hydpy/cythons/autogen/c_sw1d_weir_out.pyx +404 -0
  314. hydpy/cythons/autogen/c_test.cp313-win_amd64.pyd +0 -0
  315. hydpy/cythons/autogen/c_test.pxd +175 -0
  316. hydpy/cythons/autogen/c_test.pyx +348 -0
  317. hydpy/cythons/autogen/c_test_discontinous.cp313-win_amd64.pyd +0 -0
  318. hydpy/cythons/autogen/c_test_discontinous.pxd +146 -0
  319. hydpy/cythons/autogen/c_test_discontinous.pyx +256 -0
  320. hydpy/cythons/autogen/c_test_stiff0d.cp313-win_amd64.pyd +0 -0
  321. hydpy/cythons/autogen/c_test_stiff0d.pxd +146 -0
  322. hydpy/cythons/autogen/c_test_stiff0d.pyx +250 -0
  323. hydpy/cythons/autogen/c_test_stiff1d.cp313-win_amd64.pyd +0 -0
  324. hydpy/cythons/autogen/c_test_stiff1d.pxd +145 -0
  325. hydpy/cythons/autogen/c_test_stiff1d.pyx +294 -0
  326. hydpy/cythons/autogen/c_whmod.cp313-win_amd64.pyd +0 -0
  327. hydpy/cythons/autogen/c_whmod.pxd +482 -0
  328. hydpy/cythons/autogen/c_whmod.pyx +1156 -0
  329. hydpy/cythons/autogen/c_whmod_rural.cp313-win_amd64.pyd +0 -0
  330. hydpy/cythons/autogen/c_whmod_rural.pxd +411 -0
  331. hydpy/cythons/autogen/c_whmod_rural.pyx +982 -0
  332. hydpy/cythons/autogen/c_whmod_urban.cp313-win_amd64.pyd +0 -0
  333. hydpy/cythons/autogen/c_whmod_urban.pxd +482 -0
  334. hydpy/cythons/autogen/c_whmod_urban.pyx +1155 -0
  335. hydpy/cythons/autogen/c_wland.cp313-win_amd64.pyd +0 -0
  336. hydpy/cythons/autogen/c_wland.pxd +842 -0
  337. hydpy/cythons/autogen/c_wland.pyx +1890 -0
  338. hydpy/cythons/autogen/c_wland_gd.cp313-win_amd64.pyd +0 -0
  339. hydpy/cythons/autogen/c_wland_gd.pxd +829 -0
  340. hydpy/cythons/autogen/c_wland_gd.pyx +1847 -0
  341. hydpy/cythons/autogen/c_wland_wag.cp313-win_amd64.pyd +0 -0
  342. hydpy/cythons/autogen/c_wland_wag.pxd +810 -0
  343. hydpy/cythons/autogen/c_wland_wag.pyx +1780 -0
  344. hydpy/cythons/autogen/c_wq.cp313-win_amd64.pyd +0 -0
  345. hydpy/cythons/autogen/c_wq.pxd +275 -0
  346. hydpy/cythons/autogen/c_wq.pyx +652 -0
  347. hydpy/cythons/autogen/c_wq_trapeze.cp313-win_amd64.pyd +0 -0
  348. hydpy/cythons/autogen/c_wq_trapeze.pxd +170 -0
  349. hydpy/cythons/autogen/c_wq_trapeze.pyx +400 -0
  350. hydpy/cythons/autogen/c_wq_trapeze_strickler.cp313-win_amd64.pyd +0 -0
  351. hydpy/cythons/autogen/c_wq_trapeze_strickler.pxd +243 -0
  352. hydpy/cythons/autogen/c_wq_trapeze_strickler.pyx +578 -0
  353. hydpy/cythons/autogen/c_wq_walrus.cp313-win_amd64.pyd +0 -0
  354. hydpy/cythons/autogen/c_wq_walrus.pxd +61 -0
  355. hydpy/cythons/autogen/c_wq_walrus.pyx +82 -0
  356. hydpy/cythons/autogen/configutils.cp313-win_amd64.pyd +0 -0
  357. hydpy/cythons/autogen/configutils.pxd +17 -0
  358. hydpy/cythons/autogen/configutils.pyx +119 -0
  359. hydpy/cythons/autogen/interfaceutils.cp313-win_amd64.pyd +0 -0
  360. hydpy/cythons/autogen/interfaceutils.pxd +31 -0
  361. hydpy/cythons/autogen/interfaceutils.pyx +82 -0
  362. hydpy/cythons/autogen/interputils.cp313-win_amd64.pyd +0 -0
  363. hydpy/cythons/autogen/interputils.pxd +42 -0
  364. hydpy/cythons/autogen/interputils.pyx +118 -0
  365. hydpy/cythons/autogen/masterinterface.cp313-win_amd64.pyd +0 -0
  366. hydpy/cythons/autogen/masterinterface.pxd +153 -0
  367. hydpy/cythons/autogen/masterinterface.pyx +222 -0
  368. hydpy/cythons/autogen/pointerutils.cp313-win_amd64.pyd +0 -0
  369. hydpy/cythons/autogen/pointerutils.pxd +31 -0
  370. hydpy/cythons/autogen/pointerutils.pyx +650 -0
  371. hydpy/cythons/autogen/ppolyutils.cp313-win_amd64.pyd +0 -0
  372. hydpy/cythons/autogen/ppolyutils.pxd +35 -0
  373. hydpy/cythons/autogen/ppolyutils.pyx +59 -0
  374. hydpy/cythons/autogen/quadutils.cp313-win_amd64.pyd +0 -0
  375. hydpy/cythons/autogen/quadutils.pxd +26 -0
  376. hydpy/cythons/autogen/quadutils.pyx +973 -0
  377. hydpy/cythons/autogen/rootutils.cp313-win_amd64.pyd +0 -0
  378. hydpy/cythons/autogen/rootutils.pxd +28 -0
  379. hydpy/cythons/autogen/rootutils.pyx +109 -0
  380. hydpy/cythons/autogen/sequenceutils.cp313-win_amd64.pyd +0 -0
  381. hydpy/cythons/autogen/sequenceutils.pxd +45 -0
  382. hydpy/cythons/autogen/sequenceutils.pyx +101 -0
  383. hydpy/cythons/autogen/smoothutils.cp313-win_amd64.pyd +0 -0
  384. hydpy/cythons/autogen/smoothutils.pxd +29 -0
  385. hydpy/cythons/autogen/smoothutils.pyx +833 -0
  386. hydpy/cythons/configutils.pxd +8 -0
  387. hydpy/cythons/configutils.pyi +5 -0
  388. hydpy/cythons/configutils.pyx +110 -0
  389. hydpy/cythons/interfaceutils.pxd +22 -0
  390. hydpy/cythons/interfaceutils.pyi +15 -0
  391. hydpy/cythons/interfaceutils.pyx +73 -0
  392. hydpy/cythons/interputils.pxd +33 -0
  393. hydpy/cythons/interputils.pyi +32 -0
  394. hydpy/cythons/interputils.pyx +109 -0
  395. hydpy/cythons/modelutils.py +2990 -0
  396. hydpy/cythons/pointerutils.pxd +22 -0
  397. hydpy/cythons/pointerutils.pyi +89 -0
  398. hydpy/cythons/pointerutils.pyx +641 -0
  399. hydpy/cythons/ppolyutils.pxd +26 -0
  400. hydpy/cythons/ppolyutils.pyi +21 -0
  401. hydpy/cythons/ppolyutils.pyx +50 -0
  402. hydpy/cythons/quadutils.pxd +17 -0
  403. hydpy/cythons/quadutils.pyi +13 -0
  404. hydpy/cythons/quadutils.pyx +964 -0
  405. hydpy/cythons/rootutils.pxd +19 -0
  406. hydpy/cythons/rootutils.pyi +21 -0
  407. hydpy/cythons/rootutils.pyx +100 -0
  408. hydpy/cythons/sequenceutils.pxd +36 -0
  409. hydpy/cythons/sequenceutils.pyi +7 -0
  410. hydpy/cythons/sequenceutils.pyx +92 -0
  411. hydpy/cythons/smoothutils.pxd +20 -0
  412. hydpy/cythons/smoothutils.pyi +15 -0
  413. hydpy/cythons/smoothutils.pyx +824 -0
  414. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_dill_assl.py +13 -0
  415. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_kalk.py +13 -0
  416. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_leun.py +14 -0
  417. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_marb.py +13 -0
  418. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_dill_assl_lahn_leun.py +5 -0
  419. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_leun_lahn_kalk.py +5 -0
  420. hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_marb_lahn_leun.py +5 -0
  421. hydpy/data/HydPy-H-Lahn/control/default/land.py +9 -0
  422. hydpy/data/HydPy-H-Lahn/control/default/land_dill_assl.py +57 -0
  423. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_kalk.py +57 -0
  424. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_leun.py +56 -0
  425. hydpy/data/HydPy-H-Lahn/control/default/land_lahn_marb.py +57 -0
  426. hydpy/data/HydPy-H-Lahn/control/default/stream_dill_assl_lahn_leun.py +7 -0
  427. hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_leun_lahn_kalk.py +7 -0
  428. hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_marb_lahn_leun.py +7 -0
  429. hydpy/data/HydPy-H-Lahn/multiple_runs.xml +309 -0
  430. hydpy/data/HydPy-H-Lahn/multiple_runs_alpha.xml +71 -0
  431. hydpy/data/HydPy-H-Lahn/network/default/headwaters.py +11 -0
  432. hydpy/data/HydPy-H-Lahn/network/default/nonheadwaters.py +11 -0
  433. hydpy/data/HydPy-H-Lahn/network/default/streams.py +8 -0
  434. hydpy/data/HydPy-H-Lahn/series/default/dill_assl_obs_q.asc +11387 -0
  435. hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalairtemperature.nc +0 -0
  436. hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalevapotranspiration.nc +0 -0
  437. hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_p.nc +0 -0
  438. hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_t.nc +0 -0
  439. hydpy/data/HydPy-H-Lahn/series/default/lahn_kalk_obs_q.asc +11387 -0
  440. hydpy/data/HydPy-H-Lahn/series/default/lahn_leun_obs_q.asc +11387 -0
  441. hydpy/data/HydPy-H-Lahn/series/default/lahn_marb_obs_q.asc +11387 -0
  442. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  443. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  444. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_p.asc +11387 -0
  445. hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_t.asc +11387 -0
  446. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  447. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  448. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_p.asc +11387 -0
  449. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_t.asc +11387 -0
  450. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  451. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  452. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_p.asc +11387 -0
  453. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_t.asc +11387 -0
  454. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
  455. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
  456. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_p.asc +11387 -0
  457. hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_t.asc +11387 -0
  458. hydpy/data/HydPy-H-Lahn/series/default/obs_q.nc +0 -0
  459. hydpy/data/HydPy-H-Lahn/single_run.xml +152 -0
  460. hydpy/data/HydPy-H-Lahn/single_run.xmlt +143 -0
  461. hydpy/data/__init__.py +17 -0
  462. hydpy/docs/__init__.py +0 -0
  463. hydpy/docs/autofigs/__init__.py +0 -0
  464. hydpy/docs/bib/__init__.py +0 -0
  465. hydpy/docs/bib/refs.bib +566 -0
  466. hydpy/docs/combine_docversions.py +133 -0
  467. hydpy/docs/draw_model_sketches.py +1301 -0
  468. hydpy/docs/enable_autodoc.py +7 -0
  469. hydpy/docs/figs/HydPy-G-GR4.png +0 -0
  470. hydpy/docs/figs/HydPy-G-GR5.png +0 -0
  471. hydpy/docs/figs/HydPy-G-GR6.png +0 -0
  472. hydpy/docs/figs/HydPy-H-HBV96-COSERO.png +0 -0
  473. hydpy/docs/figs/HydPy-H-HBV96-PREVAH.png +0 -0
  474. hydpy/docs/figs/HydPy-H-HBV96.png +0 -0
  475. hydpy/docs/figs/HydPy-H-Lahn.png +0 -0
  476. hydpy/docs/figs/HydPy-KinW-Williams.png +0 -0
  477. hydpy/docs/figs/HydPy-L-DD.png +0 -0
  478. hydpy/docs/figs/HydPy-W-Wag.png +0 -0
  479. hydpy/docs/figs/HydPy_Logo.png +0 -0
  480. hydpy/docs/figs/HydPy_Logo_Text.png +0 -0
  481. hydpy/docs/figs/IDLE-editor.png +0 -0
  482. hydpy/docs/figs/IDLE-shell.png +0 -0
  483. hydpy/docs/figs/LAWA_river-basin-bumbers.png +0 -0
  484. hydpy/docs/figs/__init__.py +0 -0
  485. hydpy/docs/html_/__init__.py +0 -0
  486. hydpy/docs/polish_html.py +57 -0
  487. hydpy/docs/prepare.py +224 -0
  488. hydpy/docs/publish_docs.py +53 -0
  489. hydpy/docs/rst/HydPy-ARMA.rst +27 -0
  490. hydpy/docs/rst/HydPy-Conv.rst +22 -0
  491. hydpy/docs/rst/HydPy-Dam.rst +79 -0
  492. hydpy/docs/rst/HydPy-Dummy.rst +21 -0
  493. hydpy/docs/rst/HydPy-Evap.rst +26 -0
  494. hydpy/docs/rst/HydPy-Exch.rst +36 -0
  495. hydpy/docs/rst/HydPy-G.rst +40 -0
  496. hydpy/docs/rst/HydPy-GA.rst +34 -0
  497. hydpy/docs/rst/HydPy-H.rst +24 -0
  498. hydpy/docs/rst/HydPy-KinW.rst +32 -0
  499. hydpy/docs/rst/HydPy-L.rst +42 -0
  500. hydpy/docs/rst/HydPy-Meteo.rst +28 -0
  501. hydpy/docs/rst/HydPy-Musk.rst +21 -0
  502. hydpy/docs/rst/HydPy-Rconc.rst +17 -0
  503. hydpy/docs/rst/HydPy-SW1D.rst +49 -0
  504. hydpy/docs/rst/HydPy-Test.rst +19 -0
  505. hydpy/docs/rst/HydPy-W.rst +20 -0
  506. hydpy/docs/rst/HydPy-WHMod.rst +19 -0
  507. hydpy/docs/rst/HydPy-WQ.rst +20 -0
  508. hydpy/docs/rst/__init__.py +0 -0
  509. hydpy/docs/rst/additional_repositories.rst +40 -0
  510. hydpy/docs/rst/auxiliaries.rst +31 -0
  511. hydpy/docs/rst/continuous_integration.rst +75 -0
  512. hydpy/docs/rst/core.rst +75 -0
  513. hydpy/docs/rst/cythons.rst +47 -0
  514. hydpy/docs/rst/definitions.rst +506 -0
  515. hydpy/docs/rst/developer_guide.rst +54 -0
  516. hydpy/docs/rst/example_projects.rst +40 -0
  517. hydpy/docs/rst/execution.rst +22 -0
  518. hydpy/docs/rst/framework_tools.rst +56 -0
  519. hydpy/docs/rst/how_to_read_the_reference_manual.rst +156 -0
  520. hydpy/docs/rst/hydpydependencies.rst +55 -0
  521. hydpy/docs/rst/index.rst +125 -0
  522. hydpy/docs/rst/installation.rst +155 -0
  523. hydpy/docs/rst/model_families.rst +79 -0
  524. hydpy/docs/rst/model_overview.rst +291 -0
  525. hydpy/docs/rst/modelimports.rst +10 -0
  526. hydpy/docs/rst/options.rst +119 -0
  527. hydpy/docs/rst/programming_style.rst +572 -0
  528. hydpy/docs/rst/project_structure.rst +520 -0
  529. hydpy/docs/rst/quickstart.rst +304 -0
  530. hydpy/docs/rst/reference_manual.rst +29 -0
  531. hydpy/docs/rst/required_tools.rst +50 -0
  532. hydpy/docs/rst/simulation.rst +514 -0
  533. hydpy/docs/rst/submodel_interfaces.rst +32 -0
  534. hydpy/docs/rst/tests_and_documentation.rst +85 -0
  535. hydpy/docs/rst/user_guide.rst +38 -0
  536. hydpy/docs/rst/version_control.rst +116 -0
  537. hydpy/docs/rst/zbibliography.rst +8 -0
  538. hydpy/docs/sphinx/__init__.py +0 -0
  539. hydpy/docs/sphinx/_themes/basic_hydpy/changes/frameset.html +11 -0
  540. hydpy/docs/sphinx/_themes/basic_hydpy/changes/rstsource.html +15 -0
  541. hydpy/docs/sphinx/_themes/basic_hydpy/changes/versionchanges.html +33 -0
  542. hydpy/docs/sphinx/_themes/basic_hydpy/defindex.html +35 -0
  543. hydpy/docs/sphinx/_themes/basic_hydpy/domainindex.html +56 -0
  544. hydpy/docs/sphinx/_themes/basic_hydpy/genindex-single.html +63 -0
  545. hydpy/docs/sphinx/_themes/basic_hydpy/genindex-split.html +41 -0
  546. hydpy/docs/sphinx/_themes/basic_hydpy/genindex.html +76 -0
  547. hydpy/docs/sphinx/_themes/basic_hydpy/globaltoc.html +11 -0
  548. hydpy/docs/sphinx/_themes/basic_hydpy/layout.html +221 -0
  549. hydpy/docs/sphinx/_themes/basic_hydpy/localtoc.html +15 -0
  550. hydpy/docs/sphinx/_themes/basic_hydpy/opensearch.xml +13 -0
  551. hydpy/docs/sphinx/_themes/basic_hydpy/page.html +13 -0
  552. hydpy/docs/sphinx/_themes/basic_hydpy/relations.html +23 -0
  553. hydpy/docs/sphinx/_themes/basic_hydpy/search.html +65 -0
  554. hydpy/docs/sphinx/_themes/basic_hydpy/searchbox.html +21 -0
  555. hydpy/docs/sphinx/_themes/basic_hydpy/searchfield.html +23 -0
  556. hydpy/docs/sphinx/_themes/basic_hydpy/sourcelink.html +18 -0
  557. hydpy/docs/sphinx/_themes/basic_hydpy/static/basic.css_t +925 -0
  558. hydpy/docs/sphinx/_themes/basic_hydpy/static/doctools.js +156 -0
  559. hydpy/docs/sphinx/_themes/basic_hydpy/static/documentation_options.js_t +13 -0
  560. hydpy/docs/sphinx/_themes/basic_hydpy/static/file.png +0 -0
  561. hydpy/docs/sphinx/_themes/basic_hydpy/static/language_data.js_t +26 -0
  562. hydpy/docs/sphinx/_themes/basic_hydpy/static/minus.png +0 -0
  563. hydpy/docs/sphinx/_themes/basic_hydpy/static/plus.png +0 -0
  564. hydpy/docs/sphinx/_themes/basic_hydpy/static/searchtools.js +574 -0
  565. hydpy/docs/sphinx/_themes/basic_hydpy/static/sphinx_highlight.js +154 -0
  566. hydpy/docs/sphinx/_themes/basic_hydpy/theme.conf +16 -0
  567. hydpy/docs/sphinx/_themes/classic_hydpy/layout.html +23 -0
  568. hydpy/docs/sphinx/_themes/classic_hydpy/static/classic.css_t +358 -0
  569. hydpy/docs/sphinx/_themes/classic_hydpy/static/sidebar.js_t +72 -0
  570. hydpy/docs/sphinx/_themes/classic_hydpy/theme.conf +32 -0
  571. hydpy/docs/sphinx/conf.py +398 -0
  572. hydpy/docs/sphinx/defaultlinks_extension.py +36 -0
  573. hydpy/docs/sphinx/integrationtest_extension.py +104 -0
  574. hydpy/docs/sphinx/projectstructure_extension.py +58 -0
  575. hydpy/docs/sphinx/submodelgraph_extension.py +53 -0
  576. hydpy/exe/__init__.py +0 -0
  577. hydpy/exe/commandtools.py +651 -0
  578. hydpy/exe/hyd.py +277 -0
  579. hydpy/exe/modelimports.py +41 -0
  580. hydpy/exe/replacetools.py +216 -0
  581. hydpy/exe/servertools.py +2348 -0
  582. hydpy/exe/xmltools.py +3280 -0
  583. hydpy/interfaces/__init__.py +0 -0
  584. hydpy/interfaces/aetinterfaces.py +94 -0
  585. hydpy/interfaces/dischargeinterfaces.py +45 -0
  586. hydpy/interfaces/petinterfaces.py +117 -0
  587. hydpy/interfaces/precipinterfaces.py +42 -0
  588. hydpy/interfaces/radiationinterfaces.py +79 -0
  589. hydpy/interfaces/rconcinterfaces.py +30 -0
  590. hydpy/interfaces/routinginterfaces.py +324 -0
  591. hydpy/interfaces/soilinterfaces.py +96 -0
  592. hydpy/interfaces/stateinterfaces.py +98 -0
  593. hydpy/interfaces/tempinterfaces.py +46 -0
  594. hydpy/models/__init__.py +0 -0
  595. hydpy/models/arma/__init__.py +14 -0
  596. hydpy/models/arma/arma_control.py +383 -0
  597. hydpy/models/arma/arma_derived.py +204 -0
  598. hydpy/models/arma/arma_fluxes.py +41 -0
  599. hydpy/models/arma/arma_inlets.py +11 -0
  600. hydpy/models/arma/arma_logs.py +19 -0
  601. hydpy/models/arma/arma_model.py +461 -0
  602. hydpy/models/arma/arma_outlets.py +11 -0
  603. hydpy/models/arma_rimorido.py +381 -0
  604. hydpy/models/conv/__init__.py +12 -0
  605. hydpy/models/conv/conv_control.py +303 -0
  606. hydpy/models/conv/conv_derived.py +271 -0
  607. hydpy/models/conv/conv_fluxes.py +54 -0
  608. hydpy/models/conv/conv_inlets.py +11 -0
  609. hydpy/models/conv/conv_model.py +687 -0
  610. hydpy/models/conv/conv_outlets.py +11 -0
  611. hydpy/models/conv_idw.py +120 -0
  612. hydpy/models/conv_idw_ed.py +184 -0
  613. hydpy/models/conv_nn.py +112 -0
  614. hydpy/models/dam/__init__.py +16 -0
  615. hydpy/models/dam/dam_aides.py +17 -0
  616. hydpy/models/dam/dam_control.py +346 -0
  617. hydpy/models/dam/dam_derived.py +559 -0
  618. hydpy/models/dam/dam_factors.py +46 -0
  619. hydpy/models/dam/dam_fluxes.py +179 -0
  620. hydpy/models/dam/dam_inlets.py +29 -0
  621. hydpy/models/dam/dam_logs.py +52 -0
  622. hydpy/models/dam/dam_model.py +5011 -0
  623. hydpy/models/dam/dam_outlets.py +23 -0
  624. hydpy/models/dam/dam_receivers.py +41 -0
  625. hydpy/models/dam/dam_senders.py +23 -0
  626. hydpy/models/dam/dam_solver.py +75 -0
  627. hydpy/models/dam/dam_states.py +11 -0
  628. hydpy/models/dam_llake.py +499 -0
  629. hydpy/models/dam_lreservoir.py +548 -0
  630. hydpy/models/dam_lretention.py +343 -0
  631. hydpy/models/dam_pump.py +278 -0
  632. hydpy/models/dam_pump_sluice.py +339 -0
  633. hydpy/models/dam_sluice.py +319 -0
  634. hydpy/models/dam_v001.py +1127 -0
  635. hydpy/models/dam_v002.py +381 -0
  636. hydpy/models/dam_v003.py +422 -0
  637. hydpy/models/dam_v004.py +665 -0
  638. hydpy/models/dam_v005.py +479 -0
  639. hydpy/models/dummy/__init__.py +15 -0
  640. hydpy/models/dummy/dummy_control.py +22 -0
  641. hydpy/models/dummy/dummy_fluxes.py +11 -0
  642. hydpy/models/dummy/dummy_inlets.py +11 -0
  643. hydpy/models/dummy/dummy_inputs.py +41 -0
  644. hydpy/models/dummy/dummy_model.py +196 -0
  645. hydpy/models/dummy/dummy_outlets.py +11 -0
  646. hydpy/models/dummy_interceptedwater.py +85 -0
  647. hydpy/models/dummy_node2node.py +83 -0
  648. hydpy/models/dummy_snowalbedo.py +84 -0
  649. hydpy/models/dummy_snowcover.py +84 -0
  650. hydpy/models/dummy_snowycanopy.py +86 -0
  651. hydpy/models/dummy_soilwater.py +85 -0
  652. hydpy/models/evap/__init__.py +13 -0
  653. hydpy/models/evap/evap_control.py +354 -0
  654. hydpy/models/evap/evap_derived.py +236 -0
  655. hydpy/models/evap/evap_factors.py +188 -0
  656. hydpy/models/evap/evap_fixed.py +68 -0
  657. hydpy/models/evap/evap_fluxes.py +150 -0
  658. hydpy/models/evap/evap_inputs.py +54 -0
  659. hydpy/models/evap/evap_logs.py +91 -0
  660. hydpy/models/evap/evap_masks.py +48 -0
  661. hydpy/models/evap/evap_model.py +9170 -0
  662. hydpy/models/evap/evap_parameters.py +149 -0
  663. hydpy/models/evap/evap_sequences.py +32 -0
  664. hydpy/models/evap/evap_states.py +18 -0
  665. hydpy/models/evap_aet_hbv96.py +372 -0
  666. hydpy/models/evap_aet_minhas.py +331 -0
  667. hydpy/models/evap_aet_morsim.py +627 -0
  668. hydpy/models/evap_pet_ambav1.py +483 -0
  669. hydpy/models/evap_pet_hbv96.py +147 -0
  670. hydpy/models/evap_pet_m.py +94 -0
  671. hydpy/models/evap_pet_mlc.py +107 -0
  672. hydpy/models/evap_ret_fao56.py +265 -0
  673. hydpy/models/evap_ret_io.py +74 -0
  674. hydpy/models/evap_ret_tw2002.py +165 -0
  675. hydpy/models/exch/__init__.py +14 -0
  676. hydpy/models/exch/exch_control.py +262 -0
  677. hydpy/models/exch/exch_derived.py +36 -0
  678. hydpy/models/exch/exch_factors.py +26 -0
  679. hydpy/models/exch/exch_fluxes.py +48 -0
  680. hydpy/models/exch/exch_inlets.py +11 -0
  681. hydpy/models/exch/exch_logs.py +12 -0
  682. hydpy/models/exch/exch_model.py +451 -0
  683. hydpy/models/exch/exch_outlets.py +17 -0
  684. hydpy/models/exch/exch_receivers.py +17 -0
  685. hydpy/models/exch_branch_hbv96.py +186 -0
  686. hydpy/models/exch_waterlevel.py +73 -0
  687. hydpy/models/exch_weir_hbv96.py +609 -0
  688. hydpy/models/ga/__init__.py +14 -0
  689. hydpy/models/ga/ga_aides.py +17 -0
  690. hydpy/models/ga/ga_control.py +208 -0
  691. hydpy/models/ga/ga_derived.py +77 -0
  692. hydpy/models/ga/ga_fluxes.py +83 -0
  693. hydpy/models/ga/ga_inputs.py +26 -0
  694. hydpy/models/ga/ga_logs.py +17 -0
  695. hydpy/models/ga/ga_model.py +2952 -0
  696. hydpy/models/ga/ga_states.py +87 -0
  697. hydpy/models/ga_garto.py +1001 -0
  698. hydpy/models/ga_garto_submodel1.py +79 -0
  699. hydpy/models/gland/__init__.py +14 -0
  700. hydpy/models/gland/gland_control.py +90 -0
  701. hydpy/models/gland/gland_derived.py +113 -0
  702. hydpy/models/gland/gland_fluxes.py +137 -0
  703. hydpy/models/gland/gland_inputs.py +12 -0
  704. hydpy/models/gland/gland_model.py +1439 -0
  705. hydpy/models/gland/gland_outlets.py +11 -0
  706. hydpy/models/gland/gland_states.py +90 -0
  707. hydpy/models/gland_gr4.py +501 -0
  708. hydpy/models/gland_gr5.py +463 -0
  709. hydpy/models/gland_gr6.py +487 -0
  710. hydpy/models/hland/__init__.py +20 -0
  711. hydpy/models/hland/hland_aides.py +19 -0
  712. hydpy/models/hland/hland_constants.py +37 -0
  713. hydpy/models/hland/hland_control.py +1530 -0
  714. hydpy/models/hland/hland_derived.py +683 -0
  715. hydpy/models/hland/hland_factors.py +57 -0
  716. hydpy/models/hland/hland_fixed.py +42 -0
  717. hydpy/models/hland/hland_fluxes.py +279 -0
  718. hydpy/models/hland/hland_inputs.py +19 -0
  719. hydpy/models/hland/hland_masks.py +107 -0
  720. hydpy/models/hland/hland_model.py +4664 -0
  721. hydpy/models/hland/hland_outlets.py +11 -0
  722. hydpy/models/hland/hland_parameters.py +227 -0
  723. hydpy/models/hland/hland_sequences.py +382 -0
  724. hydpy/models/hland/hland_states.py +236 -0
  725. hydpy/models/hland_96.py +1812 -0
  726. hydpy/models/hland_96c.py +1196 -0
  727. hydpy/models/hland_96p.py +1204 -0
  728. hydpy/models/kinw/__init__.py +18 -0
  729. hydpy/models/kinw/kinw_aides.py +306 -0
  730. hydpy/models/kinw/kinw_control.py +270 -0
  731. hydpy/models/kinw/kinw_derived.py +197 -0
  732. hydpy/models/kinw/kinw_fixed.py +33 -0
  733. hydpy/models/kinw/kinw_fluxes.py +37 -0
  734. hydpy/models/kinw/kinw_inlets.py +11 -0
  735. hydpy/models/kinw/kinw_model.py +3026 -0
  736. hydpy/models/kinw/kinw_outlets.py +11 -0
  737. hydpy/models/kinw/kinw_solver.py +45 -0
  738. hydpy/models/kinw/kinw_states.py +17 -0
  739. hydpy/models/kinw_williams.py +1299 -0
  740. hydpy/models/kinw_williams_ext.py +768 -0
  741. hydpy/models/lland/__init__.py +42 -0
  742. hydpy/models/lland/lland_aides.py +38 -0
  743. hydpy/models/lland/lland_constants.py +88 -0
  744. hydpy/models/lland/lland_control.py +1329 -0
  745. hydpy/models/lland/lland_derived.py +380 -0
  746. hydpy/models/lland/lland_factors.py +18 -0
  747. hydpy/models/lland/lland_fixed.py +128 -0
  748. hydpy/models/lland/lland_fluxes.py +626 -0
  749. hydpy/models/lland/lland_inlets.py +12 -0
  750. hydpy/models/lland/lland_inputs.py +33 -0
  751. hydpy/models/lland/lland_logs.py +17 -0
  752. hydpy/models/lland/lland_masks.py +212 -0
  753. hydpy/models/lland/lland_model.py +7690 -0
  754. hydpy/models/lland/lland_outlets.py +12 -0
  755. hydpy/models/lland/lland_parameters.py +195 -0
  756. hydpy/models/lland/lland_sequences.py +67 -0
  757. hydpy/models/lland/lland_states.py +280 -0
  758. hydpy/models/lland_dd.py +2270 -0
  759. hydpy/models/lland_knauf.py +2156 -0
  760. hydpy/models/lland_knauf_ic.py +1920 -0
  761. hydpy/models/meteo/__init__.py +12 -0
  762. hydpy/models/meteo/meteo_control.py +154 -0
  763. hydpy/models/meteo/meteo_derived.py +159 -0
  764. hydpy/models/meteo/meteo_factors.py +88 -0
  765. hydpy/models/meteo/meteo_fixed.py +19 -0
  766. hydpy/models/meteo/meteo_fluxes.py +46 -0
  767. hydpy/models/meteo/meteo_inputs.py +47 -0
  768. hydpy/models/meteo/meteo_logs.py +30 -0
  769. hydpy/models/meteo/meteo_model.py +2904 -0
  770. hydpy/models/meteo/meteo_parameters.py +14 -0
  771. hydpy/models/meteo/meteo_sequences.py +22 -0
  772. hydpy/models/meteo_clear_glob_io.py +77 -0
  773. hydpy/models/meteo_glob_fao56.py +217 -0
  774. hydpy/models/meteo_glob_io.py +68 -0
  775. hydpy/models/meteo_glob_morsim.py +444 -0
  776. hydpy/models/meteo_precip_io.py +76 -0
  777. hydpy/models/meteo_psun_sun_glob_io.py +83 -0
  778. hydpy/models/meteo_sun_fao56.py +188 -0
  779. hydpy/models/meteo_sun_morsim.py +466 -0
  780. hydpy/models/meteo_temp_io.py +76 -0
  781. hydpy/models/musk/__init__.py +15 -0
  782. hydpy/models/musk/musk_control.py +328 -0
  783. hydpy/models/musk/musk_derived.py +32 -0
  784. hydpy/models/musk/musk_factors.py +53 -0
  785. hydpy/models/musk/musk_fluxes.py +24 -0
  786. hydpy/models/musk/musk_inlets.py +11 -0
  787. hydpy/models/musk/musk_masks.py +15 -0
  788. hydpy/models/musk/musk_model.py +838 -0
  789. hydpy/models/musk/musk_outlets.py +11 -0
  790. hydpy/models/musk/musk_sequences.py +88 -0
  791. hydpy/models/musk/musk_solver.py +68 -0
  792. hydpy/models/musk/musk_states.py +64 -0
  793. hydpy/models/musk_classic.py +228 -0
  794. hydpy/models/musk_mct.py +1247 -0
  795. hydpy/models/rconc/__init__.py +12 -0
  796. hydpy/models/rconc/rconc_control.py +473 -0
  797. hydpy/models/rconc/rconc_derived.py +76 -0
  798. hydpy/models/rconc/rconc_fluxes.py +19 -0
  799. hydpy/models/rconc/rconc_logs.py +74 -0
  800. hydpy/models/rconc/rconc_model.py +260 -0
  801. hydpy/models/rconc/rconc_states.py +11 -0
  802. hydpy/models/rconc_nash.py +48 -0
  803. hydpy/models/rconc_uh.py +53 -0
  804. hydpy/models/sw1d/__init__.py +17 -0
  805. hydpy/models/sw1d/sw1d_control.py +356 -0
  806. hydpy/models/sw1d/sw1d_derived.py +85 -0
  807. hydpy/models/sw1d/sw1d_factors.py +78 -0
  808. hydpy/models/sw1d/sw1d_fixed.py +12 -0
  809. hydpy/models/sw1d/sw1d_fluxes.py +55 -0
  810. hydpy/models/sw1d/sw1d_inlets.py +17 -0
  811. hydpy/models/sw1d/sw1d_model.py +3385 -0
  812. hydpy/models/sw1d/sw1d_outlets.py +11 -0
  813. hydpy/models/sw1d/sw1d_receivers.py +11 -0
  814. hydpy/models/sw1d/sw1d_senders.py +11 -0
  815. hydpy/models/sw1d/sw1d_states.py +23 -0
  816. hydpy/models/sw1d_channel.py +2051 -0
  817. hydpy/models/sw1d_gate_out.py +599 -0
  818. hydpy/models/sw1d_lias.py +105 -0
  819. hydpy/models/sw1d_lias_sluice.py +531 -0
  820. hydpy/models/sw1d_network.py +1219 -0
  821. hydpy/models/sw1d_pump.py +448 -0
  822. hydpy/models/sw1d_q_in.py +79 -0
  823. hydpy/models/sw1d_q_out.py +81 -0
  824. hydpy/models/sw1d_storage.py +78 -0
  825. hydpy/models/sw1d_weir_out.py +75 -0
  826. hydpy/models/test/__init__.py +14 -0
  827. hydpy/models/test/test_control.py +28 -0
  828. hydpy/models/test/test_fluxes.py +17 -0
  829. hydpy/models/test/test_model.py +201 -0
  830. hydpy/models/test/test_solver.py +48 -0
  831. hydpy/models/test/test_states.py +17 -0
  832. hydpy/models/test_discontinous.py +46 -0
  833. hydpy/models/test_stiff0d.py +47 -0
  834. hydpy/models/test_stiff1d.py +42 -0
  835. hydpy/models/whmod/__init__.py +21 -0
  836. hydpy/models/whmod/whmod_constants.py +77 -0
  837. hydpy/models/whmod/whmod_control.py +333 -0
  838. hydpy/models/whmod/whmod_derived.py +210 -0
  839. hydpy/models/whmod/whmod_factors.py +9 -0
  840. hydpy/models/whmod/whmod_fluxes.py +105 -0
  841. hydpy/models/whmod/whmod_inputs.py +15 -0
  842. hydpy/models/whmod/whmod_masks.py +178 -0
  843. hydpy/models/whmod/whmod_model.py +2091 -0
  844. hydpy/models/whmod/whmod_parameters.py +155 -0
  845. hydpy/models/whmod/whmod_sequences.py +193 -0
  846. hydpy/models/whmod/whmod_states.py +73 -0
  847. hydpy/models/whmod_rural.py +794 -0
  848. hydpy/models/whmod_urban.py +1011 -0
  849. hydpy/models/wland/__init__.py +43 -0
  850. hydpy/models/wland/wland_aides.py +55 -0
  851. hydpy/models/wland/wland_constants.py +103 -0
  852. hydpy/models/wland/wland_control.py +508 -0
  853. hydpy/models/wland/wland_derived.py +330 -0
  854. hydpy/models/wland/wland_factors.py +11 -0
  855. hydpy/models/wland/wland_fixed.py +12 -0
  856. hydpy/models/wland/wland_fluxes.py +166 -0
  857. hydpy/models/wland/wland_inputs.py +33 -0
  858. hydpy/models/wland/wland_masks.py +54 -0
  859. hydpy/models/wland/wland_model.py +3755 -0
  860. hydpy/models/wland/wland_outlets.py +11 -0
  861. hydpy/models/wland/wland_parameters.py +214 -0
  862. hydpy/models/wland/wland_sequences.py +108 -0
  863. hydpy/models/wland/wland_solver.py +45 -0
  864. hydpy/models/wland/wland_states.py +56 -0
  865. hydpy/models/wland_gd.py +888 -0
  866. hydpy/models/wland_wag.py +1244 -0
  867. hydpy/models/wq/__init__.py +14 -0
  868. hydpy/models/wq/wq_control.py +117 -0
  869. hydpy/models/wq/wq_derived.py +182 -0
  870. hydpy/models/wq/wq_factors.py +79 -0
  871. hydpy/models/wq/wq_fluxes.py +17 -0
  872. hydpy/models/wq/wq_model.py +1889 -0
  873. hydpy/models/wq_trapeze.py +168 -0
  874. hydpy/models/wq_trapeze_strickler.py +101 -0
  875. hydpy/models/wq_walrus.py +57 -0
  876. hydpy/py.typed +0 -0
  877. hydpy/tests/.coveragerc +22 -0
  878. hydpy/tests/__init__.py +0 -0
  879. hydpy/tests/check_consistency.py +32 -0
  880. hydpy/tests/hydpydoctestcustomize.pth +1 -0
  881. hydpy/tests/hydpydoctestcustomize.py +15 -0
  882. hydpy/tests/iotesting/__init__.py +0 -0
  883. hydpy/tests/run_doctests.py +233 -0
  884. hydpy-6.2.dev1.data/scripts/hyd.py +277 -0
  885. hydpy-6.2.dev1.dist-info/LICENSE +165 -0
  886. hydpy-6.2.dev1.dist-info/METADATA +163 -0
  887. hydpy-6.2.dev1.dist-info/RECORD +890 -0
  888. hydpy-6.2.dev1.dist-info/WHEEL +5 -0
  889. hydpy-6.2.dev1.dist-info/licenses_hydpy_installer.txt +42 -0
  890. hydpy-6.2.dev1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,883 @@
1
+ """This module provides additional features for module |iuhtools|, related to
2
+ Autoregressive-Moving Average (ARMA) models."""
3
+
4
+ # import...
5
+ # ...from standard library
6
+ import itertools
7
+ import warnings
8
+
9
+ # ...from site-packages
10
+ import numpy
11
+
12
+ # ...from HydPy
13
+ import hydpy
14
+ from hydpy import config
15
+ from hydpy.core import exceptiontools
16
+ from hydpy.core import objecttools
17
+ from hydpy.core import propertytools
18
+ from hydpy.auxs import statstools
19
+ from hydpy.core.typingtools import *
20
+
21
+ if TYPE_CHECKING:
22
+ from matplotlib import pyplot
23
+ from scipy import integrate
24
+ else:
25
+ pyplot = exceptiontools.OptionalImport("pyplot", ["matplotlib.pyplot"], locals())
26
+ integrate = exceptiontools.OptionalImport(
27
+ "integrate", ["scipy.integrate"], locals()
28
+ )
29
+
30
+
31
+ class MA:
32
+ """Moving Average Model.
33
+
34
+ The MA coefficients can be set manually:
35
+
36
+ >>> from hydpy import MA
37
+ >>> ma = MA(coefs=(0.8, 0.2))
38
+ >>> ma
39
+ MA(coefs=(0.8, 0.2))
40
+ >>> ma.coefs = 0.2, 0.8
41
+ >>> ma
42
+ MA(coefs=(0.2, 0.8))
43
+
44
+ Otherwise they are determined by method |MA.update_coefs|. But this requires that
45
+ an integrable function object is given. Usually, this function object is an |IUH|
46
+ subclass object, but (as in the following example) other function objects defining
47
+ instantaneuous unit hydrographs are accepted. However, they should be well-behaved
48
+ (e.g. be relatively smooth, unimodal, strictly positive, unity integral surface in
49
+ the positive range).
50
+
51
+ For educational purposes, some discontinuous functions are applied in the following.
52
+ One can suppress the associated warning messages with the following commands:
53
+
54
+ >>> import warnings
55
+ >>> from scipy import integrate
56
+ >>> warnings.filterwarnings("ignore", category=integrate.IntegrationWarning)
57
+
58
+ The first example is a simple rectangle impuls:
59
+
60
+ >>> ma = MA(iuh=lambda x: 0.05 if x < 20.0 else 0.0)
61
+ >>> ma.iuh.moment1 = 10.0
62
+ >>> ma
63
+ MA(coefs=(0.025, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
64
+ 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
65
+ 0.025))
66
+
67
+ The number of the coefficients can be modified by changing the class attribute
68
+ |MA.smallest_coeff|:
69
+
70
+ >>> ma.smallest_coeff = 0.03
71
+ >>> ma.update_coefs()
72
+ >>> ma
73
+ MA(coefs=(0.025641, 0.051282, 0.051282, 0.051282, 0.051282, 0.051282,
74
+ 0.051282, 0.051282, 0.051282, 0.051282, 0.051282, 0.051282,
75
+ 0.051282, 0.051282, 0.051282, 0.051282, 0.051282, 0.051282,
76
+ 0.051282, 0.051282))
77
+
78
+
79
+ The first two central moments of the time delay are a usefull measure for
80
+ describing the operation of a MA model:
81
+
82
+ >>> ma = MA(iuh=lambda x: 1.0 if x < 1.0 else 0.0)
83
+ >>> ma.iuh.moment1 = 0.5
84
+ >>> ma
85
+ MA(coefs=(0.5, 0.5))
86
+ >>> from hydpy import round_
87
+ >>> round_(ma.moments, 6)
88
+ 0.5, 0.5
89
+
90
+ The first central moment is the weigthed time delay (mean lag time). The second
91
+ central moment is the weighted mean deviation from the mean lag time (diffusion).
92
+
93
+ MA objects can return the turning point in the recession part of their MA
94
+ coefficients. This can be demonstrated for the right side of the probability
95
+ density function of the normal distribution with zero mean and a standard deviation
96
+ (turning point) of 10:
97
+
98
+ >>> from scipy import stats
99
+ >>> ma = MA(iuh=lambda x: 2.0*stats.norm.pdf(x, 0.0, 2.0))
100
+ >>> ma.iuh.moment1 = 1.35
101
+ >>> ma
102
+ MA(coefs=(0.195417, 0.346659, 0.24189, 0.13277, 0.057318, 0.019458,
103
+ 0.005193, 0.001089, 0.00018, 0.000023, 0.000002, 0.0, 0.0))
104
+ >>> round_(ma.turningpoint)
105
+ 2, 0.24189
106
+
107
+ Note that the first returned value is the index of the the MA coefficient closest
108
+ to the turning point, and not a high precision estimate of the real turning point
109
+ of the instantaneous unit hydrograph.
110
+
111
+ You can also use the following ploting command to verify the position of the
112
+ turning point, which is printed as a red dot.
113
+
114
+ >>> ma.plot(threshold=0.9)
115
+
116
+ .. testsetup::
117
+
118
+ >>> from matplotlib import pyplot
119
+ >>> pyplot.close()
120
+
121
+ The turning point detection also works for functions which include both a rising
122
+ and a falling limb. This can be shown shifting the normal distribution to the
123
+ right:
124
+
125
+ >>> ma.iuh = lambda x: 1.02328*stats.norm.pdf(x, 4.0, 2.0)
126
+ >>> ma.iuh.moment1 = 3.94
127
+ >>> ma.update_coefs()
128
+ >>> ma
129
+ MA(coefs=(0.019322, 0.067931, 0.12376, 0.177364, 0.199966, 0.177364,
130
+ 0.12376, 0.067931, 0.029326, 0.009956, 0.002657, 0.000557,
131
+ 0.000092, 0.000012, 0.000001, 0.0, 0.0))
132
+ >>> round_(ma.turningpoint)
133
+ 6, 0.12376
134
+
135
+ When no turning point can be detected, an error is raised:
136
+
137
+ >>> ma.coefs = 1.0, 1.0, 1.0
138
+ >>> ma.turningpoint
139
+ Traceback (most recent call last):
140
+ ...
141
+ RuntimeError: Not able to detect a turning point in the impulse response defined \
142
+ by the MA coefficients `1.0, 1.0, 1.0`.
143
+
144
+ The next example requires reactivating the warning suppressed above:
145
+
146
+ >>> warnings.filterwarnings("error", category=integrate.IntegrationWarning)
147
+
148
+ The MA coefficients need to be approximated numerically. For very spiky response
149
+ function, the underlying integration algorithm might fail. Then it is assumed that
150
+ the complete mass of the response function is placed at a single delay time,
151
+ defined by the property `moment1` of the instantaneous unit hydrograph. Hopefully,
152
+ this leads to plausible results. However, we raise an additional warning message
153
+ to allow users to determine the coefficients by a different approach:
154
+
155
+ >>> ma.iuh = lambda x: 10.0 if 4.2 < x <= 4.3 else 0.0
156
+ >>> ma.iuh.moment1 = 4.25
157
+ >>> ma.update_coefs() # doctest: +ELLIPSIS
158
+ Traceback (most recent call last):
159
+ ...
160
+ UserWarning: During the determination of the MA coefficients corresponding to the \
161
+ instantaneous unit hydrograph ... a numerical integration problem occurred. \
162
+ Please check the calculated coefficients: 0.0, 0.0, 0.0, 0.0, 0.75, 0.25.
163
+ >>> ma
164
+ MA(coefs=(0.0, 0.0, 0.0, 0.0, 0.75, 0.25))
165
+
166
+ For very steep response functions, numerical integration might fail:
167
+
168
+ >>> ma = MA(iuh=lambda x: stats.norm.pdf(x, 4.0, 1e-6))
169
+ >>> ma.iuh.moment1 = 4.0
170
+ >>> ma.update_coefs() # doctest: +ELLIPSIS
171
+ Traceback (most recent call last):
172
+ ...
173
+ RuntimeError: Cannot determine the MA coefficients corresponding to the \
174
+ instantaneous unit hydrograph `...`.
175
+
176
+ For very fast responses, there should be only one MA coefficient that has the value
177
+ 1. Method |MA.update_coefs| provides a heuristic for such cases where numerical
178
+ integration fails. As we are not sure that this heuristic works in all possible
179
+ cases, |MA.update_coefs| raises the following warning in such cases:
180
+
181
+ >>> ma = MA(iuh=lambda x: 1e6*numpy.exp(-1e6*x))
182
+ >>> ma.iuh.moment1 = 6.931e-7
183
+ >>> ma # doctest: +ELLIPSIS
184
+ Traceback (most recent call last):
185
+ ...
186
+ UserWarning: During the determination of the MA coefficients corresponding to the \
187
+ instantaneous unit hydrograph `...` a numerical integration problem occurred. Please \
188
+ check the calculated coefficients: 1.0.
189
+
190
+ >>> ma
191
+ MA(coefs=(1.0,))
192
+ """
193
+
194
+ smallest_coeff: float = 1e-9
195
+ """Smalles MA coefficient to be determined at the end of the response."""
196
+
197
+ _coefs: VectorFloat | None = None
198
+
199
+ def __init__(self, iuh=None, coefs=None) -> None:
200
+ self.iuh = iuh
201
+ if coefs is not None:
202
+ self.coefs = coefs
203
+
204
+ def _get_coefs(self) -> VectorFloat:
205
+ """|numpy.ndarray| containing all MA coefficents."""
206
+ if (coefs := self._coefs) is not None:
207
+ return coefs
208
+ self.update_coefs()
209
+ assert (coefs := self._coefs) is not None
210
+ return coefs
211
+
212
+ def _set_coefs(self, values: VectorInputFloat) -> None:
213
+ self._coefs = numpy.array(values, ndmin=1, dtype=config.NP_FLOAT)
214
+
215
+ def _del_coefs(self) -> None:
216
+ self._coefs = None
217
+
218
+ coefs = propertytools.Property(fget=_get_coefs, fset=_set_coefs, fdel=_del_coefs)
219
+
220
+ @property
221
+ def order(self) -> int:
222
+ """MA order."""
223
+ return len(self.coefs)
224
+
225
+ def _quad(self, dt, t) -> None:
226
+ return integrate.quad(self.iuh, max(t - 1.0 + dt, 0.0), t + dt)[0]
227
+
228
+ def update_coefs(self) -> None:
229
+ """(Re)calculate the MA coefficients based on the instantaneous unit
230
+ hydrograph."""
231
+ coefs: list[float] = []
232
+ sum_coefs = 0.0
233
+ moment1 = self.iuh.moment1
234
+ for t in itertools.count(0.0, 1.0):
235
+ points = (moment1 % 1,) if t <= moment1 <= (t + 2.0) else ()
236
+ try:
237
+ coef = integrate.quad(self._quad, 0.0, 1.0, args=(t,), points=points)[0]
238
+ except integrate.IntegrationWarning:
239
+ idx = int(moment1)
240
+ coefs_ = numpy.zeros(idx + 2, dtype=config.NP_FLOAT)
241
+ weight = moment1 - idx
242
+ coefs_[idx] = 1.0 - weight
243
+ coefs_[idx + 1] = weight
244
+ self.coefs = coefs_
245
+ self._raise_integrationwarning(coefs_)
246
+ break # pragma: no cover
247
+ sum_coefs += coef
248
+ if (sum_coefs < 0.5) and (t > 10.0 * moment1):
249
+ if moment1 < 0.01:
250
+ self.coefs = numpy.ones(1, dtype=config.NP_FLOAT)
251
+ self._raise_integrationwarning(self.coefs)
252
+ break # pragma: no cover
253
+ raise RuntimeError(
254
+ f"Cannot determine the MA coefficients corresponding to the "
255
+ f"instantaneous unit hydrograph `{repr(self.iuh)}`."
256
+ )
257
+ if (sum_coefs > 0.9) and (coef < self.smallest_coeff):
258
+ self.coefs = (coefs_ := numpy.asarray(coefs)) / sum(coefs_)
259
+ break
260
+ coefs.append(coef)
261
+
262
+ def _raise_integrationwarning(self, coefs) -> None:
263
+ warnings.warn(
264
+ f"During the determination of the MA coefficients corresponding to the "
265
+ f"instantaneous unit hydrograph `{repr(self.iuh)}` a numerical integration "
266
+ f"problem occurred. Please check the calculated coefficients: "
267
+ f"{objecttools.repr_values(coefs)}."
268
+ )
269
+
270
+ @property
271
+ def turningpoint(self) -> tuple[int, float]:
272
+ """Turning point (index and value tuple) in the recession part of the MA
273
+ approximation of the instantaneous unit hydrograph."""
274
+ coefs = self.coefs
275
+ old_dc = coefs[1] - coefs[0]
276
+ for idx in range(self.order - 2):
277
+ new_dc = coefs[idx + 2] - coefs[idx + 1]
278
+ if (old_dc < 0.0) and (new_dc > old_dc):
279
+ return idx, coefs[idx]
280
+ old_dc = new_dc
281
+ raise RuntimeError(
282
+ f"Not able to detect a turning point in the impulse response "
283
+ f"defined by the MA coefficients `{objecttools.repr_values(coefs)}`."
284
+ )
285
+
286
+ @property
287
+ def delays(self) -> VectorFloat:
288
+ """Time delays related to the individual MA coefficients."""
289
+ return numpy.arange(self.order, dtype=config.NP_FLOAT)
290
+
291
+ @property
292
+ def moments(self) -> tuple[float, float]:
293
+ """The first two time delay weighted statistical moments of the MA
294
+ coefficients."""
295
+ moment1 = statstools.calc_mean_time(self.delays, self.coefs)
296
+ moment2 = statstools.calc_mean_time_deviation(self.delays, self.coefs, moment1)
297
+ return moment1, moment2
298
+
299
+ def plot(self, threshold=None, **kwargs) -> None:
300
+ """Barplot of the MA coefficients."""
301
+ try:
302
+ # Works under matplotlib 3.
303
+ pyplot.bar(
304
+ x=self.delays + 0.5, height=self.coefs, width=1.0, fill=False, **kwargs
305
+ )
306
+ except TypeError: # pragma: no cover
307
+ # Works under matplotlib 2.
308
+ pyplot.bar(
309
+ left=self.delays + 0.5,
310
+ height=self.coefs,
311
+ width=1.0,
312
+ fill=False,
313
+ **kwargs,
314
+ )
315
+ pyplot.xlabel("time")
316
+ pyplot.ylabel("response")
317
+ if threshold is not None:
318
+ cumsum = numpy.cumsum(self.coefs)
319
+ idx = numpy.where(cumsum > threshold * cumsum[-1])[0][0]
320
+ pyplot.xlim(0.0, idx)
321
+ idx, value = self.turningpoint
322
+ pyplot.plot(idx, value, "ro")
323
+
324
+ def __repr__(self):
325
+ return objecttools.assignrepr_tuple(self.coefs, "MA(coefs=", 70) + ")"
326
+
327
+
328
+ class ARMA:
329
+ """Autoregressive-Moving Average model.
330
+
331
+ One can set all ARMA coefficients manually:
332
+
333
+ >>> from hydpy import MA, ARMA, print_matrix
334
+ >>> arma = ARMA(ar_coefs=(0.5,), ma_coefs=(0.3, 0.2))
335
+ >>> print_matrix(arma.coefs)
336
+ | 0.5 |
337
+ | 0.3, 0.2 |
338
+ >>> arma
339
+ ARMA(ar_coefs=(0.5,),
340
+ ma_coefs=(0.3, 0.2))
341
+
342
+ >>> arma.ar_coefs = ()
343
+ >>> arma.ma_coefs = range(20)
344
+ >>> arma
345
+ ARMA(ar_coefs=(),
346
+ ma_coefs=(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
347
+ 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0))
348
+
349
+ Alternatively, they are determined by method |ARMA.update_coefs|, which requires an
350
+ available |MA|. We use the MA model based on the shifted normal distribution of
351
+ the documentation on class |MA| as an example:
352
+
353
+ >>> from scipy import stats
354
+ >>> ma = MA(iuh=lambda x: 1.02328 * stats.norm.pdf(x, 4.0, 2.0))
355
+ >>> ma.iuh.moment1 = 3.94
356
+ >>> arma = ARMA(ma_model=ma)
357
+ >>> arma
358
+ ARMA(ar_coefs=(0.680483, -0.228511, 0.047283, -0.006022, 0.000377),
359
+ ma_coefs=(0.019322, 0.054783, 0.08195, 0.107757, 0.104458,
360
+ 0.07637, 0.041095, 0.01581, 0.004132, 0.000663,
361
+ 0.00005))
362
+
363
+ To verify that the ARMA model approximates the MA model with sufficient accuracy,
364
+ one can query the achieved relative rmse value (|ARMA.rel_rmse|) or check the
365
+ central moments of their responses to the standard delta time impulse:
366
+
367
+ >>> from hydpy import round_
368
+ >>> round_(arma.rel_rmse)
369
+ 0.0
370
+ >>> round_(ma.moments)
371
+ 4.110496, 1.926798
372
+ >>> round_(arma.moments)
373
+ 4.110496, 1.926798
374
+
375
+ On can check the accuray of the approximation directly via the property
376
+ |ARMA.dev_moments|, which is the sum of the absolute values of the deviations of
377
+ both methods:
378
+
379
+ >>> round_(arma.dev_moments)
380
+ 0.0
381
+
382
+ For the first six digits, there is no difference. However, the total number of
383
+ coefficients is only reduced by one:
384
+
385
+ >>> ma.order
386
+ 17
387
+ >>> arma.order
388
+ (5, 11)
389
+
390
+ To reduce the determined number or AR coefficients, one can set a higher AR-related
391
+ tolerance value:
392
+
393
+ >>> arma.max_rel_rmse = 1e-3
394
+ >>> arma.update_coefs()
395
+ >>> arma
396
+ ARMA(ar_coefs=(0.788899, -0.256436, 0.034256),
397
+ ma_coefs=(0.019322, 0.052688, 0.075125, 0.096488, 0.089453,
398
+ 0.060854, 0.029041, 0.008929, 0.001397, 0.000001,
399
+ -0.000004, 0.00001, -0.000008, -0.000009, -0.000004,
400
+ -0.000001))
401
+
402
+ The number of AR coeffcients is actually reduced. However, there are now even more
403
+ MA coefficients, possibly trying to compensate the lower accuracy of the AR
404
+ coefficients, and there is a slight decrease in the precision of the moments:
405
+
406
+ >>> arma.order
407
+ (3, 16)
408
+ >>> round_(arma.moments)
409
+ 4.110497, 1.926804
410
+ >>> round_(arma.dev_moments)
411
+ 0.000007
412
+
413
+ To also reduce the number of MA coefficients, one can set a higher MA-related
414
+ tolerance value:
415
+
416
+ >>> arma.max_dev_coefs = 1e-3
417
+ >>> arma.update_coefs()
418
+ >>> arma
419
+ ARMA(ar_coefs=(0.788888, -0.256432, 0.034255),
420
+ ma_coefs=(0.019321, 0.052687, 0.075124, 0.096486, 0.089452,
421
+ 0.060853, 0.02904, 0.008929, 0.001397))
422
+
423
+ Now the total number of coefficients is in fact decreased, and the loss in accuracy
424
+ is still small:
425
+
426
+ >>> arma.order
427
+ (3, 9)
428
+ >>> round_(arma.moments)
429
+ 4.110794, 1.927625
430
+ >>> round_(arma.dev_moments)
431
+ 0.001125
432
+
433
+ Further relaxing the tolerance values results in even less coefficients, but also
434
+ in some slightly negative responses to a standard impulse:
435
+
436
+ >>> arma.max_rel_rmse = 1e-2
437
+ >>> arma.max_dev_coefs = 1e-2
438
+ >>> from hydpy.core.testtools import warn_later
439
+ >>> with warn_later():
440
+ ... arma.update_coefs()
441
+ UserWarning: Note that the smallest response to a standard impulse of the \
442
+ determined ARMA model is negative (`-0.000336`).
443
+ >>> arma
444
+ ARMA(ar_coefs=(0.736954, -0.166457),
445
+ ma_coefs=(0.01946, 0.05418, 0.077804, 0.098741, 0.091295,
446
+ 0.060797, 0.027226))
447
+ >>> arma.order
448
+ (2, 7)
449
+ >>> from hydpy import print_vector
450
+ >>> print_vector(arma.response)
451
+ 0.01946, 0.068521, 0.125062, 0.1795, 0.202761, 0.180343, 0.12638,
452
+ 0.063117, 0.025477, 0.008269, 0.001853, -0.000011, -0.000316,
453
+ -0.000231, -0.000118, -0.000048, -0.000016
454
+
455
+ It seems to be hard to find a parameter efficient approximation to the MA model in
456
+ the given example. Generally, approximating ARMA models to MA models is more
457
+ beneficial when functions with long tails are involved. The most extreme example
458
+ would be a simple exponential decline:
459
+
460
+ >>> import numpy
461
+ >>> ma = MA(iuh=lambda x: 0.1*numpy.exp(-0.1*x))
462
+ >>> ma.iuh.moment1 = 6.932
463
+ >>> arma = ARMA(ma_model=ma)
464
+
465
+ In the given example a number of 185 MA coefficients can be reduced to a total
466
+ number of three ARMA coefficients with no relevant loss of accuracy:
467
+
468
+ >>> ma.order
469
+ 185
470
+ >>> arma.order
471
+ (1, 2)
472
+ >>> round_(arma.dev_moments)
473
+ 0.0
474
+
475
+ Use the following plotting command to see why 2 MA coeffcients instead of one are
476
+ required in the above example:
477
+
478
+ >>> arma.plot(threshold=0.9)
479
+
480
+ Violations of the tolerance values are reported as warnings:
481
+
482
+ >>> arma.max_dev_coefs = 0.0
483
+ >>> arma.update_coefs()
484
+ Traceback (most recent call last):
485
+ ...
486
+ UserWarning: Method `update_ma_coefs` is not able to determine the MA coefficients \
487
+ of the ARMA model with the desired accuracy. You can set the tolerance value \
488
+ ´max_dev_coefs` to a higher value. An accuracy of `0.000000000925` has been reached \
489
+ using `185` MA coefficients.
490
+ >>> arma.max_rel_rmse = 0.0
491
+ >>> arma.update_coefs()
492
+ Traceback (most recent call last):
493
+ ...
494
+ UserWarning: Method `update_ar_coefs` is not able to determine the AR coefficients \
495
+ of the ARMA model with the desired accuracy. You can either set the tolerance value \
496
+ `max_rel_rmse` to a higher value or increase the allowed `max_ar_order`. An accuracy \
497
+ of `0.0` has been reached using `10` coefficients.
498
+ >>> arma.ma.coefs = 1.0, 1.0, 1.0
499
+ >>> arma.update_coefs()
500
+ Traceback (most recent call last):
501
+ ...
502
+ UserWarning: Not able to detect a turning point in the impulse response defined \
503
+ by the MA coefficients `1.0, 1.0, 1.0`.
504
+
505
+ When getting such warnings, you need to inspect the achieved coefficients manually.
506
+ In the last case, when the turning point detection failed, method
507
+ |ARMA.update_coefs| simplified the ARMA to the original MA model, which is safe but
508
+ not always a good choice:
509
+
510
+ >>> import warnings
511
+ >>> with warnings.catch_warnings():
512
+ ... warnings.simplefilter("ignore")
513
+ ... arma.update_coefs()
514
+ >>> arma
515
+ ARMA(ar_coefs=(),
516
+ ma_coefs=(0.333333, 0.333333, 0.333333))
517
+ """
518
+
519
+ max_ar_order: int = 10
520
+ """Maximum number of AR coefficients that are to be determined by method
521
+ |ARMA.update_coefs|."""
522
+
523
+ max_rel_rmse: float = 1e-6
524
+ """Maximum relative root mean squared error to be accepted by method
525
+ |ARMA.update_coefs|."""
526
+
527
+ max_dev_coefs: float = 1e-6
528
+ """Maximum deviation of the sum of all coefficents from one to be accepted by
529
+ method |ARMA.update_coefs|."""
530
+
531
+ _ma_coefs: VectorFloat | None = None
532
+ _ar_coefs: VectorFloat | None = None
533
+ _rel_rmse: float | None
534
+
535
+ def __init__(self, ma_model=None, ar_coefs=None, ma_coefs=None) -> None:
536
+ self.ma = ma_model
537
+ if ar_coefs is not None:
538
+ self.ar_coefs = ar_coefs
539
+ if ma_coefs is not None:
540
+ self.ma_coefs = ma_coefs
541
+ self._rel_rmse = None
542
+
543
+ @property
544
+ def rel_rmse(self) -> float:
545
+ """Relative root mean squared error the last time achieved by method
546
+ |ARMA.update_coefs|.
547
+
548
+ >>> from hydpy.auxs.armatools import ARMA
549
+ >>> ARMA().rel_rmse
550
+ Traceback (most recent call last):
551
+ ...
552
+ RuntimeError: The relative root mean squared error has not been determined so \
553
+ far.
554
+ """
555
+ if (rel_rmse := self._rel_rmse) is None:
556
+ raise RuntimeError(
557
+ "The relative root mean squared error has not been determined so far."
558
+ )
559
+ return rel_rmse
560
+
561
+ def _get_ar_coefs(self) -> VectorFloat:
562
+ """The AR coefficients of the ARMA model.
563
+
564
+ |property| |ARMA.ar_coefs| does not recalculate already defined coefficients
565
+ automatically for efficiency:
566
+
567
+ >>> from hydpy import MA, ARMA, print_vector
568
+ >>> arma = ARMA(ar_coefs=(0.5,), ma_coefs=(0.3, 0.2))
569
+ >>> from scipy import stats
570
+ >>> arma.ma = MA(iuh=lambda x: 1.02328 * stats.norm.pdf(x, 4.0, 2.0))
571
+ >>> arma.ma.iuh.moment1 = 3.94
572
+ >>> print_vector(arma.ar_coefs)
573
+ 0.5
574
+
575
+ You can trigger the recalculation by removing the available coefficients first:
576
+
577
+ >>> del arma.ar_coefs
578
+ >>> print_vector(arma.ar_coefs)
579
+ 0.680483, -0.228511, 0.047283, -0.006022, 0.000377
580
+ >>> arma
581
+ ARMA(ar_coefs=(0.680483, -0.228511, 0.047283, -0.006022, 0.000377),
582
+ ma_coefs=(0.019322, 0.054783, 0.08195, 0.107757, 0.104458,
583
+ 0.07637, 0.041095, 0.01581, 0.004132, 0.000663,
584
+ 0.00005))
585
+ """
586
+ if (ar_coefs := self._ar_coefs) is not None:
587
+ return ar_coefs
588
+ self.update_coefs()
589
+ assert (ar_coefs := self._ar_coefs) is not None
590
+ return ar_coefs
591
+
592
+ def _set_ar_coefs(self, values) -> None:
593
+ self._ar_coefs = numpy.array(values, ndmin=1, dtype=config.NP_FLOAT)
594
+
595
+ def _del_ar_coefs(self) -> None:
596
+ self._ar_coefs = None
597
+
598
+ ar_coefs = propertytools.Property(
599
+ fget=_get_ar_coefs, fset=_set_ar_coefs, fdel=_del_ar_coefs
600
+ )
601
+
602
+ def _get_ma_coefs(self) -> VectorFloat:
603
+ """The MA coefficients of the ARMA model.
604
+
605
+ |property| |ARMA.ma_coefs| does not recalculate already defined coefficients
606
+ automatically for efficiency:
607
+
608
+ >>> from hydpy import MA, ARMA, print_vector
609
+ >>> arma = ARMA(ar_coefs=(0.5,), ma_coefs=(0.3, 0.2))
610
+ >>> from scipy import stats
611
+ >>> arma.ma = MA(iuh=lambda x: 1.02328 * stats.norm.pdf(x, 4.0, 2.0))
612
+ >>> arma.ma.iuh.moment1 = 3.94
613
+ >>> print_vector(arma.ma_coefs)
614
+ 0.3, 0.2
615
+
616
+ You can trigger the recalculation by removing the available coefficients first:
617
+
618
+ >>> del arma.ma_coefs
619
+ >>> print_vector(arma.ma_coefs)
620
+ 0.019322, 0.054783, 0.08195, 0.107757, 0.104458, 0.07637, 0.041095,
621
+ 0.01581, 0.004132, 0.000663, 0.00005
622
+ >>> arma
623
+ ARMA(ar_coefs=(0.680483, -0.228511, 0.047283, -0.006022, 0.000377),
624
+ ma_coefs=(0.019322, 0.054783, 0.08195, 0.107757, 0.104458,
625
+ 0.07637, 0.041095, 0.01581, 0.004132, 0.000663,
626
+ 0.00005))
627
+ """
628
+ if (ma_coefs := self._ma_coefs) is not None:
629
+ return ma_coefs
630
+ self.update_coefs()
631
+ assert (ma_coefs := self._ma_coefs) is not None
632
+ return ma_coefs
633
+
634
+ def _set_ma_coefs(self, values: VectorInputFloat) -> None:
635
+ self._ma_coefs = numpy.array(values, ndmin=1, dtype=config.NP_FLOAT)
636
+
637
+ def _del_ma_coefs(self) -> None:
638
+ self._ma_coefs = None
639
+
640
+ ma_coefs = propertytools.Property(
641
+ fget=_get_ma_coefs, fset=_set_ma_coefs, fdel=_del_ma_coefs
642
+ )
643
+
644
+ @property
645
+ def coefs(self) -> tuple[VectorFloat, VectorFloat]:
646
+ """Tuple containing both the AR and the MA coefficients."""
647
+ return self.ar_coefs, self.ma_coefs
648
+
649
+ @property
650
+ def ar_order(self) -> int:
651
+ """Number of AR coefficients."""
652
+ return len(self.ar_coefs)
653
+
654
+ @property
655
+ def ma_order(self) -> int:
656
+ """Number of MA coefficients"""
657
+ return len(self.ma_coefs)
658
+
659
+ @property
660
+ def order(self) -> tuple[int, int]:
661
+ """Number of both the AR and the MA coefficients."""
662
+ return self.ar_order, self.ma_order
663
+
664
+ def update_coefs(self) -> None:
665
+ """Determine both the AR and the MA coefficients."""
666
+ self.update_ar_coefs()
667
+ self.update_ma_coefs()
668
+ self.norm_coefs()
669
+
670
+ @property
671
+ def effective_max_ar_order(self) -> int:
672
+ """The maximum number of AR coefficients that shall or can be determined.
673
+
674
+ It is the minimum of |ARMA.max_ar_order| and the number of coefficients of the
675
+ pure |MA| after their turning point.
676
+ """
677
+ try:
678
+ return min(self.max_ar_order, self.ma.order - self.ma.turningpoint[0] - 1)
679
+ except RuntimeError as exc:
680
+ warnings.warn(str(exc))
681
+ return 0
682
+
683
+ def update_ar_coefs(self) -> None:
684
+ """Determine the AR coefficients.
685
+
686
+ The number of AR coefficients is subsequently increased until the required
687
+ precision |ARMA.max_rel_rmse| or the maximum number of AR coefficients
688
+ (see |ARMA.effective_max_ar_order|) is reached. In the second case,
689
+ |ARMA.update_ar_coefs| raises a warning.
690
+ """
691
+ del self.ar_coefs
692
+ if (max_ar_order := self.effective_max_ar_order) == 0:
693
+ self.ar_coefs = ()
694
+ else:
695
+ for ar_order in range(1, max_ar_order + 1):
696
+ self.calc_all_ar_coefs(ar_order, self.ma)
697
+ if self.rel_rmse < self.max_rel_rmse:
698
+ break
699
+ else:
700
+ with hydpy.pub.options.reprdigits(12):
701
+ warnings.warn(
702
+ f"Method `update_ar_coefs` is not able to determine the AR "
703
+ f"coefficients of the ARMA model with the desired accuracy. "
704
+ f"You can either set the tolerance value `max_rel_rmse` to a "
705
+ f"higher value or increase the allowed `max_ar_order`. An "
706
+ f"accuracy of `{objecttools.repr_(self._rel_rmse)}` has been "
707
+ f"reached using `{self.effective_max_ar_order}` coefficients."
708
+ )
709
+
710
+ @property
711
+ def dev_moments(self) -> float:
712
+ """Sum of the absolute deviations between the central moments of the
713
+ instantaneous unit hydrograph and the ARMA approximation."""
714
+ m1, m2 = self.moments, self.ma.moments
715
+ return abs(m1[0] - m2[0]) + abs(m1[1] - m2[1])
716
+
717
+ def norm_coefs(self) -> None:
718
+ """Multiply all coefficients by the same factor, so that their sum becomes
719
+ one."""
720
+ sum_coefs = self.sum_coefs
721
+ self.ar_coefs /= sum_coefs
722
+ self.ma_coefs /= sum_coefs
723
+
724
+ @property
725
+ def sum_coefs(self) -> float:
726
+ """The sum of all AR and MA coefficients"""
727
+ return float(numpy.sum(self.ar_coefs) + numpy.sum(self.ma_coefs))
728
+
729
+ @property
730
+ def dev_coefs(self) -> float:
731
+ """Absolute deviation of |ARMA.sum_coefs| from one."""
732
+ return abs(self.sum_coefs - 1.0)
733
+
734
+ def calc_all_ar_coefs(self, ar_order: int, ma_model: MA) -> None:
735
+ """Determine the AR coeffcients based on a least squares approach.
736
+
737
+ The argument `ar_order` defines the number of AR coefficients to be determined.
738
+ The argument `ma_order` defines a pure |MA| model. The least squares approach
739
+ is applied on all those coefficents of the pure MA model, which are associated
740
+ with the part of the recession curve behind its turning point.
741
+
742
+ The attribute |ARMA.rel_rmse| is updated with the resulting relative root mean
743
+ square error.
744
+ """
745
+ turning_idx, _ = ma_model.turningpoint
746
+ values = ma_model.coefs[turning_idx:]
747
+ self.ar_coefs, residuals = numpy.linalg.lstsq(
748
+ self.get_a(values, ar_order), self.get_b(values, ar_order), rcond=-1
749
+ )[:2]
750
+ if len(residuals) == 1:
751
+ self._rel_rmse = numpy.sqrt(residuals[0]) / numpy.sum(values)
752
+ else:
753
+ self._rel_rmse = 0.0
754
+
755
+ @staticmethod
756
+ def get_a(values, n):
757
+ """Extract the independent variables of the given values and return them as a
758
+ matrix with n columns in a form suitable for the least squares approach applied
759
+ in method |ARMA.update_ar_coefs|.
760
+ """
761
+ m = len(values) - n
762
+ a = numpy.empty((m, n), dtype=config.NP_FLOAT)
763
+ for i in range(m):
764
+ i0 = i - 1 if i > 0 else None
765
+ i1 = i + n - 1
766
+ a[i] = values[i1:i0:-1]
767
+ return numpy.array(a)
768
+
769
+ @staticmethod
770
+ def get_b(values, n):
771
+ """Extract the dependent variables of the values in a vector with n entries in
772
+ a form suitable for the least squares approach applied in method
773
+ |ARMA.update_ar_coefs|.
774
+ """
775
+ return numpy.array(values[n:])
776
+
777
+ def update_ma_coefs(self) -> None:
778
+ """Determine the MA coefficients.
779
+
780
+ The number of MA coefficients is subsequently increased until the required
781
+ precision (|ARMA.max_dev_coefs|) or the or the order of the original |MA| model
782
+ is reached. In the second case, |ARMA.update_ma_coefs| raises a warning.
783
+ """
784
+ self.ma_coefs = []
785
+ for ma_order in range(1, self.ma.order + 1):
786
+ self.calc_next_ma_coef(ma_order, self.ma)
787
+ if self.dev_coefs < self.max_dev_coefs:
788
+ break
789
+ else:
790
+ with hydpy.pub.options.reprdigits(12):
791
+ warnings.warn(
792
+ f"Method `update_ma_coefs` is not able to determine the MA "
793
+ f"coefficients of the ARMA model with the desired accuracy. You "
794
+ f"can set the tolerance value ´max_dev_coefs` to a higher value. "
795
+ f"An accuracy of `{objecttools.repr_(self.dev_coefs)}` has been "
796
+ f"reached using `{self.ma.order}` MA coefficients."
797
+ )
798
+ if numpy.min(self.response) < 0.0:
799
+ warnings.warn(
800
+ f"Note that the smallest response to a standard impulse of the "
801
+ f"determined ARMA model is negative "
802
+ f"(`{objecttools.repr_(numpy.min(self.response))}`)."
803
+ )
804
+
805
+ def calc_next_ma_coef(self, ma_order, ma_model) -> None:
806
+ """Determine the MA coefficients of the ARMA model based on its predetermined
807
+ AR coefficients and the MA ordinates of the given |MA| model.
808
+
809
+ The MA coefficients are determined one at a time, beginning with the first one.
810
+ Each ARMA MA coefficient in set in a manner that allows for the exact
811
+ reproduction of the equivalent pure MA coefficient with all relevant ARMA
812
+ coefficients.
813
+ """
814
+ idx = ma_order - 1
815
+ coef = ma_model.coefs[idx]
816
+ for jdx, ar_coef in enumerate(self.ar_coefs):
817
+ zdx = idx - jdx - 1
818
+ if zdx >= 0:
819
+ coef -= ar_coef * ma_model.coefs[zdx]
820
+ self.ma_coefs = numpy.concatenate((self.ma_coefs, numpy.asarray([coef])))
821
+
822
+ @property
823
+ def response(self) -> VectorFloat:
824
+ """Return the response to a standard dt impulse."""
825
+ values: list[float] = []
826
+ sum_values = 0.0
827
+ ma_coefs = self.ma_coefs
828
+ ar_coefs = self.ar_coefs
829
+ ma_order = self.ma_order
830
+ for idx in range(len(self.ma.delays)):
831
+ value = 0.0
832
+ if idx < ma_order:
833
+ value += ma_coefs[idx]
834
+ for jdx, ar_coef in enumerate(ar_coefs):
835
+ zdx = idx - jdx - 1
836
+ if zdx >= 0:
837
+ value += ar_coef * values[zdx]
838
+ values.append(value)
839
+ sum_values += value
840
+ return numpy.array(values)
841
+
842
+ @property
843
+ def moments(self) -> tuple[float, float]:
844
+ """The first two time delay weighted statistical moments of the ARMA
845
+ response."""
846
+ timepoints = self.ma.delays
847
+ response = self.response
848
+ moment1 = statstools.calc_mean_time(timepoints, response)
849
+ moment2 = statstools.calc_mean_time_deviation(timepoints, response, moment1)
850
+ return moment1, moment2
851
+
852
+ def plot(self, threshold=None, **kwargs) -> None:
853
+ """Barplot of the ARMA response."""
854
+ try:
855
+ # Works under matplotlib 3.
856
+ pyplot.bar(
857
+ x=self.ma.delays + 0.5,
858
+ height=self.response,
859
+ width=1.0,
860
+ fill=False,
861
+ **kwargs,
862
+ )
863
+ except TypeError: # pragma: no cover
864
+ # Works under matplotlib 2.
865
+ pyplot.bar(
866
+ left=self.ma.delays + 0.5,
867
+ height=self.response,
868
+ width=1.0,
869
+ fill=False,
870
+ **kwargs,
871
+ )
872
+ pyplot.xlabel("time")
873
+ pyplot.ylabel("response")
874
+ if threshold is not None:
875
+ cumsum = numpy.cumsum(self.response)
876
+ idx = numpy.where(cumsum > threshold * cumsum[-1])[0][0]
877
+ pyplot.xlim(0.0, idx)
878
+
879
+ def __repr__(self) -> str:
880
+ return (
881
+ f"{objecttools.assignrepr_tuple(self.ar_coefs, 'ARMA(ar_coefs=', 70)},\n"
882
+ f"{objecttools.assignrepr_tuple(self.ma_coefs, ' ma_coefs=', 70)})"
883
+ )