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.
- hydpy/__init__.py +275 -0
- hydpy/aliases.py +2554 -0
- hydpy/auxs/__init__.py +0 -0
- hydpy/auxs/anntools.py +1305 -0
- hydpy/auxs/armatools.py +883 -0
- hydpy/auxs/calibtools.py +3337 -0
- hydpy/auxs/interptools.py +1094 -0
- hydpy/auxs/iuhtools.py +543 -0
- hydpy/auxs/networktools.py +597 -0
- hydpy/auxs/ppolytools.py +809 -0
- hydpy/auxs/quadtools.py +61 -0
- hydpy/auxs/roottools.py +228 -0
- hydpy/auxs/smoothtools.py +273 -0
- hydpy/auxs/statstools.py +2125 -0
- hydpy/auxs/validtools.py +81 -0
- hydpy/conf/HydPyConfigBase.xsd +68637 -0
- hydpy/conf/HydPyConfigBase.xsdt +358 -0
- hydpy/conf/HydPyConfigMultipleRuns.xsd +25 -0
- hydpy/conf/HydPyConfigSingleRun.xsd +24 -0
- hydpy/conf/__init__.py +0 -0
- hydpy/conf/a_coefficients_explicit_lobatto_sequence.npy +0 -0
- hydpy/conf/support_points_for_smoothpar_logistic2.npy +0 -0
- hydpy/config.py +42 -0
- hydpy/core/__init__.py +0 -0
- hydpy/core/aliastools.py +214 -0
- hydpy/core/autodoctools.py +1947 -0
- hydpy/core/auxfiletools.py +1169 -0
- hydpy/core/devicetools.py +3810 -0
- hydpy/core/exceptiontools.py +269 -0
- hydpy/core/filetools.py +1985 -0
- hydpy/core/hydpytools.py +3089 -0
- hydpy/core/importtools.py +1398 -0
- hydpy/core/indextools.py +345 -0
- hydpy/core/itemtools.py +1849 -0
- hydpy/core/masktools.py +460 -0
- hydpy/core/modeltools.py +4868 -0
- hydpy/core/netcdftools.py +2683 -0
- hydpy/core/objecttools.py +2023 -0
- hydpy/core/optiontools.py +1045 -0
- hydpy/core/parametertools.py +4674 -0
- hydpy/core/printtools.py +222 -0
- hydpy/core/propertytools.py +643 -0
- hydpy/core/pubtools.py +254 -0
- hydpy/core/selectiontools.py +1571 -0
- hydpy/core/sequencetools.py +4476 -0
- hydpy/core/seriestools.py +339 -0
- hydpy/core/testtools.py +2483 -0
- hydpy/core/timetools.py +3567 -0
- hydpy/core/typingtools.py +333 -0
- hydpy/core/variabletools.py +2615 -0
- hydpy/cythons/__init__.py +24 -0
- hydpy/cythons/annutils.pxd +33 -0
- hydpy/cythons/annutils.pyi +25 -0
- hydpy/cythons/annutils.pyx +120 -0
- hydpy/cythons/autogen/__init__.py +0 -0
- hydpy/cythons/autogen/annutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/annutils.pxd +42 -0
- hydpy/cythons/autogen/annutils.pyx +129 -0
- hydpy/cythons/autogen/c_arma.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma.pxd +179 -0
- hydpy/cythons/autogen/c_arma.pyx +356 -0
- hydpy/cythons/autogen/c_arma_rimorido.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_arma_rimorido.pxd +179 -0
- hydpy/cythons/autogen/c_arma_rimorido.pyx +356 -0
- hydpy/cythons/autogen/c_conv.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv.pxd +198 -0
- hydpy/cythons/autogen/c_conv.pyx +491 -0
- hydpy/cythons/autogen/c_conv_idw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw.pxd +124 -0
- hydpy/cythons/autogen/c_conv_idw.pyx +264 -0
- hydpy/cythons/autogen/c_conv_idw_ed.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pxd +197 -0
- hydpy/cythons/autogen/c_conv_idw_ed.pyx +481 -0
- hydpy/cythons/autogen/c_conv_nn.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_conv_nn.pxd +120 -0
- hydpy/cythons/autogen/c_conv_nn.pyx +224 -0
- hydpy/cythons/autogen/c_dam.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam.pxd +805 -0
- hydpy/cythons/autogen/c_dam.pyx +1477 -0
- hydpy/cythons/autogen/c_dam_llake.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_llake.pxd +364 -0
- hydpy/cythons/autogen/c_dam_llake.pyx +705 -0
- hydpy/cythons/autogen/c_dam_lreservoir.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pxd +365 -0
- hydpy/cythons/autogen/c_dam_lreservoir.pyx +708 -0
- hydpy/cythons/autogen/c_dam_lretention.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_lretention.pxd +340 -0
- hydpy/cythons/autogen/c_dam_lretention.pyx +625 -0
- hydpy/cythons/autogen/c_dam_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump.pxd +402 -0
- hydpy/cythons/autogen/c_dam_pump.pyx +724 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pxd +452 -0
- hydpy/cythons/autogen/c_dam_pump_sluice.pyx +829 -0
- hydpy/cythons/autogen/c_dam_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_sluice.pxd +404 -0
- hydpy/cythons/autogen/c_dam_sluice.pyx +726 -0
- hydpy/cythons/autogen/c_dam_v001.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v001.pxd +452 -0
- hydpy/cythons/autogen/c_dam_v001.pyx +816 -0
- hydpy/cythons/autogen/c_dam_v002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v002.pxd +394 -0
- hydpy/cythons/autogen/c_dam_v002.pyx +703 -0
- hydpy/cythons/autogen/c_dam_v003.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v003.pxd +417 -0
- hydpy/cythons/autogen/c_dam_v003.pyx +744 -0
- hydpy/cythons/autogen/c_dam_v004.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v004.pxd +486 -0
- hydpy/cythons/autogen/c_dam_v004.pyx +891 -0
- hydpy/cythons/autogen/c_dam_v005.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dam_v005.pxd +524 -0
- hydpy/cythons/autogen/c_dam_v005.pyx +928 -0
- hydpy/cythons/autogen/c_dummy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy.pxd +151 -0
- hydpy/cythons/autogen/c_dummy.pyx +263 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_interceptedwater.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_node2node.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_node2node.pxd +89 -0
- hydpy/cythons/autogen/c_dummy_node2node.pyx +148 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowalbedo.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowcover.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowcover.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_snowycanopy.pyx +104 -0
- hydpy/cythons/autogen/c_dummy_soilwater.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pxd +69 -0
- hydpy/cythons/autogen/c_dummy_soilwater.pyx +104 -0
- hydpy/cythons/autogen/c_evap.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap.pxd +1029 -0
- hydpy/cythons/autogen/c_evap.pyx +2601 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pxd +227 -0
- hydpy/cythons/autogen/c_evap_aet_hbv96.pyx +584 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pxd +193 -0
- hydpy/cythons/autogen/c_evap_aet_minhas.pyx +478 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pxd +681 -0
- hydpy/cythons/autogen/c_evap_aet_morsim.pyx +1642 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pxd +532 -0
- hydpy/cythons/autogen/c_evap_pet_ambav1.pyx +1296 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pxd +179 -0
- hydpy/cythons/autogen/c_evap_pet_hbv96.pyx +328 -0
- hydpy/cythons/autogen/c_evap_pet_m.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_m.pxd +124 -0
- hydpy/cythons/autogen/c_evap_pet_m.pyx +214 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pxd +126 -0
- hydpy/cythons/autogen/c_evap_pet_mlc.pyx +214 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pxd +305 -0
- hydpy/cythons/autogen/c_evap_ret_fao56.pyx +624 -0
- hydpy/cythons/autogen/c_evap_ret_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_io.pxd +112 -0
- hydpy/cythons/autogen/c_evap_ret_io.pyx +176 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pxd +139 -0
- hydpy/cythons/autogen/c_evap_ret_tw2002.pyx +273 -0
- hydpy/cythons/autogen/c_exch.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch.pxd +230 -0
- hydpy/cythons/autogen/c_exch.pyx +462 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pxd +134 -0
- hydpy/cythons/autogen/c_exch_branch_hbv96.pyx +255 -0
- hydpy/cythons/autogen/c_exch_waterlevel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pxd +54 -0
- hydpy/cythons/autogen/c_exch_waterlevel.pyx +78 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pxd +156 -0
- hydpy/cythons/autogen/c_exch_weir_hbv96.pyx +282 -0
- hydpy/cythons/autogen/c_ga.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga.pxd +353 -0
- hydpy/cythons/autogen/c_ga.pyx +1204 -0
- hydpy/cythons/autogen/c_ga_garto.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto.pxd +330 -0
- hydpy/cythons/autogen/c_ga_garto.pyx +1105 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pxd +236 -0
- hydpy/cythons/autogen/c_ga_garto_submodel1.pyx +944 -0
- hydpy/cythons/autogen/c_gland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland.pxd +437 -0
- hydpy/cythons/autogen/c_gland.pyx +726 -0
- hydpy/cythons/autogen/c_gland_gr4.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr4.pxd +382 -0
- hydpy/cythons/autogen/c_gland_gr4.pyx +605 -0
- hydpy/cythons/autogen/c_gland_gr5.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr5.pxd +368 -0
- hydpy/cythons/autogen/c_gland_gr5.pyx +568 -0
- hydpy/cythons/autogen/c_gland_gr6.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_gland_gr6.pxd +420 -0
- hydpy/cythons/autogen/c_gland_gr6.pyx +673 -0
- hydpy/cythons/autogen/c_hland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland.pxd +855 -0
- hydpy/cythons/autogen/c_hland.pyx +2486 -0
- hydpy/cythons/autogen/c_hland_96.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96.pxd +631 -0
- hydpy/cythons/autogen/c_hland_96.pyx +1724 -0
- hydpy/cythons/autogen/c_hland_96c.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96c.pxd +621 -0
- hydpy/cythons/autogen/c_hland_96c.pyx +1822 -0
- hydpy/cythons/autogen/c_hland_96p.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_hland_96p.pxd +683 -0
- hydpy/cythons/autogen/c_hland_96p.pyx +1911 -0
- hydpy/cythons/autogen/c_kinw.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw.pxd +509 -0
- hydpy/cythons/autogen/c_kinw.pyx +965 -0
- hydpy/cythons/autogen/c_kinw_williams.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams.pxd +409 -0
- hydpy/cythons/autogen/c_kinw_williams.pyx +763 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pxd +220 -0
- hydpy/cythons/autogen/c_kinw_williams_ext.pyx +440 -0
- hydpy/cythons/autogen/c_lland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland.pxd +1386 -0
- hydpy/cythons/autogen/c_lland.pyx +3679 -0
- hydpy/cythons/autogen/c_lland_dd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_dd.pxd +679 -0
- hydpy/cythons/autogen/c_lland_dd.pyx +1719 -0
- hydpy/cythons/autogen/c_lland_knauf.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf.pxd +1096 -0
- hydpy/cythons/autogen/c_lland_knauf.pyx +2784 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pxd +1369 -0
- hydpy/cythons/autogen/c_lland_knauf_ic.pyx +3625 -0
- hydpy/cythons/autogen/c_meteo.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo.pxd +469 -0
- hydpy/cythons/autogen/c_meteo.pyx +879 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pxd +75 -0
- hydpy/cythons/autogen/c_meteo_clear_glob_io.pyx +107 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_glob_fao56.pyx +339 -0
- hydpy/cythons/autogen/c_meteo_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pxd +63 -0
- hydpy/cythons/autogen/c_meteo_glob_io.pyx +91 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pxd +289 -0
- hydpy/cythons/autogen/c_meteo_glob_morsim.pyx +527 -0
- hydpy/cythons/autogen/c_meteo_precip_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_precip_io.pyx +176 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pxd +87 -0
- hydpy/cythons/autogen/c_meteo_psun_sun_glob_io.pyx +123 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pxd +209 -0
- hydpy/cythons/autogen/c_meteo_sun_fao56.pyx +343 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pxd +286 -0
- hydpy/cythons/autogen/c_meteo_sun_morsim.pyx +519 -0
- hydpy/cythons/autogen/c_meteo_temp_io.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pxd +112 -0
- hydpy/cythons/autogen/c_meteo_temp_io.pyx +176 -0
- hydpy/cythons/autogen/c_musk.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk.pxd +282 -0
- hydpy/cythons/autogen/c_musk.pyx +605 -0
- hydpy/cythons/autogen/c_musk_classic.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_classic.pxd +138 -0
- hydpy/cythons/autogen/c_musk_classic.pyx +226 -0
- hydpy/cythons/autogen/c_musk_mct.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_musk_mct.pxd +282 -0
- hydpy/cythons/autogen/c_musk_mct.pyx +609 -0
- hydpy/cythons/autogen/c_rconc.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc.pxd +119 -0
- hydpy/cythons/autogen/c_rconc.pyx +174 -0
- hydpy/cythons/autogen/c_rconc_nash.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_nash.pxd +111 -0
- hydpy/cythons/autogen/c_rconc_nash.pyx +185 -0
- hydpy/cythons/autogen/c_rconc_uh.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_rconc_uh.pxd +92 -0
- hydpy/cythons/autogen/c_rconc_uh.pyx +125 -0
- hydpy/cythons/autogen/c_sw1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d.pxd +511 -0
- hydpy/cythons/autogen/c_sw1d.pyx +1263 -0
- hydpy/cythons/autogen/c_sw1d_channel.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_channel.pxd +119 -0
- hydpy/cythons/autogen/c_sw1d_channel.pyx +300 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pxd +240 -0
- hydpy/cythons/autogen/c_sw1d_gate_out.pyx +476 -0
- hydpy/cythons/autogen/c_sw1d_lias.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias.pxd +320 -0
- hydpy/cythons/autogen/c_sw1d_lias.pyx +619 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pxd +325 -0
- hydpy/cythons/autogen/c_sw1d_lias_sluice.pyx +644 -0
- hydpy/cythons/autogen/c_sw1d_network.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_network.pxd +90 -0
- hydpy/cythons/autogen/c_sw1d_network.pyx +246 -0
- hydpy/cythons/autogen/c_sw1d_pump.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_pump.pxd +256 -0
- hydpy/cythons/autogen/c_sw1d_pump.pyx +502 -0
- hydpy/cythons/autogen/c_sw1d_q_in.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_in.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_q_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pxd +224 -0
- hydpy/cythons/autogen/c_sw1d_q_out.pyx +383 -0
- hydpy/cythons/autogen/c_sw1d_storage.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_storage.pxd +193 -0
- hydpy/cythons/autogen/c_sw1d_storage.pyx +349 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pxd +212 -0
- hydpy/cythons/autogen/c_sw1d_weir_out.pyx +404 -0
- hydpy/cythons/autogen/c_test.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test.pxd +175 -0
- hydpy/cythons/autogen/c_test.pyx +348 -0
- hydpy/cythons/autogen/c_test_discontinous.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_discontinous.pxd +146 -0
- hydpy/cythons/autogen/c_test_discontinous.pyx +256 -0
- hydpy/cythons/autogen/c_test_stiff0d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff0d.pxd +146 -0
- hydpy/cythons/autogen/c_test_stiff0d.pyx +250 -0
- hydpy/cythons/autogen/c_test_stiff1d.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_test_stiff1d.pxd +145 -0
- hydpy/cythons/autogen/c_test_stiff1d.pyx +294 -0
- hydpy/cythons/autogen/c_whmod.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod.pxd +482 -0
- hydpy/cythons/autogen/c_whmod.pyx +1156 -0
- hydpy/cythons/autogen/c_whmod_rural.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_rural.pxd +411 -0
- hydpy/cythons/autogen/c_whmod_rural.pyx +982 -0
- hydpy/cythons/autogen/c_whmod_urban.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_whmod_urban.pxd +482 -0
- hydpy/cythons/autogen/c_whmod_urban.pyx +1155 -0
- hydpy/cythons/autogen/c_wland.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland.pxd +842 -0
- hydpy/cythons/autogen/c_wland.pyx +1890 -0
- hydpy/cythons/autogen/c_wland_gd.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_gd.pxd +829 -0
- hydpy/cythons/autogen/c_wland_gd.pyx +1847 -0
- hydpy/cythons/autogen/c_wland_wag.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wland_wag.pxd +810 -0
- hydpy/cythons/autogen/c_wland_wag.pyx +1780 -0
- hydpy/cythons/autogen/c_wq.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq.pxd +275 -0
- hydpy/cythons/autogen/c_wq.pyx +652 -0
- hydpy/cythons/autogen/c_wq_trapeze.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze.pxd +170 -0
- hydpy/cythons/autogen/c_wq_trapeze.pyx +400 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pxd +243 -0
- hydpy/cythons/autogen/c_wq_trapeze_strickler.pyx +578 -0
- hydpy/cythons/autogen/c_wq_walrus.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/c_wq_walrus.pxd +61 -0
- hydpy/cythons/autogen/c_wq_walrus.pyx +82 -0
- hydpy/cythons/autogen/configutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/configutils.pxd +17 -0
- hydpy/cythons/autogen/configutils.pyx +119 -0
- hydpy/cythons/autogen/interfaceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interfaceutils.pxd +31 -0
- hydpy/cythons/autogen/interfaceutils.pyx +82 -0
- hydpy/cythons/autogen/interputils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/interputils.pxd +42 -0
- hydpy/cythons/autogen/interputils.pyx +118 -0
- hydpy/cythons/autogen/masterinterface.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/masterinterface.pxd +153 -0
- hydpy/cythons/autogen/masterinterface.pyx +222 -0
- hydpy/cythons/autogen/pointerutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/pointerutils.pxd +31 -0
- hydpy/cythons/autogen/pointerutils.pyx +650 -0
- hydpy/cythons/autogen/ppolyutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/ppolyutils.pxd +35 -0
- hydpy/cythons/autogen/ppolyutils.pyx +59 -0
- hydpy/cythons/autogen/quadutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/quadutils.pxd +26 -0
- hydpy/cythons/autogen/quadutils.pyx +973 -0
- hydpy/cythons/autogen/rootutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/rootutils.pxd +28 -0
- hydpy/cythons/autogen/rootutils.pyx +109 -0
- hydpy/cythons/autogen/sequenceutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/sequenceutils.pxd +45 -0
- hydpy/cythons/autogen/sequenceutils.pyx +101 -0
- hydpy/cythons/autogen/smoothutils.cp313-win_amd64.pyd +0 -0
- hydpy/cythons/autogen/smoothutils.pxd +29 -0
- hydpy/cythons/autogen/smoothutils.pyx +833 -0
- hydpy/cythons/configutils.pxd +8 -0
- hydpy/cythons/configutils.pyi +5 -0
- hydpy/cythons/configutils.pyx +110 -0
- hydpy/cythons/interfaceutils.pxd +22 -0
- hydpy/cythons/interfaceutils.pyi +15 -0
- hydpy/cythons/interfaceutils.pyx +73 -0
- hydpy/cythons/interputils.pxd +33 -0
- hydpy/cythons/interputils.pyi +32 -0
- hydpy/cythons/interputils.pyx +109 -0
- hydpy/cythons/modelutils.py +2990 -0
- hydpy/cythons/pointerutils.pxd +22 -0
- hydpy/cythons/pointerutils.pyi +89 -0
- hydpy/cythons/pointerutils.pyx +641 -0
- hydpy/cythons/ppolyutils.pxd +26 -0
- hydpy/cythons/ppolyutils.pyi +21 -0
- hydpy/cythons/ppolyutils.pyx +50 -0
- hydpy/cythons/quadutils.pxd +17 -0
- hydpy/cythons/quadutils.pyi +13 -0
- hydpy/cythons/quadutils.pyx +964 -0
- hydpy/cythons/rootutils.pxd +19 -0
- hydpy/cythons/rootutils.pyi +21 -0
- hydpy/cythons/rootutils.pyx +100 -0
- hydpy/cythons/sequenceutils.pxd +36 -0
- hydpy/cythons/sequenceutils.pyi +7 -0
- hydpy/cythons/sequenceutils.pyx +92 -0
- hydpy/cythons/smoothutils.pxd +20 -0
- hydpy/cythons/smoothutils.pyi +15 -0
- hydpy/cythons/smoothutils.pyx +824 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_dill_assl.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_kalk.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_leun.py +14 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/land_lahn_marb.py +13 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_dill_assl_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_leun_lahn_kalk.py +5 -0
- hydpy/data/HydPy-H-Lahn/conditions/init_1996_01_01_00_00_00/stream_lahn_marb_lahn_leun.py +5 -0
- hydpy/data/HydPy-H-Lahn/control/default/land.py +9 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_dill_assl.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_kalk.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_leun.py +56 -0
- hydpy/data/HydPy-H-Lahn/control/default/land_lahn_marb.py +57 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_dill_assl_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_leun_lahn_kalk.py +7 -0
- hydpy/data/HydPy-H-Lahn/control/default/stream_lahn_marb_lahn_leun.py +7 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs.xml +309 -0
- hydpy/data/HydPy-H-Lahn/multiple_runs_alpha.xml +71 -0
- hydpy/data/HydPy-H-Lahn/network/default/headwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/nonheadwaters.py +11 -0
- hydpy/data/HydPy-H-Lahn/network/default/streams.py +8 -0
- hydpy/data/HydPy-H-Lahn/series/default/dill_assl_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalairtemperature.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/evap_pet_hbv96_input_normalevapotranspiration.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_p.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/hland_96_input_t.nc +0 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_kalk_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_leun_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/lahn_marb_obs_q.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_dill_assl_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_kalk_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_leun_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalairtemperature.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_evap_pet_hbv96_input_normalevapotranspiration.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_p.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/land_lahn_marb_hland_96_input_t.asc +11387 -0
- hydpy/data/HydPy-H-Lahn/series/default/obs_q.nc +0 -0
- hydpy/data/HydPy-H-Lahn/single_run.xml +152 -0
- hydpy/data/HydPy-H-Lahn/single_run.xmlt +143 -0
- hydpy/data/__init__.py +17 -0
- hydpy/docs/__init__.py +0 -0
- hydpy/docs/autofigs/__init__.py +0 -0
- hydpy/docs/bib/__init__.py +0 -0
- hydpy/docs/bib/refs.bib +566 -0
- hydpy/docs/combine_docversions.py +133 -0
- hydpy/docs/draw_model_sketches.py +1301 -0
- hydpy/docs/enable_autodoc.py +7 -0
- hydpy/docs/figs/HydPy-G-GR4.png +0 -0
- hydpy/docs/figs/HydPy-G-GR5.png +0 -0
- hydpy/docs/figs/HydPy-G-GR6.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-COSERO.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96-PREVAH.png +0 -0
- hydpy/docs/figs/HydPy-H-HBV96.png +0 -0
- hydpy/docs/figs/HydPy-H-Lahn.png +0 -0
- hydpy/docs/figs/HydPy-KinW-Williams.png +0 -0
- hydpy/docs/figs/HydPy-L-DD.png +0 -0
- hydpy/docs/figs/HydPy-W-Wag.png +0 -0
- hydpy/docs/figs/HydPy_Logo.png +0 -0
- hydpy/docs/figs/HydPy_Logo_Text.png +0 -0
- hydpy/docs/figs/IDLE-editor.png +0 -0
- hydpy/docs/figs/IDLE-shell.png +0 -0
- hydpy/docs/figs/LAWA_river-basin-bumbers.png +0 -0
- hydpy/docs/figs/__init__.py +0 -0
- hydpy/docs/html_/__init__.py +0 -0
- hydpy/docs/polish_html.py +57 -0
- hydpy/docs/prepare.py +224 -0
- hydpy/docs/publish_docs.py +53 -0
- hydpy/docs/rst/HydPy-ARMA.rst +27 -0
- hydpy/docs/rst/HydPy-Conv.rst +22 -0
- hydpy/docs/rst/HydPy-Dam.rst +79 -0
- hydpy/docs/rst/HydPy-Dummy.rst +21 -0
- hydpy/docs/rst/HydPy-Evap.rst +26 -0
- hydpy/docs/rst/HydPy-Exch.rst +36 -0
- hydpy/docs/rst/HydPy-G.rst +40 -0
- hydpy/docs/rst/HydPy-GA.rst +34 -0
- hydpy/docs/rst/HydPy-H.rst +24 -0
- hydpy/docs/rst/HydPy-KinW.rst +32 -0
- hydpy/docs/rst/HydPy-L.rst +42 -0
- hydpy/docs/rst/HydPy-Meteo.rst +28 -0
- hydpy/docs/rst/HydPy-Musk.rst +21 -0
- hydpy/docs/rst/HydPy-Rconc.rst +17 -0
- hydpy/docs/rst/HydPy-SW1D.rst +49 -0
- hydpy/docs/rst/HydPy-Test.rst +19 -0
- hydpy/docs/rst/HydPy-W.rst +20 -0
- hydpy/docs/rst/HydPy-WHMod.rst +19 -0
- hydpy/docs/rst/HydPy-WQ.rst +20 -0
- hydpy/docs/rst/__init__.py +0 -0
- hydpy/docs/rst/additional_repositories.rst +40 -0
- hydpy/docs/rst/auxiliaries.rst +31 -0
- hydpy/docs/rst/continuous_integration.rst +75 -0
- hydpy/docs/rst/core.rst +75 -0
- hydpy/docs/rst/cythons.rst +47 -0
- hydpy/docs/rst/definitions.rst +506 -0
- hydpy/docs/rst/developer_guide.rst +54 -0
- hydpy/docs/rst/example_projects.rst +40 -0
- hydpy/docs/rst/execution.rst +22 -0
- hydpy/docs/rst/framework_tools.rst +56 -0
- hydpy/docs/rst/how_to_read_the_reference_manual.rst +156 -0
- hydpy/docs/rst/hydpydependencies.rst +55 -0
- hydpy/docs/rst/index.rst +125 -0
- hydpy/docs/rst/installation.rst +155 -0
- hydpy/docs/rst/model_families.rst +79 -0
- hydpy/docs/rst/model_overview.rst +291 -0
- hydpy/docs/rst/modelimports.rst +10 -0
- hydpy/docs/rst/options.rst +119 -0
- hydpy/docs/rst/programming_style.rst +572 -0
- hydpy/docs/rst/project_structure.rst +520 -0
- hydpy/docs/rst/quickstart.rst +304 -0
- hydpy/docs/rst/reference_manual.rst +29 -0
- hydpy/docs/rst/required_tools.rst +50 -0
- hydpy/docs/rst/simulation.rst +514 -0
- hydpy/docs/rst/submodel_interfaces.rst +32 -0
- hydpy/docs/rst/tests_and_documentation.rst +85 -0
- hydpy/docs/rst/user_guide.rst +38 -0
- hydpy/docs/rst/version_control.rst +116 -0
- hydpy/docs/rst/zbibliography.rst +8 -0
- hydpy/docs/sphinx/__init__.py +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/frameset.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/rstsource.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/changes/versionchanges.html +33 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/defindex.html +35 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/domainindex.html +56 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-single.html +63 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex-split.html +41 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/genindex.html +76 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/globaltoc.html +11 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/layout.html +221 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/localtoc.html +15 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/opensearch.xml +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/page.html +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/relations.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/search.html +65 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchbox.html +21 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/searchfield.html +23 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/sourcelink.html +18 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/basic.css_t +925 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/doctools.js +156 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/documentation_options.js_t +13 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/file.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/language_data.js_t +26 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/minus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/plus.png +0 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/searchtools.js +574 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/static/sphinx_highlight.js +154 -0
- hydpy/docs/sphinx/_themes/basic_hydpy/theme.conf +16 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/layout.html +23 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/classic.css_t +358 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/static/sidebar.js_t +72 -0
- hydpy/docs/sphinx/_themes/classic_hydpy/theme.conf +32 -0
- hydpy/docs/sphinx/conf.py +398 -0
- hydpy/docs/sphinx/defaultlinks_extension.py +36 -0
- hydpy/docs/sphinx/integrationtest_extension.py +104 -0
- hydpy/docs/sphinx/projectstructure_extension.py +58 -0
- hydpy/docs/sphinx/submodelgraph_extension.py +53 -0
- hydpy/exe/__init__.py +0 -0
- hydpy/exe/commandtools.py +651 -0
- hydpy/exe/hyd.py +277 -0
- hydpy/exe/modelimports.py +41 -0
- hydpy/exe/replacetools.py +216 -0
- hydpy/exe/servertools.py +2348 -0
- hydpy/exe/xmltools.py +3280 -0
- hydpy/interfaces/__init__.py +0 -0
- hydpy/interfaces/aetinterfaces.py +94 -0
- hydpy/interfaces/dischargeinterfaces.py +45 -0
- hydpy/interfaces/petinterfaces.py +117 -0
- hydpy/interfaces/precipinterfaces.py +42 -0
- hydpy/interfaces/radiationinterfaces.py +79 -0
- hydpy/interfaces/rconcinterfaces.py +30 -0
- hydpy/interfaces/routinginterfaces.py +324 -0
- hydpy/interfaces/soilinterfaces.py +96 -0
- hydpy/interfaces/stateinterfaces.py +98 -0
- hydpy/interfaces/tempinterfaces.py +46 -0
- hydpy/models/__init__.py +0 -0
- hydpy/models/arma/__init__.py +14 -0
- hydpy/models/arma/arma_control.py +383 -0
- hydpy/models/arma/arma_derived.py +204 -0
- hydpy/models/arma/arma_fluxes.py +41 -0
- hydpy/models/arma/arma_inlets.py +11 -0
- hydpy/models/arma/arma_logs.py +19 -0
- hydpy/models/arma/arma_model.py +461 -0
- hydpy/models/arma/arma_outlets.py +11 -0
- hydpy/models/arma_rimorido.py +381 -0
- hydpy/models/conv/__init__.py +12 -0
- hydpy/models/conv/conv_control.py +303 -0
- hydpy/models/conv/conv_derived.py +271 -0
- hydpy/models/conv/conv_fluxes.py +54 -0
- hydpy/models/conv/conv_inlets.py +11 -0
- hydpy/models/conv/conv_model.py +687 -0
- hydpy/models/conv/conv_outlets.py +11 -0
- hydpy/models/conv_idw.py +120 -0
- hydpy/models/conv_idw_ed.py +184 -0
- hydpy/models/conv_nn.py +112 -0
- hydpy/models/dam/__init__.py +16 -0
- hydpy/models/dam/dam_aides.py +17 -0
- hydpy/models/dam/dam_control.py +346 -0
- hydpy/models/dam/dam_derived.py +559 -0
- hydpy/models/dam/dam_factors.py +46 -0
- hydpy/models/dam/dam_fluxes.py +179 -0
- hydpy/models/dam/dam_inlets.py +29 -0
- hydpy/models/dam/dam_logs.py +52 -0
- hydpy/models/dam/dam_model.py +5011 -0
- hydpy/models/dam/dam_outlets.py +23 -0
- hydpy/models/dam/dam_receivers.py +41 -0
- hydpy/models/dam/dam_senders.py +23 -0
- hydpy/models/dam/dam_solver.py +75 -0
- hydpy/models/dam/dam_states.py +11 -0
- hydpy/models/dam_llake.py +499 -0
- hydpy/models/dam_lreservoir.py +548 -0
- hydpy/models/dam_lretention.py +343 -0
- hydpy/models/dam_pump.py +278 -0
- hydpy/models/dam_pump_sluice.py +339 -0
- hydpy/models/dam_sluice.py +319 -0
- hydpy/models/dam_v001.py +1127 -0
- hydpy/models/dam_v002.py +381 -0
- hydpy/models/dam_v003.py +422 -0
- hydpy/models/dam_v004.py +665 -0
- hydpy/models/dam_v005.py +479 -0
- hydpy/models/dummy/__init__.py +15 -0
- hydpy/models/dummy/dummy_control.py +22 -0
- hydpy/models/dummy/dummy_fluxes.py +11 -0
- hydpy/models/dummy/dummy_inlets.py +11 -0
- hydpy/models/dummy/dummy_inputs.py +41 -0
- hydpy/models/dummy/dummy_model.py +196 -0
- hydpy/models/dummy/dummy_outlets.py +11 -0
- hydpy/models/dummy_interceptedwater.py +85 -0
- hydpy/models/dummy_node2node.py +83 -0
- hydpy/models/dummy_snowalbedo.py +84 -0
- hydpy/models/dummy_snowcover.py +84 -0
- hydpy/models/dummy_snowycanopy.py +86 -0
- hydpy/models/dummy_soilwater.py +85 -0
- hydpy/models/evap/__init__.py +13 -0
- hydpy/models/evap/evap_control.py +354 -0
- hydpy/models/evap/evap_derived.py +236 -0
- hydpy/models/evap/evap_factors.py +188 -0
- hydpy/models/evap/evap_fixed.py +68 -0
- hydpy/models/evap/evap_fluxes.py +150 -0
- hydpy/models/evap/evap_inputs.py +54 -0
- hydpy/models/evap/evap_logs.py +91 -0
- hydpy/models/evap/evap_masks.py +48 -0
- hydpy/models/evap/evap_model.py +9170 -0
- hydpy/models/evap/evap_parameters.py +149 -0
- hydpy/models/evap/evap_sequences.py +32 -0
- hydpy/models/evap/evap_states.py +18 -0
- hydpy/models/evap_aet_hbv96.py +372 -0
- hydpy/models/evap_aet_minhas.py +331 -0
- hydpy/models/evap_aet_morsim.py +627 -0
- hydpy/models/evap_pet_ambav1.py +483 -0
- hydpy/models/evap_pet_hbv96.py +147 -0
- hydpy/models/evap_pet_m.py +94 -0
- hydpy/models/evap_pet_mlc.py +107 -0
- hydpy/models/evap_ret_fao56.py +265 -0
- hydpy/models/evap_ret_io.py +74 -0
- hydpy/models/evap_ret_tw2002.py +165 -0
- hydpy/models/exch/__init__.py +14 -0
- hydpy/models/exch/exch_control.py +262 -0
- hydpy/models/exch/exch_derived.py +36 -0
- hydpy/models/exch/exch_factors.py +26 -0
- hydpy/models/exch/exch_fluxes.py +48 -0
- hydpy/models/exch/exch_inlets.py +11 -0
- hydpy/models/exch/exch_logs.py +12 -0
- hydpy/models/exch/exch_model.py +451 -0
- hydpy/models/exch/exch_outlets.py +17 -0
- hydpy/models/exch/exch_receivers.py +17 -0
- hydpy/models/exch_branch_hbv96.py +186 -0
- hydpy/models/exch_waterlevel.py +73 -0
- hydpy/models/exch_weir_hbv96.py +609 -0
- hydpy/models/ga/__init__.py +14 -0
- hydpy/models/ga/ga_aides.py +17 -0
- hydpy/models/ga/ga_control.py +208 -0
- hydpy/models/ga/ga_derived.py +77 -0
- hydpy/models/ga/ga_fluxes.py +83 -0
- hydpy/models/ga/ga_inputs.py +26 -0
- hydpy/models/ga/ga_logs.py +17 -0
- hydpy/models/ga/ga_model.py +2952 -0
- hydpy/models/ga/ga_states.py +87 -0
- hydpy/models/ga_garto.py +1001 -0
- hydpy/models/ga_garto_submodel1.py +79 -0
- hydpy/models/gland/__init__.py +14 -0
- hydpy/models/gland/gland_control.py +90 -0
- hydpy/models/gland/gland_derived.py +113 -0
- hydpy/models/gland/gland_fluxes.py +137 -0
- hydpy/models/gland/gland_inputs.py +12 -0
- hydpy/models/gland/gland_model.py +1439 -0
- hydpy/models/gland/gland_outlets.py +11 -0
- hydpy/models/gland/gland_states.py +90 -0
- hydpy/models/gland_gr4.py +501 -0
- hydpy/models/gland_gr5.py +463 -0
- hydpy/models/gland_gr6.py +487 -0
- hydpy/models/hland/__init__.py +20 -0
- hydpy/models/hland/hland_aides.py +19 -0
- hydpy/models/hland/hland_constants.py +37 -0
- hydpy/models/hland/hland_control.py +1530 -0
- hydpy/models/hland/hland_derived.py +683 -0
- hydpy/models/hland/hland_factors.py +57 -0
- hydpy/models/hland/hland_fixed.py +42 -0
- hydpy/models/hland/hland_fluxes.py +279 -0
- hydpy/models/hland/hland_inputs.py +19 -0
- hydpy/models/hland/hland_masks.py +107 -0
- hydpy/models/hland/hland_model.py +4664 -0
- hydpy/models/hland/hland_outlets.py +11 -0
- hydpy/models/hland/hland_parameters.py +227 -0
- hydpy/models/hland/hland_sequences.py +382 -0
- hydpy/models/hland/hland_states.py +236 -0
- hydpy/models/hland_96.py +1812 -0
- hydpy/models/hland_96c.py +1196 -0
- hydpy/models/hland_96p.py +1204 -0
- hydpy/models/kinw/__init__.py +18 -0
- hydpy/models/kinw/kinw_aides.py +306 -0
- hydpy/models/kinw/kinw_control.py +270 -0
- hydpy/models/kinw/kinw_derived.py +197 -0
- hydpy/models/kinw/kinw_fixed.py +33 -0
- hydpy/models/kinw/kinw_fluxes.py +37 -0
- hydpy/models/kinw/kinw_inlets.py +11 -0
- hydpy/models/kinw/kinw_model.py +3026 -0
- hydpy/models/kinw/kinw_outlets.py +11 -0
- hydpy/models/kinw/kinw_solver.py +45 -0
- hydpy/models/kinw/kinw_states.py +17 -0
- hydpy/models/kinw_williams.py +1299 -0
- hydpy/models/kinw_williams_ext.py +768 -0
- hydpy/models/lland/__init__.py +42 -0
- hydpy/models/lland/lland_aides.py +38 -0
- hydpy/models/lland/lland_constants.py +88 -0
- hydpy/models/lland/lland_control.py +1329 -0
- hydpy/models/lland/lland_derived.py +380 -0
- hydpy/models/lland/lland_factors.py +18 -0
- hydpy/models/lland/lland_fixed.py +128 -0
- hydpy/models/lland/lland_fluxes.py +626 -0
- hydpy/models/lland/lland_inlets.py +12 -0
- hydpy/models/lland/lland_inputs.py +33 -0
- hydpy/models/lland/lland_logs.py +17 -0
- hydpy/models/lland/lland_masks.py +212 -0
- hydpy/models/lland/lland_model.py +7690 -0
- hydpy/models/lland/lland_outlets.py +12 -0
- hydpy/models/lland/lland_parameters.py +195 -0
- hydpy/models/lland/lland_sequences.py +67 -0
- hydpy/models/lland/lland_states.py +280 -0
- hydpy/models/lland_dd.py +2270 -0
- hydpy/models/lland_knauf.py +2156 -0
- hydpy/models/lland_knauf_ic.py +1920 -0
- hydpy/models/meteo/__init__.py +12 -0
- hydpy/models/meteo/meteo_control.py +154 -0
- hydpy/models/meteo/meteo_derived.py +159 -0
- hydpy/models/meteo/meteo_factors.py +88 -0
- hydpy/models/meteo/meteo_fixed.py +19 -0
- hydpy/models/meteo/meteo_fluxes.py +46 -0
- hydpy/models/meteo/meteo_inputs.py +47 -0
- hydpy/models/meteo/meteo_logs.py +30 -0
- hydpy/models/meteo/meteo_model.py +2904 -0
- hydpy/models/meteo/meteo_parameters.py +14 -0
- hydpy/models/meteo/meteo_sequences.py +22 -0
- hydpy/models/meteo_clear_glob_io.py +77 -0
- hydpy/models/meteo_glob_fao56.py +217 -0
- hydpy/models/meteo_glob_io.py +68 -0
- hydpy/models/meteo_glob_morsim.py +444 -0
- hydpy/models/meteo_precip_io.py +76 -0
- hydpy/models/meteo_psun_sun_glob_io.py +83 -0
- hydpy/models/meteo_sun_fao56.py +188 -0
- hydpy/models/meteo_sun_morsim.py +466 -0
- hydpy/models/meteo_temp_io.py +76 -0
- hydpy/models/musk/__init__.py +15 -0
- hydpy/models/musk/musk_control.py +328 -0
- hydpy/models/musk/musk_derived.py +32 -0
- hydpy/models/musk/musk_factors.py +53 -0
- hydpy/models/musk/musk_fluxes.py +24 -0
- hydpy/models/musk/musk_inlets.py +11 -0
- hydpy/models/musk/musk_masks.py +15 -0
- hydpy/models/musk/musk_model.py +838 -0
- hydpy/models/musk/musk_outlets.py +11 -0
- hydpy/models/musk/musk_sequences.py +88 -0
- hydpy/models/musk/musk_solver.py +68 -0
- hydpy/models/musk/musk_states.py +64 -0
- hydpy/models/musk_classic.py +228 -0
- hydpy/models/musk_mct.py +1247 -0
- hydpy/models/rconc/__init__.py +12 -0
- hydpy/models/rconc/rconc_control.py +473 -0
- hydpy/models/rconc/rconc_derived.py +76 -0
- hydpy/models/rconc/rconc_fluxes.py +19 -0
- hydpy/models/rconc/rconc_logs.py +74 -0
- hydpy/models/rconc/rconc_model.py +260 -0
- hydpy/models/rconc/rconc_states.py +11 -0
- hydpy/models/rconc_nash.py +48 -0
- hydpy/models/rconc_uh.py +53 -0
- hydpy/models/sw1d/__init__.py +17 -0
- hydpy/models/sw1d/sw1d_control.py +356 -0
- hydpy/models/sw1d/sw1d_derived.py +85 -0
- hydpy/models/sw1d/sw1d_factors.py +78 -0
- hydpy/models/sw1d/sw1d_fixed.py +12 -0
- hydpy/models/sw1d/sw1d_fluxes.py +55 -0
- hydpy/models/sw1d/sw1d_inlets.py +17 -0
- hydpy/models/sw1d/sw1d_model.py +3385 -0
- hydpy/models/sw1d/sw1d_outlets.py +11 -0
- hydpy/models/sw1d/sw1d_receivers.py +11 -0
- hydpy/models/sw1d/sw1d_senders.py +11 -0
- hydpy/models/sw1d/sw1d_states.py +23 -0
- hydpy/models/sw1d_channel.py +2051 -0
- hydpy/models/sw1d_gate_out.py +599 -0
- hydpy/models/sw1d_lias.py +105 -0
- hydpy/models/sw1d_lias_sluice.py +531 -0
- hydpy/models/sw1d_network.py +1219 -0
- hydpy/models/sw1d_pump.py +448 -0
- hydpy/models/sw1d_q_in.py +79 -0
- hydpy/models/sw1d_q_out.py +81 -0
- hydpy/models/sw1d_storage.py +78 -0
- hydpy/models/sw1d_weir_out.py +75 -0
- hydpy/models/test/__init__.py +14 -0
- hydpy/models/test/test_control.py +28 -0
- hydpy/models/test/test_fluxes.py +17 -0
- hydpy/models/test/test_model.py +201 -0
- hydpy/models/test/test_solver.py +48 -0
- hydpy/models/test/test_states.py +17 -0
- hydpy/models/test_discontinous.py +46 -0
- hydpy/models/test_stiff0d.py +47 -0
- hydpy/models/test_stiff1d.py +42 -0
- hydpy/models/whmod/__init__.py +21 -0
- hydpy/models/whmod/whmod_constants.py +77 -0
- hydpy/models/whmod/whmod_control.py +333 -0
- hydpy/models/whmod/whmod_derived.py +210 -0
- hydpy/models/whmod/whmod_factors.py +9 -0
- hydpy/models/whmod/whmod_fluxes.py +105 -0
- hydpy/models/whmod/whmod_inputs.py +15 -0
- hydpy/models/whmod/whmod_masks.py +178 -0
- hydpy/models/whmod/whmod_model.py +2091 -0
- hydpy/models/whmod/whmod_parameters.py +155 -0
- hydpy/models/whmod/whmod_sequences.py +193 -0
- hydpy/models/whmod/whmod_states.py +73 -0
- hydpy/models/whmod_rural.py +794 -0
- hydpy/models/whmod_urban.py +1011 -0
- hydpy/models/wland/__init__.py +43 -0
- hydpy/models/wland/wland_aides.py +55 -0
- hydpy/models/wland/wland_constants.py +103 -0
- hydpy/models/wland/wland_control.py +508 -0
- hydpy/models/wland/wland_derived.py +330 -0
- hydpy/models/wland/wland_factors.py +11 -0
- hydpy/models/wland/wland_fixed.py +12 -0
- hydpy/models/wland/wland_fluxes.py +166 -0
- hydpy/models/wland/wland_inputs.py +33 -0
- hydpy/models/wland/wland_masks.py +54 -0
- hydpy/models/wland/wland_model.py +3755 -0
- hydpy/models/wland/wland_outlets.py +11 -0
- hydpy/models/wland/wland_parameters.py +214 -0
- hydpy/models/wland/wland_sequences.py +108 -0
- hydpy/models/wland/wland_solver.py +45 -0
- hydpy/models/wland/wland_states.py +56 -0
- hydpy/models/wland_gd.py +888 -0
- hydpy/models/wland_wag.py +1244 -0
- hydpy/models/wq/__init__.py +14 -0
- hydpy/models/wq/wq_control.py +117 -0
- hydpy/models/wq/wq_derived.py +182 -0
- hydpy/models/wq/wq_factors.py +79 -0
- hydpy/models/wq/wq_fluxes.py +17 -0
- hydpy/models/wq/wq_model.py +1889 -0
- hydpy/models/wq_trapeze.py +168 -0
- hydpy/models/wq_trapeze_strickler.py +101 -0
- hydpy/models/wq_walrus.py +57 -0
- hydpy/py.typed +0 -0
- hydpy/tests/.coveragerc +22 -0
- hydpy/tests/__init__.py +0 -0
- hydpy/tests/check_consistency.py +32 -0
- hydpy/tests/hydpydoctestcustomize.pth +1 -0
- hydpy/tests/hydpydoctestcustomize.py +15 -0
- hydpy/tests/iotesting/__init__.py +0 -0
- hydpy/tests/run_doctests.py +233 -0
- hydpy-6.2.dev1.data/scripts/hyd.py +277 -0
- hydpy-6.2.dev1.dist-info/LICENSE +165 -0
- hydpy-6.2.dev1.dist-info/METADATA +163 -0
- hydpy-6.2.dev1.dist-info/RECORD +890 -0
- hydpy-6.2.dev1.dist-info/WHEEL +5 -0
- hydpy-6.2.dev1.dist-info/licenses_hydpy_installer.txt +42 -0
- hydpy-6.2.dev1.dist-info/top_level.txt +1 -0
hydpy/auxs/armatools.py
ADDED
|
@@ -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
|
+
)
|