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/ppolytools.py
ADDED
|
@@ -0,0 +1,809 @@
|
|
|
1
|
+
"""This module implements interpolation approaches based on piecewise polynomials
|
|
2
|
+
required for some models implemented in the *HydPy* framework.
|
|
3
|
+
|
|
4
|
+
The relevant models perform the interpolation during simulation runs, which is why we
|
|
5
|
+
implement the related methods in the Cython extension module |ppolyutils|.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# import...
|
|
9
|
+
# ...from standard library
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
# ...from site-packages
|
|
13
|
+
import numpy
|
|
14
|
+
|
|
15
|
+
# ...from HydPy
|
|
16
|
+
from hydpy import config
|
|
17
|
+
from hydpy.core import exceptiontools
|
|
18
|
+
from hydpy.core import objecttools
|
|
19
|
+
from hydpy.core import propertytools
|
|
20
|
+
from hydpy.core.typingtools import *
|
|
21
|
+
from hydpy.auxs import interptools
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from scipy import interpolate
|
|
25
|
+
from hydpy.cythons import ppolyutils
|
|
26
|
+
else:
|
|
27
|
+
special = exceptiontools.OptionalImport("special", ["scipy.interpolate"], locals())
|
|
28
|
+
from hydpy.cythons.autogen import ppolyutils
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Poly(NamedTuple):
|
|
32
|
+
r"""Parameter handler for a power series representation of a single polynomial
|
|
33
|
+
function.
|
|
34
|
+
|
|
35
|
+
The following |Poly| object corresponds to the polynomial function
|
|
36
|
+
:math:`f(x) = 2 + 3 \cdot (x - 1) + 4 \cdot (x - 1)^2`:
|
|
37
|
+
|
|
38
|
+
>>> from hydpy import Poly
|
|
39
|
+
>>> p = Poly(x0=1.0, cs=(2.0, 3.0, 4.0))
|
|
40
|
+
|
|
41
|
+
Proper application of the constant and all coefficients for :math:`x = 3` results
|
|
42
|
+
in 24:
|
|
43
|
+
|
|
44
|
+
>>> x = 3.0
|
|
45
|
+
>>> p.cs[0] + p.cs[1] * (x - p.x0) + p.cs[2] * (x - p.x0) ** 2
|
|
46
|
+
24.0
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
x0: float
|
|
50
|
+
"""Constant of the power series."""
|
|
51
|
+
cs: tuple[float, ...]
|
|
52
|
+
"""Coefficients of the power series."""
|
|
53
|
+
|
|
54
|
+
def assignrepr(self, prefix: str) -> str:
|
|
55
|
+
"""Return a string representation of the actual |ppolytools.Poly| object
|
|
56
|
+
prefixed with the given string.
|
|
57
|
+
|
|
58
|
+
>>> from hydpy import Poly
|
|
59
|
+
>>> poly = Poly(x0=1.0/3.0, cs=(2.0, 3.0, 4.0/3.0))
|
|
60
|
+
>>> poly
|
|
61
|
+
Poly(x0=0.333333, cs=(2.0, 3.0, 1.333333))
|
|
62
|
+
>>> print(poly.assignrepr(prefix="poly = "))
|
|
63
|
+
poly = Poly(x0=0.333333, cs=(2.0, 3.0, 1.333333))
|
|
64
|
+
"""
|
|
65
|
+
return (
|
|
66
|
+
f"{prefix}{type(self).__name__}("
|
|
67
|
+
f"x0={objecttools.repr_(self.x0)}, "
|
|
68
|
+
f"cs={objecttools.repr_tuple(self.cs)})"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
def __repr__(self) -> str:
|
|
72
|
+
return self.assignrepr(prefix="")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class PPoly(interptools.InterpAlgorithm):
|
|
76
|
+
"""Piecewise polynomial interpolator.
|
|
77
|
+
|
|
78
|
+
Class |PPoly| supports univariate data interpolation via multiple polynomial
|
|
79
|
+
functions. Typical use cases are linear or spline interpolation. The primary
|
|
80
|
+
purpose of |PPoly| is to allow for such interpolation within model equations (for
|
|
81
|
+
example, to represent the relationship between water volume and water stage as in
|
|
82
|
+
the model |dam_v001|). Then, the user selects |PPoly| as the interpolation
|
|
83
|
+
algorithm employed by parameters derived from |SimpleInterpolator| (e.g.
|
|
84
|
+
|dam_control.WaterVolume2WaterLevel|) or |SeasonalInterpolator| (e.g.
|
|
85
|
+
|dam_control.WaterLevel2FloodDischarge|). However, one can apply |PPoly| also
|
|
86
|
+
directly, as shown in the following examples.
|
|
87
|
+
|
|
88
|
+
You can prepare a |PPoly| object by handing multiple |Poly| objects to its
|
|
89
|
+
constructor:
|
|
90
|
+
|
|
91
|
+
>>> from hydpy import Poly, PPoly
|
|
92
|
+
>>> ppoly = PPoly(Poly(x0=1.0, cs=(1.0,)),
|
|
93
|
+
... Poly(x0=2.0, cs=(1.0, 1.0)),
|
|
94
|
+
... Poly(x0=3.0, cs=(2.0, 3.0)))
|
|
95
|
+
|
|
96
|
+
Note that each power series constant (|Poly.x0|) also serves as a breakpoint. Each
|
|
97
|
+
|Poly.x0| value defines the lower bound of the interval for which the polynomial is
|
|
98
|
+
valid. The only exception affects the first |Poly| object. Here, |Poly.x0| also
|
|
99
|
+
serves as the power series constant but not as a breakpoint. Hence, |PPoly| uses
|
|
100
|
+
the first polynomial for extrapolation into the negative range (as it uses the last
|
|
101
|
+
polynomial for extrapolating into the positive range). The following equation,
|
|
102
|
+
which reflects the configuration of the prepared interpolator, should clarify this
|
|
103
|
+
definition:
|
|
104
|
+
|
|
105
|
+
.. math::
|
|
106
|
+
f(x) = \\begin{cases}
|
|
107
|
+
1
|
|
108
|
+
&|\\
|
|
109
|
+
x < 2
|
|
110
|
+
\\\\
|
|
111
|
+
1 + x - 2
|
|
112
|
+
&|\\
|
|
113
|
+
2 \\leq x < 3
|
|
114
|
+
\\\\
|
|
115
|
+
2 + 3 \\cdot (x - 3)
|
|
116
|
+
&|\\
|
|
117
|
+
3 \\leq x
|
|
118
|
+
\\end{cases}
|
|
119
|
+
|
|
120
|
+
For applying `ppoly`, we need to set the input value before calling
|
|
121
|
+
|PPoly.calculate_values|:
|
|
122
|
+
|
|
123
|
+
>>> ppoly.inputs[0] = 2.5
|
|
124
|
+
>>> ppoly.calculate_values()
|
|
125
|
+
>>> from hydpy import round_
|
|
126
|
+
>>> round_(ppoly.outputs[0])
|
|
127
|
+
1.5
|
|
128
|
+
|
|
129
|
+
The same holds when calling method |PPoly.calculate_derivatives| for calculating
|
|
130
|
+
first order derivatives:
|
|
131
|
+
|
|
132
|
+
>>> ppoly.calculate_derivatives(0)
|
|
133
|
+
>>> round_(ppoly.output_derivatives[0])
|
|
134
|
+
1.0
|
|
135
|
+
|
|
136
|
+
Use method |InterpAlgorithm.print_table| or method |InterpAlgorithm.plot| to
|
|
137
|
+
inspect the results of `ppoly` within the relevant data range:
|
|
138
|
+
|
|
139
|
+
>>> ppoly.print_table([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5])
|
|
140
|
+
x y dy/dx
|
|
141
|
+
0.5 1.0 0.0
|
|
142
|
+
1.0 1.0 0.0
|
|
143
|
+
1.5 1.0 0.0
|
|
144
|
+
2.0 1.0 1.0
|
|
145
|
+
2.5 1.5 1.0
|
|
146
|
+
3.0 2.0 3.0
|
|
147
|
+
3.5 3.5 3.0
|
|
148
|
+
|
|
149
|
+
>>> figure = ppoly.plot(xmin=0.0, xmax=4.0)
|
|
150
|
+
>>> from hydpy.core.testtools import save_autofig
|
|
151
|
+
>>> save_autofig("PPoly_base_example.png", figure=figure)
|
|
152
|
+
|
|
153
|
+
.. image:: PPoly_base_example.png
|
|
154
|
+
|
|
155
|
+
|PPoly| collects all constants and coefficients and provides access to them via
|
|
156
|
+
properties |PPoly.x0s| and |PPoly.cs| available:
|
|
157
|
+
|
|
158
|
+
>>> from hydpy import print_matrix, print_vector
|
|
159
|
+
>>> print_vector(ppoly.x0s)
|
|
160
|
+
1.0, 2.0, 3.0
|
|
161
|
+
>>> print_matrix(ppoly.cs)
|
|
162
|
+
| 1.0, 0.0 |
|
|
163
|
+
| 1.0, 1.0 |
|
|
164
|
+
| 2.0, 3.0 |
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
Property |PPoly.nmb_ps| reflects the total number of polynomials:
|
|
168
|
+
|
|
169
|
+
>>> ppoly.nmb_ps
|
|
170
|
+
3
|
|
171
|
+
|
|
172
|
+
Property |PPoly.nmb_cs| informs about the number of relevant coefficients for each
|
|
173
|
+
polynomial (the last non-negative coefficient is the last relevant one):
|
|
174
|
+
|
|
175
|
+
>>> print_vector(ppoly.nmb_cs)
|
|
176
|
+
1, 2, 2
|
|
177
|
+
|
|
178
|
+
You are free to manipulate both the breakpoints and the coefficients:
|
|
179
|
+
|
|
180
|
+
>>> ppoly.x0s = 1.0, 2.0, 2.5
|
|
181
|
+
>>> ppoly.cs[1, 1] = 2.0
|
|
182
|
+
|
|
183
|
+
>>> ppoly.polynomials
|
|
184
|
+
(Poly(x0=1.0, cs=(1.0,)), Poly(x0=2.0, cs=(1.0, 2.0)), Poly(x0=2.5, cs=(2.0, 3.0)))
|
|
185
|
+
|
|
186
|
+
>>> ppoly.print_table([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5])
|
|
187
|
+
x y dy/dx
|
|
188
|
+
0.5 1.0 0.0
|
|
189
|
+
1.0 1.0 0.0
|
|
190
|
+
1.5 1.0 0.0
|
|
191
|
+
2.0 1.0 2.0
|
|
192
|
+
2.5 2.0 3.0
|
|
193
|
+
3.0 3.5 3.0
|
|
194
|
+
3.5 5.0 3.0
|
|
195
|
+
|
|
196
|
+
However, be aware that manipulating |PPoly.nmb_ps|, |PPoly.nmb_cs|, |PPoly.x0s|,
|
|
197
|
+
|PPoly.nmb_cs| can cause severe problems, including program crashes. Hence, you
|
|
198
|
+
should always call the |PPoly.verify| method after manipulating these properties,
|
|
199
|
+
which checks the integrity of the current configuration of |PPoly| objects:
|
|
200
|
+
|
|
201
|
+
>>> ppoly.nmb_ps = 1
|
|
202
|
+
>>> ppoly.verify()
|
|
203
|
+
Traceback (most recent call last):
|
|
204
|
+
...
|
|
205
|
+
RuntimeError: While trying to verify parameter `ppoly` of element `?`, the \
|
|
206
|
+
following error occurred: The number of constants indicated by `nmb_ps` (1) does not \
|
|
207
|
+
agree with the actual number of constants held by vector `x0s` (3).
|
|
208
|
+
|
|
209
|
+
To change an existing |PPoly| object more safely, you can "call" it with different
|
|
210
|
+
|Poly| objects, which overwrites all current information, as shown by the following
|
|
211
|
+
example, defining only a single polynomial:
|
|
212
|
+
|
|
213
|
+
>>> ppoly(Poly(x0=-1.0, cs=(0.0, 0.0, 1.0)))
|
|
214
|
+
>>> ppoly.print_table([-3.0, -2.0, -1.0, 0.0, 1.0])
|
|
215
|
+
x y dy/dx
|
|
216
|
+
-3.0 4.0 -4.0
|
|
217
|
+
-2.0 1.0 -2.0
|
|
218
|
+
-1.0 0.0 0.0
|
|
219
|
+
0.0 1.0 2.0
|
|
220
|
+
1.0 4.0 4.0
|
|
221
|
+
|
|
222
|
+
Calling |PPoly| objects without any arguments results in the following error:
|
|
223
|
+
|
|
224
|
+
>>> ppoly()
|
|
225
|
+
Traceback (most recent call last):
|
|
226
|
+
...
|
|
227
|
+
ValueError: When calling an `PPoly` object, you need to define at least one \
|
|
228
|
+
polynomial function by passing at leas one `Poly` object.
|
|
229
|
+
"""
|
|
230
|
+
|
|
231
|
+
_calgorithm: ppolyutils.PPoly
|
|
232
|
+
_cready: bool
|
|
233
|
+
|
|
234
|
+
def __init__(self, *polynomials: Poly) -> None:
|
|
235
|
+
self._cready = False
|
|
236
|
+
ca = ppolyutils.PPoly()
|
|
237
|
+
self._calgorithm = ca
|
|
238
|
+
ca.inputs = numpy.zeros((1,), dtype=config.NP_FLOAT)
|
|
239
|
+
ca.outputs = numpy.zeros((1,), dtype=config.NP_FLOAT)
|
|
240
|
+
ca.output_derivatives = numpy.zeros((1,), dtype=config.NP_FLOAT)
|
|
241
|
+
if polynomials:
|
|
242
|
+
self(*polynomials)
|
|
243
|
+
|
|
244
|
+
def __call__(self, *polynomials: Poly) -> None:
|
|
245
|
+
if not polynomials:
|
|
246
|
+
raise ValueError(
|
|
247
|
+
"When calling an `PPoly` object, you need to define at least one "
|
|
248
|
+
"polynomial function by passing at leas one `Poly` object."
|
|
249
|
+
)
|
|
250
|
+
nmb_ps = len(polynomials)
|
|
251
|
+
nmb_cs = numpy.array([len(p.cs) for p in polynomials], dtype=config.NP_INT)
|
|
252
|
+
x0s = numpy.array([p.x0 for p in polynomials], dtype=config.NP_FLOAT)
|
|
253
|
+
cs = numpy.zeros((nmb_ps, max(nmb_cs)))
|
|
254
|
+
for idx, (nmb, polynomial) in enumerate(zip(nmb_cs, polynomials)):
|
|
255
|
+
cs[idx, :nmb] = polynomial.cs
|
|
256
|
+
self.nmb_ps, self.nmb_cs, self.x0s, self.cs = nmb_ps, nmb_cs, x0s, cs
|
|
257
|
+
|
|
258
|
+
@classmethod
|
|
259
|
+
def from_data(
|
|
260
|
+
cls,
|
|
261
|
+
xs: VectorFloat,
|
|
262
|
+
ys: VectorFloat,
|
|
263
|
+
method: Literal["linear"] | type[interpolate.CubicHermiteSpline] = "linear",
|
|
264
|
+
) -> PPoly:
|
|
265
|
+
"""Prepare a |PPoly| object based on x-y data.
|
|
266
|
+
|
|
267
|
+
As explained in the main documentation on class |PPoly|, you are free to define
|
|
268
|
+
an arbitrary number of polynomials, each with arbitrary constants and
|
|
269
|
+
coefficients. However, one usually prefers functionally similar polynomials
|
|
270
|
+
that standardised algorithms can compute. Method |PPoly.from_data| is a
|
|
271
|
+
convenience function for following this route. So far, it supports linear
|
|
272
|
+
interpolation and some spline techniques.
|
|
273
|
+
|
|
274
|
+
We start our explanations with a small and smooth x-y data set:
|
|
275
|
+
|
|
276
|
+
>>> xs = [1.0, 2.0, 3.0]
|
|
277
|
+
>>> ys = [1.0, 2.0, 3.5]
|
|
278
|
+
|
|
279
|
+
By default, method |PPoly.from_data| prepares everything for a piecewise linear
|
|
280
|
+
interpolation:
|
|
281
|
+
|
|
282
|
+
>>> from hydpy import PPoly
|
|
283
|
+
>>> ppoly = PPoly.from_data(xs=xs, ys=ys)
|
|
284
|
+
>>> ppoly
|
|
285
|
+
PPoly(
|
|
286
|
+
Poly(x0=1.0, cs=(1.0, 1.0)),
|
|
287
|
+
Poly(x0=2.0, cs=(2.0, 1.5)),
|
|
288
|
+
)
|
|
289
|
+
>>> ppoly.print_table(xs=[1.9, 2.0, 2.1])
|
|
290
|
+
x y dy/dx
|
|
291
|
+
1.9 1.9 1.0
|
|
292
|
+
2.0 2.0 1.5
|
|
293
|
+
2.1 2.15 1.5
|
|
294
|
+
>>> figure = ppoly.plot(0.0, 4.0, label="linear")
|
|
295
|
+
|
|
296
|
+
Alternatively, |PPoly| can use the following |scipy| classes for determining
|
|
297
|
+
higher-order polynomials:
|
|
298
|
+
|
|
299
|
+
>>> from scipy.interpolate import \
|
|
300
|
+
CubicSpline, Akima1DInterpolator, PchipInterpolator
|
|
301
|
+
|
|
302
|
+
For sufficiently smooth data, cubic spline interpolation is often a good choice,
|
|
303
|
+
as it preserves much smoothness around breakpoints (helpful for reaching
|
|
304
|
+
required accuracies when applying numerical integration algorithms):
|
|
305
|
+
|
|
306
|
+
>>> ppoly = PPoly.from_data(xs=xs, ys=ys, method=CubicSpline)
|
|
307
|
+
>>> ppoly
|
|
308
|
+
PPoly(
|
|
309
|
+
Poly(x0=1.0, cs=(1.0, 0.75, 0.25)),
|
|
310
|
+
Poly(x0=2.0, cs=(2.0, 1.25, 0.25)),
|
|
311
|
+
)
|
|
312
|
+
>>> ppoly.print_table(xs=[1.9, 2.0, 2.1])
|
|
313
|
+
x y dy/dx
|
|
314
|
+
1.9 1.8775 1.2
|
|
315
|
+
2.0 2.0 1.25
|
|
316
|
+
2.1 2.1275 1.3
|
|
317
|
+
>>> figure = ppoly.plot(0.0, 4.0, label="Cubic")
|
|
318
|
+
|
|
319
|
+
For the given data, the Akima spline results in the same coefficients as the
|
|
320
|
+
cubic spline:
|
|
321
|
+
|
|
322
|
+
>>> ppoly = PPoly.from_data(xs=xs, ys=ys, method=Akima1DInterpolator)
|
|
323
|
+
>>> ppoly
|
|
324
|
+
PPoly(
|
|
325
|
+
Poly(x0=1.0, cs=(1.0, 0.75, 0.25)),
|
|
326
|
+
Poly(x0=2.0, cs=(2.0, 1.25, 0.25)),
|
|
327
|
+
)
|
|
328
|
+
>>> figure = ppoly.plot(0.0, 4.0, label="Akima")
|
|
329
|
+
|
|
330
|
+
The PCHIP (Piecewise Cubic Hermite Interpolating Polynomial) algorithm
|
|
331
|
+
generally tends to less smooth interpolations:
|
|
332
|
+
|
|
333
|
+
>>> ppoly = PPoly.from_data(xs=xs, ys=ys, method=PchipInterpolator)
|
|
334
|
+
>>> ppoly
|
|
335
|
+
PPoly(
|
|
336
|
+
Poly(x0=1.0, cs=(1.0, 0.75, 0.3, -0.05)),
|
|
337
|
+
Poly(x0=2.0, cs=(2.0, 1.2, 0.35, -0.05)),
|
|
338
|
+
)
|
|
339
|
+
>>> ppoly.print_table(xs=[1.9, 2.0, 2.1])
|
|
340
|
+
x y dy/dx
|
|
341
|
+
1.9 1.88155 1.1685
|
|
342
|
+
2.0 2.0 1.2
|
|
343
|
+
2.1 2.12345 1.2685
|
|
344
|
+
>>> figure = ppoly.plot(0.0, 4.0, label="Pchip")
|
|
345
|
+
|
|
346
|
+
The following figure compares the linear and all spline interpolation results.
|
|
347
|
+
As to be expected, the most sensible differences show in the interpolation
|
|
348
|
+
ranges:
|
|
349
|
+
|
|
350
|
+
>>> _ = figure.gca().legend()
|
|
351
|
+
>>> from hydpy.core.testtools import save_autofig
|
|
352
|
+
>>> save_autofig("PPoly_data_smooth.png")
|
|
353
|
+
|
|
354
|
+
.. image:: PPoly_data_smooth.png
|
|
355
|
+
|
|
356
|
+
Next, we apply all four interpolation approaches on a non-smooth data set.
|
|
357
|
+
Cubic interpolation is again the smoothest one but tends to overshoot, which
|
|
358
|
+
can be problematic when violating physical constraints. Besides the linear
|
|
359
|
+
approach, only the PCHIP interpolation always preserves monotonicity in the
|
|
360
|
+
original data. The Akima interpolation appears as a good compromise between
|
|
361
|
+
these two approaches:
|
|
362
|
+
|
|
363
|
+
>>> for method, label in (("linear", "linear"),
|
|
364
|
+
... (CubicSpline, "Cubic"),
|
|
365
|
+
... (Akima1DInterpolator, "Akima"),
|
|
366
|
+
... (PchipInterpolator, "Pchip")):
|
|
367
|
+
... figure = PPoly.from_data(
|
|
368
|
+
... xs=[1.0, 2.0, 3.0, 4.0], ys=[1.0, 1.0, 2.0, 2.0], method=method
|
|
369
|
+
... ).plot(0.0, 5.0, label=label)
|
|
370
|
+
>>> _ = figure.gca().legend()
|
|
371
|
+
>>> _ = figure.gca().set_ylim((0.5, 2.5))
|
|
372
|
+
>>> save_autofig("PPoly_data_not_smooth.png")
|
|
373
|
+
|
|
374
|
+
.. image:: PPoly_data_not_smooth.png
|
|
375
|
+
|
|
376
|
+
Passing data sets with one or two x-y pairs works fine:
|
|
377
|
+
|
|
378
|
+
>>> PPoly.from_data(xs=[0.0], ys=[1.0])
|
|
379
|
+
PPoly(
|
|
380
|
+
Poly(x0=0.0, cs=(1.0,)),
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
>>> PPoly.from_data(xs=[0.0, 1.0], ys=[2.0, 5.0])
|
|
384
|
+
PPoly(
|
|
385
|
+
Poly(x0=0.0, cs=(2.0, 3.0)),
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
Empty data sets or data sets of different lengths result in the following
|
|
389
|
+
error messages:
|
|
390
|
+
|
|
391
|
+
>>> PPoly.from_data(xs=[], ys=[])
|
|
392
|
+
Traceback (most recent call last):
|
|
393
|
+
...
|
|
394
|
+
ValueError: While trying to derive polynomials from the vectors `x` ([]) and \
|
|
395
|
+
`y` ([]), the following error occurred: Vectors `x` and `y` must not be empty.
|
|
396
|
+
|
|
397
|
+
>>> PPoly.from_data(xs=[0.0, 1.0], ys=[1.0, 2.0, 3.0])
|
|
398
|
+
Traceback (most recent call last):
|
|
399
|
+
...
|
|
400
|
+
ValueError: While trying to derive polynomials from the vectors `x` ([0.0 and \
|
|
401
|
+
1.0]) and `y` ([1.0, 2.0, and 3.0]), the following error occurred: The lenghts of \
|
|
402
|
+
vectors `x` (2) and `y` (3) must be identical.
|
|
403
|
+
"""
|
|
404
|
+
try:
|
|
405
|
+
if len(xs) != len(ys):
|
|
406
|
+
raise ValueError(
|
|
407
|
+
f"The lenghts of vectors `x` ({len(xs)}) and `y` ({len(ys)}) must "
|
|
408
|
+
f"be identical."
|
|
409
|
+
)
|
|
410
|
+
if len(xs) == 0:
|
|
411
|
+
raise ValueError("Vectors `x` and `y` must not be empty.")
|
|
412
|
+
if len(xs) == 1:
|
|
413
|
+
return cls(Poly(x0=xs[0], cs=(ys[0],)))
|
|
414
|
+
ppoly = cls()
|
|
415
|
+
if (len(xs) == 2) or (method == "linear"):
|
|
416
|
+
nmb_ps = len(xs) - 1
|
|
417
|
+
nmb_cs = numpy.full((nmb_ps,), 2, dtype=config.NP_INT)
|
|
418
|
+
x0s = numpy.array(xs, dtype=config.NP_FLOAT)[:-1]
|
|
419
|
+
cs = numpy.zeros((nmb_ps, numpy.max(nmb_cs)), dtype=config.NP_FLOAT)
|
|
420
|
+
cs[:, 0] = numpy.array(ys, dtype=config.NP_FLOAT)[:-1]
|
|
421
|
+
cs[:, 1] = numpy.diff(ys) / numpy.diff(xs)
|
|
422
|
+
else:
|
|
423
|
+
interpolator = method(x=xs, y=ys)
|
|
424
|
+
x0s = numpy.array(xs, dtype=config.NP_FLOAT)[:-1]
|
|
425
|
+
cs = interpolator.c[::-1].T
|
|
426
|
+
nmb_ps = len(x0s)
|
|
427
|
+
nmb_cs = numpy.array(
|
|
428
|
+
[numpy.max(numpy.nonzero(cs_), initial=0) + 1 for cs_ in cs],
|
|
429
|
+
dtype=config.NP_INT,
|
|
430
|
+
)
|
|
431
|
+
ppoly.nmb_ps, ppoly.nmb_cs, ppoly.x0s, ppoly.cs = nmb_ps, nmb_cs, x0s, cs
|
|
432
|
+
return ppoly
|
|
433
|
+
except BaseException:
|
|
434
|
+
objecttools.augment_excmessage(
|
|
435
|
+
f"While trying to derive polynomials from the vectors `x` "
|
|
436
|
+
f"([{objecttools.enumeration(xs, objecttools.repr_)}]) and `y` "
|
|
437
|
+
f"([{objecttools.enumeration(ys, objecttools.repr_)}])"
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
def _get_nmb_inputs(self) -> Literal[1]:
|
|
441
|
+
"""The number of input values.
|
|
442
|
+
|
|
443
|
+
|PPoly| is a univariate interpolator. Hence, |PPoly.nmb_inputs| is always one:
|
|
444
|
+
|
|
445
|
+
>>> from hydpy import PPoly
|
|
446
|
+
>>> PPoly().nmb_inputs
|
|
447
|
+
1
|
|
448
|
+
"""
|
|
449
|
+
return 1
|
|
450
|
+
|
|
451
|
+
nmb_inputs = propertytools.Property[Never, Literal[1]](fget=_get_nmb_inputs)
|
|
452
|
+
|
|
453
|
+
def _get_inputs(self) -> VectorFloat:
|
|
454
|
+
"""The current input value.
|
|
455
|
+
|
|
456
|
+
|PPoly| is a univariate interpolator. Hence, |PPoly.inputs| always returns a
|
|
457
|
+
vector with a single entry:
|
|
458
|
+
|
|
459
|
+
>>> from hydpy import PPoly, print_vector
|
|
460
|
+
>>> print_vector(PPoly().inputs)
|
|
461
|
+
0.0
|
|
462
|
+
"""
|
|
463
|
+
return numpy.asarray(self._calgorithm.inputs)
|
|
464
|
+
|
|
465
|
+
inputs = propertytools.Property[Never, VectorFloat](fget=_get_inputs)
|
|
466
|
+
|
|
467
|
+
def _get_nmb_outputs(self) -> Literal[1]:
|
|
468
|
+
"""The number of output values.
|
|
469
|
+
|
|
470
|
+
|PPoly| is a univariate interpolator. Hence, |PPoly.nmb_outputs| is always
|
|
471
|
+
one:
|
|
472
|
+
|
|
473
|
+
>>> from hydpy import PPoly
|
|
474
|
+
>>> PPoly().nmb_inputs
|
|
475
|
+
1
|
|
476
|
+
"""
|
|
477
|
+
return 1
|
|
478
|
+
|
|
479
|
+
nmb_outputs = propertytools.Property[Never, Literal[1]](fget=_get_nmb_outputs)
|
|
480
|
+
|
|
481
|
+
def _get_outputs(self) -> VectorFloat:
|
|
482
|
+
"""The lastly calculated output value.
|
|
483
|
+
|
|
484
|
+
|PPoly| is a univariate interpolator. Hence, |PPoly.outputs| always returns a
|
|
485
|
+
vector with a single entry:
|
|
486
|
+
|
|
487
|
+
>>> from hydpy import PPoly, print_vector
|
|
488
|
+
>>> print_vector(PPoly().outputs)
|
|
489
|
+
0.0
|
|
490
|
+
"""
|
|
491
|
+
return numpy.asarray(self._calgorithm.outputs)
|
|
492
|
+
|
|
493
|
+
outputs = propertytools.Property[Never, VectorFloat](fget=_get_outputs)
|
|
494
|
+
|
|
495
|
+
def _get_output_derivatives(self) -> VectorFloat:
|
|
496
|
+
"""The lastly calculated first-order derivative.
|
|
497
|
+
|
|
498
|
+
|PPoly| is a univariate interpolator. Hence, |PPoly.output_derivatives|
|
|
499
|
+
always returns a vector with a single entry:
|
|
500
|
+
|
|
501
|
+
>>> from hydpy import PPoly, print_vector
|
|
502
|
+
>>> print_vector(PPoly().output_derivatives)
|
|
503
|
+
0.0
|
|
504
|
+
"""
|
|
505
|
+
return numpy.asarray(self._calgorithm.output_derivatives)
|
|
506
|
+
|
|
507
|
+
output_derivatives = propertytools.Property[Never, VectorFloat](
|
|
508
|
+
fget=_get_output_derivatives
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
def _get_nmb_ps(self) -> int:
|
|
512
|
+
"""The number of polynomials.
|
|
513
|
+
|
|
514
|
+
|PPoly.nmb_ps| is "protected" (implemented by |ProtectedProperty|) for the sake
|
|
515
|
+
of preventing segmentation faults when trying to access the related data from
|
|
516
|
+
the underlying Cython extension class before allocation:
|
|
517
|
+
|
|
518
|
+
>>> from hydpy import PPoly
|
|
519
|
+
>>> ppoly = PPoly()
|
|
520
|
+
>>> ppoly.nmb_ps = 1
|
|
521
|
+
>>> ppoly.nmb_ps
|
|
522
|
+
1
|
|
523
|
+
>>> del ppoly.nmb_ps
|
|
524
|
+
>>> ppoly.nmb_ps
|
|
525
|
+
Traceback (most recent call last):
|
|
526
|
+
...
|
|
527
|
+
hydpy.core.exceptiontools.AttributeNotReady: Attribute `nmb_ps` of object \
|
|
528
|
+
`ppoly` has not been prepared so far.
|
|
529
|
+
"""
|
|
530
|
+
return self._calgorithm.nmb_ps
|
|
531
|
+
|
|
532
|
+
def _set_nmb_ps(self, value: int) -> None:
|
|
533
|
+
self._calgorithm.nmb_ps = int(value)
|
|
534
|
+
|
|
535
|
+
def _del_nmb_ps(self) -> None:
|
|
536
|
+
pass
|
|
537
|
+
|
|
538
|
+
nmb_ps = propertytools.ProtectedProperty[int, int](
|
|
539
|
+
fget=_get_nmb_ps, fset=_set_nmb_ps, fdel=_del_nmb_ps
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
def _get_nmb_cs(self) -> VectorInt:
|
|
543
|
+
"""The number of relevant coefficients for each polynomial.
|
|
544
|
+
|
|
545
|
+
|PPoly.nmb_cs| is "protected" (implemented by |ProtectedProperty|) for the sake
|
|
546
|
+
of preventing segmentation faults when trying to access the related data from
|
|
547
|
+
the underlying Cython extension class before allocation:
|
|
548
|
+
|
|
549
|
+
>>> from hydpy import PPoly, print_vector
|
|
550
|
+
>>> ppoly = PPoly()
|
|
551
|
+
>>> ppoly.nmb_cs = 1, 2
|
|
552
|
+
>>> print_vector(ppoly.nmb_cs)
|
|
553
|
+
1, 2
|
|
554
|
+
>>> del ppoly.nmb_cs
|
|
555
|
+
>>> ppoly.nmb_cs
|
|
556
|
+
Traceback (most recent call last):
|
|
557
|
+
...
|
|
558
|
+
hydpy.core.exceptiontools.AttributeNotReady: Attribute `nmb_cs` of object \
|
|
559
|
+
`ppoly` has not been prepared so far.
|
|
560
|
+
"""
|
|
561
|
+
return numpy.asarray(self._calgorithm.nmb_cs)
|
|
562
|
+
|
|
563
|
+
def _set_nmb_cs(self, value: VectorInputInt) -> None:
|
|
564
|
+
self._calgorithm.nmb_cs = numpy.asarray(value, dtype=config.NP_INT)
|
|
565
|
+
|
|
566
|
+
def _del_nmb_cs(self) -> None:
|
|
567
|
+
pass
|
|
568
|
+
|
|
569
|
+
nmb_cs = propertytools.ProtectedProperty[VectorInputInt, VectorInt](
|
|
570
|
+
fget=_get_nmb_cs, fset=_set_nmb_cs, fdel=_del_nmb_cs
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
def _get_x0s(self) -> VectorFloat:
|
|
574
|
+
"""The power series constants of all polynomials.
|
|
575
|
+
|
|
576
|
+
|PPoly.x0s| is "protected" (implemented by |ProtectedProperty|) for the sake of
|
|
577
|
+
preventing segmentation faults when trying to access the related data from the
|
|
578
|
+
underlying Cython extension class before allocation:
|
|
579
|
+
|
|
580
|
+
>>> from hydpy import PPoly, print_vector
|
|
581
|
+
>>> ppoly = PPoly()
|
|
582
|
+
>>> ppoly.x0s = 1.0, 2.0
|
|
583
|
+
>>> print_vector(ppoly.x0s)
|
|
584
|
+
1.0, 2.0
|
|
585
|
+
>>> del ppoly.x0s
|
|
586
|
+
>>> ppoly.x0s
|
|
587
|
+
Traceback (most recent call last):
|
|
588
|
+
...
|
|
589
|
+
hydpy.core.exceptiontools.AttributeNotReady: Attribute `x0s` of object \
|
|
590
|
+
`ppoly` has not been prepared so far.
|
|
591
|
+
"""
|
|
592
|
+
return numpy.asarray(self._calgorithm.x0s)
|
|
593
|
+
|
|
594
|
+
def _set_x0s(self, value: VectorInputFloat) -> None:
|
|
595
|
+
self._calgorithm.x0s = numpy.asarray(value, dtype=config.NP_FLOAT)
|
|
596
|
+
|
|
597
|
+
def _del_x0s(self) -> None:
|
|
598
|
+
pass
|
|
599
|
+
|
|
600
|
+
x0s = propertytools.ProtectedProperty[VectorInputFloat, VectorFloat](
|
|
601
|
+
fget=_get_x0s, fset=_set_x0s, fdel=_del_x0s
|
|
602
|
+
)
|
|
603
|
+
|
|
604
|
+
def _get_cs(self) -> MatrixFloat:
|
|
605
|
+
"""The power series coefficients of all polynomials.
|
|
606
|
+
|
|
607
|
+
|PPoly.cs| is "protected" (implemented by |ProtectedProperty|) for the sake of
|
|
608
|
+
preventing segmentation faults when trying to access the related data from the
|
|
609
|
+
underlying Cython extension class before allocation:
|
|
610
|
+
|
|
611
|
+
>>> from hydpy import PPoly, print_matrix
|
|
612
|
+
>>> ppoly = PPoly()
|
|
613
|
+
>>> ppoly.cs = [[1.0, 2.0], [3.0, 4.0]]
|
|
614
|
+
>>> print_matrix(ppoly.cs)
|
|
615
|
+
| 1.0, 2.0 |
|
|
616
|
+
| 3.0, 4.0 |
|
|
617
|
+
>>> del ppoly.cs
|
|
618
|
+
>>> ppoly.cs
|
|
619
|
+
Traceback (most recent call last):
|
|
620
|
+
...
|
|
621
|
+
hydpy.core.exceptiontools.AttributeNotReady: Attribute `cs` of object `ppoly` \
|
|
622
|
+
has not been prepared so far.
|
|
623
|
+
"""
|
|
624
|
+
return numpy.asarray(self._calgorithm.cs)
|
|
625
|
+
|
|
626
|
+
def _set_cs(self, value: MatrixInputFloat) -> None:
|
|
627
|
+
self._calgorithm.cs = numpy.asarray(value, dtype=config.NP_FLOAT)
|
|
628
|
+
|
|
629
|
+
def _del_cs(self) -> None:
|
|
630
|
+
pass
|
|
631
|
+
|
|
632
|
+
cs = propertytools.ProtectedProperty[MatrixInputFloat, MatrixFloat](
|
|
633
|
+
fget=_get_cs, fset=_set_cs, fdel=_del_cs
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
def calculate_values(self) -> None:
|
|
637
|
+
"""Calculate the output value based on the input values defined previously.
|
|
638
|
+
|
|
639
|
+
For more information, see the documentation on class |ppolytools.PPoly|.
|
|
640
|
+
"""
|
|
641
|
+
self._calgorithm.calculate_values()
|
|
642
|
+
|
|
643
|
+
def calculate_derivatives(self, idx: int = 0, /) -> None:
|
|
644
|
+
"""Calculate the derivative of the output value with respect to the input value.
|
|
645
|
+
|
|
646
|
+
For more information, see the documentation on class |ppolytools.PPoly|.
|
|
647
|
+
"""
|
|
648
|
+
self._calgorithm.calculate_derivatives(idx)
|
|
649
|
+
|
|
650
|
+
@property
|
|
651
|
+
def polynomials(self) -> tuple[Poly, ...]:
|
|
652
|
+
"""The configuration of the current |ppolytools.PPoly| object, represented by a
|
|
653
|
+
tuple of |Poly| objects.
|
|
654
|
+
|
|
655
|
+
>>> from hydpy import Poly, PPoly
|
|
656
|
+
>>> ppoly = PPoly(Poly(x0=1.0, cs=(1.0,)), Poly(x0=2.0, cs=(1.0, 1.0)))
|
|
657
|
+
>>> ppoly.polynomials
|
|
658
|
+
(Poly(x0=1.0, cs=(1.0,)), Poly(x0=2.0, cs=(1.0, 1.0)))
|
|
659
|
+
"""
|
|
660
|
+
return tuple(
|
|
661
|
+
Poly(x0=x0, cs=tuple(cs[:n]))
|
|
662
|
+
for x0, cs, n in zip(self.x0s, self.cs, self.nmb_cs)
|
|
663
|
+
)
|
|
664
|
+
|
|
665
|
+
def sort(self) -> None:
|
|
666
|
+
"""Sort the currently handled polynomials.
|
|
667
|
+
|
|
668
|
+
The power series constants held by array |ppolytools.PPoly.x0s| also
|
|
669
|
+
serve as breakpoints, defining the lower bounds of the intervals for which the
|
|
670
|
+
available polynomials are valid. The algorithm underlying |PPoly| expects them
|
|
671
|
+
in sorted order.
|
|
672
|
+
|
|
673
|
+
In the following example, we hand over two wrongly-ordered |Poly| objects:
|
|
674
|
+
|
|
675
|
+
>>> from hydpy import Poly, PPoly, print_matrix, print_vector
|
|
676
|
+
>>> ppoly = PPoly(Poly(x0=2.0, cs=(1.0, 1.0)), Poly(x0=1.0, cs=(1.0,)))
|
|
677
|
+
>>> ppoly.polynomials
|
|
678
|
+
(Poly(x0=2.0, cs=(1.0, 1.0)), Poly(x0=1.0, cs=(1.0,)))
|
|
679
|
+
>>> print_vector(ppoly.x0s)
|
|
680
|
+
2.0, 1.0
|
|
681
|
+
>>> print_vector(ppoly.nmb_cs)
|
|
682
|
+
2, 1
|
|
683
|
+
>>> print_matrix(ppoly.cs)
|
|
684
|
+
| 1.0, 1.0 |
|
|
685
|
+
| 1.0, 0.0 |
|
|
686
|
+
|
|
687
|
+
Method |ppolytools.PPoly.sort| sorts |ppolytools.PPoly.x0s| and the related
|
|
688
|
+
arrays |ppolytools.PPoly.nmb_cs| and |ppolytools.PPoly.cs|:
|
|
689
|
+
|
|
690
|
+
>>> ppoly.sort()
|
|
691
|
+
>>> ppoly.polynomials
|
|
692
|
+
(Poly(x0=1.0, cs=(1.0,)), Poly(x0=2.0, cs=(1.0, 1.0)))
|
|
693
|
+
>>> print_vector(ppoly.x0s)
|
|
694
|
+
1.0, 2.0
|
|
695
|
+
>>> print_vector(ppoly.nmb_cs)
|
|
696
|
+
1, 2
|
|
697
|
+
>>> print_matrix(ppoly.cs)
|
|
698
|
+
| 1.0, 0.0 |
|
|
699
|
+
| 1.0, 1.0 |
|
|
700
|
+
"""
|
|
701
|
+
idxs: VectorInt = numpy.argsort(self.x0s)
|
|
702
|
+
self.x0s = self.x0s[idxs]
|
|
703
|
+
self.nmb_cs = self.nmb_cs[idxs]
|
|
704
|
+
self.cs = self.cs[idxs, :]
|
|
705
|
+
|
|
706
|
+
def verify(self) -> None:
|
|
707
|
+
"""Raise a |RuntimeError| if the current |ppolytools.PPoly| object shows
|
|
708
|
+
inconsistencies.
|
|
709
|
+
|
|
710
|
+
Note that |ppolytools.PPoly| never calls |ppolytools.PPoly.verify|
|
|
711
|
+
automatically. Hence, we strongly advise applying it manually before using a
|
|
712
|
+
new |ppolytools.PPoly| configuration the first time.
|
|
713
|
+
|
|
714
|
+
So far, method |ppolytools.PPoly.verify| reports the following problems:
|
|
715
|
+
|
|
716
|
+
>>> from hydpy import PPoly
|
|
717
|
+
>>> ppoly = PPoly(Poly(x0=2.0, cs=(1.0, 1.0)), Poly(x0=1.0, cs=(1.0,)))
|
|
718
|
+
>>> ppoly.verify()
|
|
719
|
+
Traceback (most recent call last):
|
|
720
|
+
...
|
|
721
|
+
RuntimeError: While trying to verify parameter `ppoly` of element `?`, the \
|
|
722
|
+
following error occurred: The constants held in vector `x0s` are not strictly \
|
|
723
|
+
increasing, which is necessary as they also serve as breakpoints for selecting the \
|
|
724
|
+
relevant polynomials.
|
|
725
|
+
|
|
726
|
+
>>> ppoly.sort()
|
|
727
|
+
>>> ppoly.verify()
|
|
728
|
+
|
|
729
|
+
>>> ppoly.nmb_cs[1] = 3
|
|
730
|
+
>>> ppoly.verify()
|
|
731
|
+
Traceback (most recent call last):
|
|
732
|
+
...
|
|
733
|
+
RuntimeError: While trying to verify parameter `ppoly` of element `?`, the \
|
|
734
|
+
following error occurred: The highest number of coefficients indicated by `nmb_cs` \
|
|
735
|
+
(3) is larger than the possible number of coefficients storable in the coefficient \
|
|
736
|
+
matrix `cs` (2).
|
|
737
|
+
|
|
738
|
+
>>> ppoly.cs = ppoly.cs[:1, :]
|
|
739
|
+
>>> ppoly.verify()
|
|
740
|
+
Traceback (most recent call last):
|
|
741
|
+
...
|
|
742
|
+
RuntimeError: While trying to verify parameter `ppoly` of element `?`, the \
|
|
743
|
+
following error occurred: The number of polynomials indicated by `nmb_ps` (2) does \
|
|
744
|
+
not agree with the actual number of coefficient arrays held by matrix `cs` (1).
|
|
745
|
+
|
|
746
|
+
>>> ppoly.x0s = ppoly.x0s[:1]
|
|
747
|
+
>>> ppoly.verify()
|
|
748
|
+
Traceback (most recent call last):
|
|
749
|
+
...
|
|
750
|
+
RuntimeError: While trying to verify parameter `ppoly` of element `?`, the \
|
|
751
|
+
following error occurred: The number of constants indicated by `nmb_ps` (2) does not \
|
|
752
|
+
agree with the actual number of constants held by vector `x0s` (1).
|
|
753
|
+
"""
|
|
754
|
+
try:
|
|
755
|
+
if self.nmb_ps != len(self.x0s):
|
|
756
|
+
raise RuntimeError(
|
|
757
|
+
f"The number of constants indicated by `nmb_ps` ({self.nmb_ps}) "
|
|
758
|
+
f"does not agree with the actual number of constants held by "
|
|
759
|
+
f"vector `x0s` ({len(self.x0s)})."
|
|
760
|
+
)
|
|
761
|
+
if self.nmb_ps != len(self.cs):
|
|
762
|
+
raise RuntimeError(
|
|
763
|
+
f"The number of polynomials indicated by `nmb_ps` ({self.nmb_ps}) "
|
|
764
|
+
f"does not agree with the actual number of coefficient arrays held "
|
|
765
|
+
f"by matrix `cs` ({len(self.cs)})."
|
|
766
|
+
)
|
|
767
|
+
if numpy.max(self.nmb_cs) > self.cs.shape[1]:
|
|
768
|
+
raise RuntimeError(
|
|
769
|
+
f"The highest number of coefficients indicated by `nmb_cs` "
|
|
770
|
+
f"({numpy.max(self.nmb_cs)}) is larger than the possible number of "
|
|
771
|
+
f"coefficients storable in the coefficient matrix `cs` "
|
|
772
|
+
f"({self.cs.shape[1]})."
|
|
773
|
+
)
|
|
774
|
+
if (self.nmb_ps > 1) and (numpy.min(numpy.diff(self.x0s)) <= 0.0):
|
|
775
|
+
raise RuntimeError(
|
|
776
|
+
"The constants held in vector `x0s` are not strictly increasing, "
|
|
777
|
+
"which is necessary as they also serve as breakpoints for "
|
|
778
|
+
"selecting the relevant polynomials."
|
|
779
|
+
)
|
|
780
|
+
except BaseException:
|
|
781
|
+
objecttools.augment_excmessage(
|
|
782
|
+
f"While trying to verify parameter {objecttools.elementphrase(self)}"
|
|
783
|
+
)
|
|
784
|
+
|
|
785
|
+
def assignrepr(self, prefix: str, indent: int = 0) -> str:
|
|
786
|
+
"""Return a string representation of the actual |ppolytools.PPoly| object
|
|
787
|
+
prefixed with the given string.
|
|
788
|
+
|
|
789
|
+
>>> from hydpy import Poly, PPoly
|
|
790
|
+
>>> ppoly = PPoly(Poly(x0=1.0, cs=(1.0,)), Poly(x0=2.0, cs=(1.0, 1.0)))
|
|
791
|
+
>>> ppoly
|
|
792
|
+
PPoly(
|
|
793
|
+
Poly(x0=1.0, cs=(1.0,)),
|
|
794
|
+
Poly(x0=2.0, cs=(1.0, 1.0)),
|
|
795
|
+
)
|
|
796
|
+
>>> print(ppoly.assignrepr(prefix=" ppoly = ", indent=4))
|
|
797
|
+
ppoly = PPoly(
|
|
798
|
+
Poly(x0=1.0, cs=(1.0,)),
|
|
799
|
+
Poly(x0=2.0, cs=(1.0, 1.0)),
|
|
800
|
+
)
|
|
801
|
+
"""
|
|
802
|
+
blanks = (indent + 4) * " "
|
|
803
|
+
lines = [f"{prefix}{type(self).__name__}("]
|
|
804
|
+
lines.extend(f"{blanks}{poly}," for poly in self.polynomials)
|
|
805
|
+
lines.append(f'{indent*" "})')
|
|
806
|
+
return "\n".join(lines)
|
|
807
|
+
|
|
808
|
+
def __repr__(self) -> str:
|
|
809
|
+
return self.assignrepr(prefix="", indent=0)
|