pandapower 3.0.0.dev2__tar.gz → 3.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/AUTHORS +9 -3
  2. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/LICENSE +7 -7
  3. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/PKG-INFO +5 -32
  4. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/_version.py +1 -1
  5. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/auxiliary.py +27 -27
  6. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_branch.py +19 -6
  7. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_bus.py +13 -12
  8. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_gen.py +56 -13
  9. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/contingency/contingency.py +5 -10
  10. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/__init__.py +13 -11
  11. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/basic_controller.py +1 -1
  12. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/DERBasics.py +2 -5
  13. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/PQVAreas.py +2 -5
  14. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/QModels.py +2 -5
  15. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/der_control.py +24 -26
  16. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/der_control_plot.py +5 -5
  17. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/characteristic_control.py +1 -1
  18. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/const_control.py +2 -5
  19. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/pq_control.py +1 -1
  20. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/shunt_control.py +1 -4
  21. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/ContinuousTapControl.py +1 -1
  22. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/DiscreteTapControl.py +1 -1
  23. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/TapDependentImpedance.py +1 -1
  24. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/VmSetTapControl.py +1 -1
  25. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo_control.py +23 -15
  26. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/run_control.py +4 -3
  27. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/auxiliary.py +98 -3
  28. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/characteristic.py +3 -4
  29. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/diagnostic.py +75 -1
  30. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/convert_format.py +4 -7
  31. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/build_pp_net.py +15 -9
  32. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/convert_measurements.py +6 -7
  33. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/connectivityNodesCim16.py +37 -22
  34. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/externalNetworkInjectionsCim16.py +12 -5
  35. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/energySourcesCim16.py +5 -0
  36. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/synchronousMachinesCim16.py +55 -4
  37. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/acLineSegmentsCim16.py +1 -1
  38. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/linearShuntCompensatorCim16.py +2 -0
  39. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/staticVarCompensatorCim16.py +2 -1
  40. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/powerTransformersCim16.py +12 -13
  41. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/from_cim.py +6 -6
  42. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim_classes.py +48 -34
  43. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim_tools.py +3 -3
  44. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/pp_classes.py +7 -6
  45. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/pp_tools.py +10 -9
  46. pandapower-3.0.0.dev2/pandapower/converter/cim/serialized_schemas/CIM16_4.0.8_schema.json → pandapower-3.1.2/pandapower/converter/cim/serialized_schemas/CIM16_4.2.9_schema.json +2313 -5994
  47. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/jao/from_jao.py +2 -5
  48. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/from_mpc.py +9 -12
  49. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/to_mpc.py +6 -9
  50. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/to_pm.py +1 -4
  51. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/export_pfd_to_pp.py +4 -7
  52. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/gui.py +1 -4
  53. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/logger_setup.py +1 -4
  54. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/main_pf.py +9 -12
  55. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/pf_export_functions.py +1 -4
  56. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/pp_import_functions.py +537 -360
  57. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/validate.py +13 -13
  58. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/from_ppc.py +1 -4
  59. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/to_ppc.py +8 -10
  60. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/from_ucte.py +10 -4
  61. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/ucte_converter.py +12 -3
  62. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/ucte_parser.py +14 -2
  63. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/create.py +218 -117
  64. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/diagnostic.py +14 -17
  65. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/diagnostic_reports.py +2 -5
  66. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/base.py +38 -36
  67. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/estimator.py +25 -6
  68. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/lp.py +29 -13
  69. pandapower-3.1.2/pandapower/estimation/algorithm/matrix_base.py +315 -0
  70. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/optimization.py +4 -2
  71. pandapower-3.1.2/pandapower/estimation/ppc_conversion.py +756 -0
  72. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/results.py +20 -18
  73. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/state_estimation.py +47 -56
  74. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/util.py +12 -9
  75. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/file_io.py +45 -38
  76. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/auxiliary.py +108 -104
  77. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/get_equivalent.py +52 -53
  78. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/rei_generation.py +122 -111
  79. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/toolbox.py +28 -25
  80. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/ward_generation.py +77 -83
  81. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/groups.py +26 -29
  82. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/io_utils.py +10 -12
  83. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_Off_Peak_1.json +165 -16
  84. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_Off_Peak_1440.json +165 -16
  85. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_On_Peak_566.json +165 -16
  86. pandapower-3.1.2/pandapower/networks/cigre_networks.py +465 -0
  87. pandapower-3.1.2/pandapower/networks/create_examples.py +408 -0
  88. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/dickert_lv_networks.py +60 -57
  89. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/ieee_europen_lv_asymmetric.py +11 -11
  90. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/kerber_extreme_networks.py +1 -1
  91. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/kerber_networks.py +24 -22
  92. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/lv_schutterwald.json +140 -10
  93. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/lv_schutterwald.py +18 -17
  94. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein.json +152 -14
  95. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein.py +22 -20
  96. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein_substations.json +152 -14
  97. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/GBnetwork.json +165 -16
  98. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/GBreducednetwork.json +165 -16
  99. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case118.json +165 -16
  100. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case11_iwamoto.json +166 -16
  101. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case1354pegase.json +165 -16
  102. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case14.json +165 -16
  103. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case145.json +165 -16
  104. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case1888rte.json +165 -16
  105. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case24_ieee_rts.json +165 -16
  106. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case2848rte.json +165 -16
  107. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case2869pegase.json +165 -16
  108. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case30.json +165 -15
  109. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case300.json +165 -16
  110. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case3120sp.json +165 -16
  111. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case33bw.json +165 -15
  112. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case39.json +165 -16
  113. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case4gs.json +165 -15
  114. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case5.json +165 -15
  115. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case57.json +165 -16
  116. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case5_demo_gridcal.json +166 -16
  117. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6470rte.json +165 -16
  118. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6495rte.json +165 -16
  119. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6515rte.json +165 -16
  120. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6ww.json +165 -15
  121. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case89pegase.json +165 -16
  122. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case9.json +165 -15
  123. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case9241pegase.json +165 -16
  124. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case_ieee30.json +165 -16
  125. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case_illinois200.json +165 -16
  126. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/iceland.json +165 -16
  127. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_cases.py +86 -114
  128. pandapower-3.1.2/pandapower/networks/simple_pandapower_test_networks.py +190 -0
  129. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/synthetic_voltage_control_lv_networks.py +59 -58
  130. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/make_objective.py +2 -5
  131. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/run_pandamodels.py +1 -4
  132. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/optimal_powerflow.py +2 -5
  133. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pd2ppc.py +49 -46
  134. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pd2ppc_zero.py +5 -6
  135. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/__init__.py +1 -1
  136. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian.py +1 -1
  137. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_facts.py +1 -1
  138. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_numba.py +1 -1
  139. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_tdpf.py +1 -1
  140. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/dSbus_dV_numba.py +1 -1
  141. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/iwamoto_multiplier.py +1 -1
  142. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/makeYbus_facts.py +1 -1
  143. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/makeYbus_numba.py +1 -1
  144. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/no_numba.py +1 -1
  145. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/pfsoln_numba.py +1 -1
  146. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/ppci_variables.py +1 -1
  147. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_bfswpf.py +8 -10
  148. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_dc_pf.py +1 -1
  149. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_newton_raphson_pf.py +1 -1
  150. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/runpf_pypower.py +2 -5
  151. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/runpp_3ph.py +2 -5
  152. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/collections.py +72 -60
  153. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/generic_geodata.py +7 -9
  154. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/geo.py +53 -24
  155. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/patch_makers.py +1 -4
  156. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/mapbox_plot.py +4 -24
  157. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/pf_res_plotly.py +3 -5
  158. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/simple_plotly.py +3 -46
  159. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/traces.py +18 -12
  160. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/vlevel_plotly.py +3 -6
  161. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotting_toolbox.py +1 -4
  162. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/powerflow_results.py +8 -7
  163. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/simple_plot.py +5 -6
  164. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/powerflow.py +3 -6
  165. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/basic_protection_device.py +2 -2
  166. pandapower-3.1.2/pandapower/protection/example_grids.py +129 -0
  167. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/ocrelay.py +3 -4
  168. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/run_protection.py +0 -2
  169. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/utility_functions.py +61 -56
  170. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/bustypes.py +1 -1
  171. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dSbus_dV.py +1 -1
  172. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dcpf.py +1 -1
  173. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch.py +1 -1
  174. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_sc.py +1 -1
  175. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_tdpf.py +1 -1
  176. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus.py +1 -1
  177. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus_sc.py +1 -1
  178. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_ssc.py +1 -1
  179. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_svc.py +1 -1
  180. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_tcsc.py +1 -1
  181. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeBdc.py +2 -5
  182. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeLODF.py +3 -3
  183. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makePTDF.py +1 -1
  184. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeYbus.py +2 -2
  185. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/newtonpf.py +1 -1
  186. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf.py +1 -1
  187. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_execute.py +1 -1
  188. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_hessfcn.py +1 -1
  189. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_setup.py +1 -1
  190. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pfsoln.py +1 -1
  191. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pips.py +1 -1
  192. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pipsopf_solver.py +1 -1
  193. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results.py +1 -1
  194. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_branch.py +3 -3
  195. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_bus.py +20 -7
  196. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_gen.py +1 -1
  197. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/run.py +2 -5
  198. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/runpm.py +1 -1
  199. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/calc_sc.py +17 -20
  200. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/currents.py +1 -4
  201. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/ppc_conversion.py +1 -4
  202. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/toolbox.py +10 -13
  203. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/sql_io.py +2 -5
  204. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/std_types.py +7 -9
  205. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/output_writer.py +7 -4
  206. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/run_time_series.py +11 -7
  207. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/ts_runpp.py +30 -27
  208. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/comparison.py +1 -4
  209. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/data_modification.py +36 -24
  210. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/element_selection.py +38 -38
  211. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/grid_modification.py +10 -5
  212. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/power_factor.py +2 -5
  213. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/result_info.py +2 -5
  214. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/create_graph.py +7 -9
  215. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/graph_searches.py +22 -31
  216. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/PKG-INFO +5 -32
  217. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/SOURCES.txt +1 -3
  218. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/requires.txt +1 -1
  219. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pyproject.toml +5 -14
  220. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/setup.py +1 -1
  221. pandapower-3.0.0.dev2/CHANGELOG.rst +0 -782
  222. pandapower-3.0.0.dev2/CITATION.bib +0 -11
  223. pandapower-3.0.0.dev2/pandapower/estimation/algorithm/matrix_base.py +0 -233
  224. pandapower-3.0.0.dev2/pandapower/estimation/ppc_conversion.py +0 -607
  225. pandapower-3.0.0.dev2/pandapower/networks/cigre_networks.py +0 -524
  226. pandapower-3.0.0.dev2/pandapower/networks/create_examples.py +0 -406
  227. pandapower-3.0.0.dev2/pandapower/networks/simple_pandapower_test_networks.py +0 -194
  228. pandapower-3.0.0.dev2/pandapower/protection/example_grids.py +0 -134
  229. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/README.rst +0 -0
  230. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/__init__.py +0 -0
  231. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/contingency/__init__.py +0 -0
  232. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/__init__.py +0 -0
  233. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/__init__.py +0 -0
  234. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/station_control.py +0 -0
  235. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/__init__.py +0 -0
  236. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/__init__.py +0 -0
  237. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/__init__.py +0 -0
  238. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/__init__.py +0 -0
  239. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/__init__.py +0 -0
  240. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/__init__.py +0 -0
  241. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/__init__.py +0 -0
  242. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/__init__.py +0 -0
  243. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/coordinatesFromDLCim16.py +0 -0
  244. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/geoCoordinatesFromGLCim16.py +0 -0
  245. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/__init__.py +0 -0
  246. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/__init__.py +0 -0
  247. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/asynchronousMachinesCim16.py +0 -0
  248. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/__init__.py +0 -0
  249. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/equivalentBranchesCim16.py +0 -0
  250. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/seriesCompensatorsCim16.py +0 -0
  251. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/__init__.py +0 -0
  252. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/dcLineSegmentsCim16.py +0 -0
  253. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/__init__.py +0 -0
  254. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/conformLoadsCim16.py +0 -0
  255. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/energyConcumersCim16.py +0 -0
  256. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/nonConformLoadsCim16.py +0 -0
  257. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/stationSuppliesCim16.py +0 -0
  258. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/__init__.py +0 -0
  259. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/nonLinearShuntCompensatorCim16.py +0 -0
  260. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/switches/__init__.py +0 -0
  261. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/switches/switchesCim16.py +0 -0
  262. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/__init__.py +0 -0
  263. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/tapController.py +0 -0
  264. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/wards/__init__.py +0 -0
  265. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/wards/equivalentInjectionsCim16.py +0 -0
  266. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/interfaces.py +0 -0
  267. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/other_classes.py +0 -0
  268. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/serialized_schemas/CIM100_4.0.10_schema.json +0 -0
  269. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/jao/__init__.py +0 -0
  270. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/__init__.py +0 -0
  271. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/__init__.py +0 -0
  272. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/from_pm.py +0 -0
  273. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/__init__.py +0 -0
  274. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/echo_off.py +0 -0
  275. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/run_import.py +0 -0
  276. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/__init__.py +0 -0
  277. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/__init__.py +0 -0
  278. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/__init__.py +0 -0
  279. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/__init__.py +0 -0
  280. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/idx_brch.py +0 -0
  281. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/idx_bus.py +0 -0
  282. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/__init__.py +0 -0
  283. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/__init__.py +0 -0
  284. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/__init__.py +0 -0
  285. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/pm_storage.py +0 -0
  286. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/validate_opf_input.py +0 -0
  287. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/__init__.py +0 -0
  288. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/colormaps.py +0 -0
  289. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/__init__.py +0 -0
  290. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/get_colors.py +0 -0
  291. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/to_html.py +0 -0
  292. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/__init__.py +0 -0
  293. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/__init__.py +0 -0
  294. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/fuse.py +0 -0
  295. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/__init__.py +0 -0
  296. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/_compat.py +0 -0
  297. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/add_userfcn.py +0 -0
  298. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2AIbr_dV2.py +0 -0
  299. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2ASbr_dV2.py +0 -0
  300. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Ibr_dV2.py +0 -0
  301. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Sbr_dV2.py +0 -0
  302. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Sbus_dV2.py +0 -0
  303. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dAbr_dV.py +0 -0
  304. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dIbr_dV.py +0 -0
  305. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dSbr_dV.py +0 -0
  306. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dcopf_solver.py +0 -0
  307. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/fdpf.py +0 -0
  308. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/gausspf.py +0 -0
  309. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/hasPQcap.py +0 -0
  310. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_area.py +0 -0
  311. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_dc.py +0 -0
  312. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus_dc.py +0 -0
  313. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_cost.py +0 -0
  314. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_gen.py +0 -0
  315. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_vsc.py +0 -0
  316. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/isload.py +0 -0
  317. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAang.py +0 -0
  318. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeApq.py +0 -0
  319. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAvl.py +0 -0
  320. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAy.py +0 -0
  321. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeB.py +0 -0
  322. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeSbus.py +0 -0
  323. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_args.py +0 -0
  324. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_consfcn.py +0 -0
  325. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_costfcn.py +0 -0
  326. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_model.py +0 -0
  327. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pipsver.py +0 -0
  328. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/polycost.py +0 -0
  329. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/ppoption.py +0 -0
  330. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/ppver.py +0 -0
  331. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pqcost.py +0 -0
  332. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/printpf.py +0 -0
  333. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/qps_pips.py +0 -0
  334. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/qps_pypower.py +0 -0
  335. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/run_userfcn.py +0 -0
  336. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/totcost.py +0 -0
  337. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/update_mupq.py +0 -0
  338. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/util.py +0 -0
  339. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/__init__.py +0 -0
  340. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/impedance.py +0 -0
  341. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/kappa.py +0 -0
  342. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/results.py +0 -0
  343. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/__init__.py +0 -0
  344. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_source.py +0 -0
  345. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_sources/__init__.py +0 -0
  346. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_sources/frame_data.py +0 -0
  347. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/read_batch_results.py +0 -0
  348. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/__init__.py +0 -0
  349. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/__init__.py +0 -0
  350. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/graph_tool_interface.py +0 -0
  351. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/dependency_links.txt +0 -0
  352. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/top_level.txt +0 -0
  353. {pandapower-3.0.0.dev2 → pandapower-3.1.2}/setup.cfg +0 -0
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
1
+ Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
2
2
  and Energy System Technology (IEE), Kassel. All rights reserved.
3
3
 
4
4
  pandapower is maintained and developed by a community on `GitHub <https://github.com/e2nIEE/pandapower>`_. Lists of maintainers and contributors can be found here:
@@ -31,6 +31,12 @@ Previous list of Contributors:
31
31
  - Zhenqi Wang
32
32
  - Alexander Prostejovsky
33
33
  - Maryam Majidi
34
- - Martin Braun
35
- - Johann-Christian Töbermann
34
+ - Martin Braun
35
+ - Johann-Christian Töbermann
36
36
  - Stefan Gehler
37
+ - Mike Vogt
38
+ - Pawel Lytaev
39
+ - Dominik Hilbrich
40
+ - Mario Richter
41
+ - David Heck
42
+ - Hjalmar Körtge
@@ -1,8 +1,8 @@
1
- Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
1
+ Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
2
2
  and Energy System Technology (IEE) Kassel and individual contributors (see AUTHORS file for details).
3
3
  All rights reserved.
4
4
 
5
- Redistribution and use in source and binary forms, with or without modification, are permitted
5
+ Redistribution and use in source and binary forms, with or without modification, are permitted
6
6
  provided that the following conditions are met:
7
7
 
8
8
  1. Redistributions of source code must retain the above copyright notice, this list of conditions
@@ -12,14 +12,14 @@ and the following disclaimer.
12
12
  conditions and the following disclaimer in the documentation and/or other materials provided
13
13
  with the distribution.
14
14
 
15
- 3. Neither the name of the copyright holder nor the names of its contributors may be used to
15
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to
16
16
  endorse or promote products derived from this software without specific prior written permission.
17
17
 
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
19
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
19
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
21
21
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
23
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
24
  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
25
25
  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,35 +1,9 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: pandapower
3
- Version: 3.0.0.dev2
3
+ Version: 3.1.2
4
4
  Summary: An easy to use open source tool for power system modeling, analysis and optimization with a high degree of automation.
5
- Author-email: Leon Thurner <leon.thurner@retoflow.de>, Alexander Scheidler <alexander.scheidler@iee.fraunhofer.de>
5
+ Author-email: Leon Thurner <leon.thurner@retoflow.de>, Alexander Scheidler <alexander.scheidler@iee.fraunhofer.de>, Mike Vogt <mike.vogt@iee.fraunhofer.de>
6
6
  Maintainer-email: pandapower Developers <info@pandapower.org>
7
- License: Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
8
- and Energy System Technology (IEE) Kassel and individual contributors (see AUTHORS file for details).
9
- All rights reserved.
10
-
11
- Redistribution and use in source and binary forms, with or without modification, are permitted
12
- provided that the following conditions are met:
13
-
14
- 1. Redistributions of source code must retain the above copyright notice, this list of conditions
15
- and the following disclaimer.
16
-
17
- 2. Redistributions in binary form must reproduce the above copyright notice, this list of
18
- conditions and the following disclaimer in the documentation and/or other materials provided
19
- with the distribution.
20
-
21
- 3. Neither the name of the copyright holder nor the names of its contributors may be used to
22
- endorse or promote products derived from this software without specific prior written permission.
23
-
24
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
25
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
26
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
27
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
31
- WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
-
33
7
  Project-URL: Homepage, https://www.pandapower.org
34
8
  Project-URL: Documentation, https://pandapower.readthedocs.io
35
9
  Project-URL: Source, https://www.github.com/e2nIEE/pandapower
@@ -56,11 +30,9 @@ Requires-Python: >=3.9
56
30
  Description-Content-Type: text/x-rst
57
31
  License-File: LICENSE
58
32
  License-File: AUTHORS
59
- License-File: CHANGELOG.rst
60
- License-File: CITATION.bib
61
33
  Requires-Dist: pandas>=1.0
62
34
  Requires-Dist: networkx>=2.5
63
- Requires-Dist: scipy<1.14
35
+ Requires-Dist: scipy
64
36
  Requires-Dist: numpy
65
37
  Requires-Dist: packaging
66
38
  Requires-Dist: tqdm
@@ -120,6 +92,7 @@ Requires-Dist: cryptography; extra == "all"
120
92
  Requires-Dist: psycopg2; extra == "all"
121
93
  Requires-Dist: matpowercaseframes; extra == "all"
122
94
  Requires-Dist: power-grid-model-io; extra == "all"
95
+ Dynamic: license-file
123
96
 
124
97
 
125
98
  .. image:: https://www.pandapower.org/images/pp.svg
@@ -1,4 +1,4 @@
1
1
  import importlib.metadata
2
2
 
3
3
  __version__ = importlib.metadata.version("pandapower")
4
- __format_version__ = "3.0.0.dev0"
4
+ __format_version__ = "3.0.0"
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
3
+ # Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
4
4
  # and Energy System Technology (IEE), Kassel. All rights reserved.
5
5
 
6
6
 
@@ -27,43 +27,41 @@
27
27
  # (https://github.com/bcj/AttrDict/blob/master/LICENSE.txt)
28
28
 
29
29
  import copy
30
- from collections.abc import MutableMapping
30
+ import numbers
31
31
  import warnings
32
- from importlib.metadata import version as version_str
32
+ from collections.abc import MutableMapping
33
33
  from importlib.metadata import PackageNotFoundError
34
- from typing_extensions import deprecated
34
+ from importlib.metadata import version as version_str
35
35
 
36
- from geojson import loads, GeoJSON
37
36
  import numpy as np
38
37
  import pandas as pd
39
38
  from pandas.api.types import is_numeric_dtype, is_string_dtype, is_object_dtype
40
39
  # from pandas.api.types import is_integer_dtype, is_float_dtype
41
40
  import scipy as sp
42
- import numbers
41
+ from geojson import loads, GeoJSON
43
42
  from packaging.version import Version
43
+ from typing_extensions import deprecated
44
44
 
45
45
  from pandapower.pypower.idx_brch import F_BUS, T_BUS, BR_STATUS
46
46
  from pandapower.pypower.idx_brch_dc import DC_BR_STATUS, DC_F_BUS, DC_T_BUS
47
47
  from pandapower.pypower.idx_bus import BUS_I, BUS_TYPE, NONE, PD, QD, VM, VA, REF, PQ, VMIN, VMAX, PV
48
+ from pandapower.pypower.idx_bus_dc import DC_VMAX, DC_VMIN, DC_BUS_I, DC_BUS_TYPE, DC_NONE, DC_REF, DC_B2B, DC_P
48
49
  from pandapower.pypower.idx_gen import PMIN, PMAX, QMIN, QMAX
49
50
  from pandapower.pypower.idx_ssc import SSC_STATUS, SSC_BUS, SSC_INTERNAL_BUS
50
51
  from pandapower.pypower.idx_tcsc import TCSC_STATUS, TCSC_F_BUS, TCSC_T_BUS
51
- from pandapower.pypower.idx_vsc import VSC_STATUS, VSC_BUS, VSC_INTERNAL_BUS, VSC_BUS_DC, VSC_MODE_AC, VSC_MODE_AC_SL, \
52
- VSC_INTERNAL_BUS_DC
53
- from .pypower.idx_bus_dc import DC_VMAX, DC_VMIN, DC_BUS_I, DC_BUS_TYPE, DC_NONE, DC_REF, DC_B2B, DC_P
52
+ from pandapower.pypower.idx_vsc import VSC_STATUS, VSC_BUS, VSC_INTERNAL_BUS, VSC_BUS_DC, VSC_INTERNAL_BUS_DC
54
53
 
55
54
  try:
56
55
  from lightsim2grid.newtonpf import newtonpf_new as newtonpf_ls
56
+
57
57
  lightsim2grid_available = True
58
58
  except ImportError:
59
59
  lightsim2grid_available = False
60
- try:
61
- import pandaplan.core.pplog as logging
62
- except ImportError:
63
- import logging
60
+ import logging
64
61
  try:
65
62
  from geopandas import GeoSeries
66
63
  from shapely import from_geojson
64
+
67
65
  geopandas_available = True
68
66
  except ImportError:
69
67
  geopandas_available = False
@@ -87,10 +85,9 @@ def log_to_level(msg, passed_logger, level):
87
85
 
88
86
 
89
87
  def version_check(package_name, level="UserWarning", ignore_not_installed=False):
90
-
91
88
  minimum_version = {'plotly': "3.1.1",
92
89
  'numba': "0.25",
93
- }
90
+ }
94
91
  if ignore_not_installed and package_name not in minimum_version.keys():
95
92
  return
96
93
 
@@ -110,6 +107,7 @@ def version_check(package_name, level="UserWarning", ignore_not_installed=False)
110
107
 
111
108
  try:
112
109
  from numba import jit
110
+
113
111
  try:
114
112
  version_check("numba")
115
113
  NUMBA_INSTALLED = True
@@ -119,6 +117,7 @@ try:
119
117
  NUMBA_INSTALLED = False
120
118
  except ImportError:
121
119
  from .pf.no_numba import jit
120
+
122
121
  NUMBA_INSTALLED = False
123
122
 
124
123
 
@@ -318,7 +317,7 @@ class pandapowerNet(ADict):
318
317
  for key in self:
319
318
  if isinstance(self[key], list):
320
319
  self[key] = pd.DataFrame(np.zeros(0, dtype=self[key]), index=pd.Index([],
321
- dtype=np.int64))
320
+ dtype=np.int64))
322
321
 
323
322
  @deprecated("Use copy.deepcopy(net) instead of net.deepcopy()")
324
323
  def deepcopy(self):
@@ -349,7 +348,7 @@ class pandapowerNet(ADict):
349
348
  if len(res):
350
349
  res = [" and the following results tables:"] + res
351
350
  lines = ["This pandapower network includes the following parameter tables:"] + \
352
- par + res + res_cost
351
+ par + res + res_cost
353
352
  return "\n".join(lines)
354
353
 
355
354
 
@@ -359,6 +358,7 @@ class GeoAccessor:
359
358
  pandas Series accessor for the geo column. It facilitates the use of geojson strings.
360
359
  NaN entrys are dropped using the accessor!
361
360
  """
361
+
362
362
  def __init__(self, pandas_obj):
363
363
  self._validate(pandas_obj)
364
364
  self._obj = pandas_obj
@@ -426,6 +426,7 @@ class GeoAccessor:
426
426
  if callable(geoms_item):
427
427
  def wrapper(*args, **kwargs):
428
428
  return geoms_item(*args, **kwargs)
429
+
429
430
  return wrapper
430
431
  else:
431
432
  return geoms_item
@@ -436,7 +437,6 @@ def plural_s(number):
436
437
  return "" if number == 1 else "s"
437
438
 
438
439
 
439
-
440
440
  def ets_to_element_types(ets=None):
441
441
  ser = pd.Series(["bus", "line", "trafo", "trafo3w", "impedance"],
442
442
  index=["b", "l", "t", "t3", "i"])
@@ -772,7 +772,7 @@ def _write_to_object_attribute(net, element, index, variable, values):
772
772
  def _set_isolated_nodes_out_of_service(ppc, bus_not_reachable, dc=False):
773
773
  isolated_nodes = np.where(bus_not_reachable)[0]
774
774
  if len(isolated_nodes) > 0:
775
- logger.debug("There are isolated buses in the network! (%i nodes in the PPC)"%len(isolated_nodes))
775
+ logger.debug("There are isolated buses in the network! (%i nodes in the PPC)" % len(isolated_nodes))
776
776
  # set buses in ppc out of service
777
777
  if dc:
778
778
  ppc['bus_dc'][isolated_nodes, DC_BUS_TYPE] = DC_NONE
@@ -1059,7 +1059,8 @@ def _select_is_elements_numba(net, isolated_nodes=None, isolated_nodes_dc=None,
1059
1059
  net._ppc["bus"][vsc_aux_isolated, BUS_TYPE] = NONE
1060
1060
  # if there are no in service VSC that define the DC slack node, we must change the DC slack to type P
1061
1061
  bus_dc_slack = net._ppc["bus_dc"][:, DC_BUS_TYPE] == DC_REF
1062
- bus_dc_with_vsc = np.r_[net._ppc["vsc"][is_elements["vsc"], VSC_BUS_DC], net._ppc["vsc"][is_elements["vsc"], VSC_INTERNAL_BUS_DC]]
1062
+ bus_dc_with_vsc = np.r_[
1063
+ net._ppc["vsc"][is_elements["vsc"], VSC_BUS_DC], net._ppc["vsc"][is_elements["vsc"], VSC_INTERNAL_BUS_DC]]
1063
1064
  bus_dc_to_change = bus_dc_slack & (~np.isin(net._ppc["bus_dc"][:, DC_BUS_I], bus_dc_with_vsc))
1064
1065
  net._ppc["bus_dc"][bus_dc_to_change, DC_BUS_TYPE] = DC_P
1065
1066
 
@@ -1245,11 +1246,12 @@ def _set_isolated_buses_out_of_service(net, ppc):
1245
1246
  # first check if buses are connected to branches
1246
1247
  # I don't know why this dance with [X, :][:, [Y, Z]] (instead of [X, [Y, Z]]) is necessary:
1247
1248
  disco = np.setxor1d(ppc["bus"][:, BUS_I].astype(np.int64),
1248
- ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS,T_BUS]].real.astype(np.int64).flatten())
1249
+ ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS, T_BUS]].real.astype(
1250
+ np.int64).flatten())
1249
1251
 
1250
1252
  # but also check if they may be the only connection to an ext_grid
1251
1253
  net._isolated_buses = np.setdiff1d(disco, ppc['bus'][ppc['bus'][:, BUS_TYPE] == REF,
1252
- BUS_I].real.astype(np.int64))
1254
+ BUS_I].real.astype(np.int64))
1253
1255
  ppc["bus"][net._isolated_buses, BUS_TYPE] = NONE
1254
1256
 
1255
1257
  # check DC buses - not connected to DC lines and not connected to VSC DC side
@@ -1260,7 +1262,7 @@ def _set_isolated_buses_out_of_service(net, ppc):
1260
1262
 
1261
1263
  # but also check if they may be the only connection to an ext_grid
1262
1264
  net._isolated_buses_dc = np.setdiff1d(disco_dc, ppc['bus_dc'][ppc['bus_dc'][:, DC_BUS_TYPE] == REF,
1263
- DC_BUS_I].real.astype(np.int64))
1265
+ DC_BUS_I].real.astype(np.int64))
1264
1266
  ppc["bus_dc"][net._isolated_buses_dc, DC_BUS_TYPE] = DC_NONE
1265
1267
 
1266
1268
 
@@ -1283,9 +1285,8 @@ def _check_if_numba_is_installed(level="warning"):
1283
1285
  return NUMBA_INSTALLED
1284
1286
 
1285
1287
 
1286
-
1287
1288
  def _check_lightsim2grid_compatibility(net, lightsim2grid, voltage_depend_loads, algorithm, distributed_slack, tdpf):
1288
- """
1289
+ r"""
1289
1290
  Implement some checks to decide whether the package lightsim2grid can be used. These checks are
1290
1291
  documentated in :code:`doc\powerflow\ac.rst` The package implements a backend for power flow
1291
1292
  calculation in C++ and provides a speed-up. If lightsim2grid
@@ -1839,7 +1840,6 @@ def _init_rundcopp_options(net, check_connectivity, switch_rx_ratio, delta, traf
1839
1840
 
1840
1841
  def _init_runse_options(net, v_start, delta_start, calculate_voltage_angles,
1841
1842
  **kwargs):
1842
-
1843
1843
  check_connectivity = kwargs.get("check_connectivity", True)
1844
1844
  trafo_model = kwargs.get("trafo_model", "t")
1845
1845
  trafo3w_losses = kwargs.get("trafo3w_losses", "hv")
@@ -1852,7 +1852,7 @@ def _init_runse_options(net, v_start, delta_start, calculate_voltage_angles,
1852
1852
  init_va_degree=delta_start, enforce_q_lims=False, recycle=None,
1853
1853
  voltage_depend_loads=False, trafo3w_losses=trafo3w_losses)
1854
1854
  _add_pf_options(net, tolerance_mva="1e-8", trafo_loading="power",
1855
- numba=False, ac=True, algorithm="nr", max_iteration="auto",
1855
+ numba=True, ac=True, algorithm="nr", max_iteration="auto",
1856
1856
  only_v_results=False)
1857
1857
 
1858
1858
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
3
+ # Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
4
4
  # and Energy System Technology (IEE), Kassel. All rights reserved.
5
5
  # Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
6
6
 
@@ -614,13 +614,14 @@ def _calc_tap_from_dataframe(net, trafo_df):
614
614
  if f'tap{t}_dependency_table' in trafo_df:
615
615
  tap_dependency_table = get_trafo_values(trafo_df, "tap_dependency_table")
616
616
  tap_dependency_table = np.array(
617
- [False if isinstance(x, float) and np.isnan(x) else x for x in tap_dependency_table])
617
+ [False if isinstance(x, float) and np.isnan(x) or x is None else x for x in
618
+ tap_dependency_table])
618
619
  else:
619
620
  tap_table = np.array([False])
620
621
  tap_dependency_table = np.array([False])
621
622
  # tap_changer_type = pd.Series(tap_changer_type)
622
- tap_table = np.logical_and(tap_dependency_table, np.logical_not(tap_changer_type == "None"))
623
- tap_no_table = np.logical_and(~tap_dependency_table, np.logical_not(tap_changer_type == "None"))
623
+ tap_table = np.logical_and(tap_dependency_table, tap_changer_type is not None)
624
+ tap_no_table = np.logical_and(~tap_dependency_table, tap_changer_type is not None)
624
625
  if any(tap_table):
625
626
  id_characteristic_table = get_trafo_values(trafo_df, "id_characteristic_table")
626
627
  if np.any(tap_dependency_table & pd.isna(id_characteristic_table)):
@@ -650,6 +651,17 @@ def _calc_tap_from_dataframe(net, trafo_df):
650
651
  ratio = [voltage_mapping.get(id_val, 1) for id_val in cleaned_id_characteristic]
651
652
  shift = [-shift_mapping.get(id_val, 1) for id_val in cleaned_id_characteristic]
652
653
 
654
+ if isinstance(trafo_df, dict):
655
+ # Invert ratio and shift if tap_at_star_point is true
656
+ relevant_tap_at_star_point = mask & trafo_df["tap_at_star_point"]
657
+ count_index = 0
658
+ for i in range(len(mask)):
659
+ if relevant_tap_at_star_point[i]:
660
+ ratio[count_index] = 1/ratio[count_index] # Invertieren des Wertes
661
+ shift[count_index] = -shift[count_index]
662
+ if mask[i]: # Increase index if mask[i] is True
663
+ count_index += 1
664
+
653
665
  vn[mask] = vn[mask] * ratio
654
666
  trafo_shift[mask] += shift
655
667
  if any(tap_no_table):
@@ -1386,7 +1398,8 @@ def _trafo_df_from_trafo3w(net, sequence=1):
1386
1398
  trafo2["vn_lv_kv"] = {side: t3["vn_%s_kv" % side].values for side in sides}
1387
1399
  trafo2["shift_degree"] = {"hv": np.zeros(nr_trafos), "mv": t3.shift_mv_degree.values,
1388
1400
  "lv": t3.shift_lv_degree.values}
1389
- for param in ["tap_changer_type", "tap_dependency_table", "id_characteristic_table", "tap_phase_shifter"]:
1401
+ for param in ["tap_changer_type", "tap_dependency_table", "id_characteristic_table",
1402
+ "tap_phase_shifter", "tap_at_star_point"]:
1390
1403
  if param in t3:
1391
1404
  trafo2[param] = {side: t3[param] for side in sides}
1392
1405
  trafo2["parallel"] = {side: np.ones(nr_trafos) for side in sides}
@@ -1506,7 +1519,7 @@ def _calculate_3w_tap_changers(t3, t2, sides):
1506
1519
  tap_arrays["tap_side"][side][tap_mask] = "hv" if side == "hv" else "lv"
1507
1520
 
1508
1521
  # t3 trafos with tap changer at star points
1509
- if any_at_star_point & np.any(mask_star_point := (tap_mask & at_star_point)):
1522
+ if any_at_star_point & np.any(mask_star_point := (tap_mask & at_star_point)):
1510
1523
  t = (tap_arrays["tap_step_percent"][side][mask_star_point] *
1511
1524
  np.exp(1j * np.deg2rad(tap_arrays["tap_step_degree"][side][mask_star_point])))
1512
1525
  tap_pos = tap_arrays["tap_pos"][side][mask_star_point]
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  import warnings
3
- # Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
3
+ # Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
4
4
  # and Energy System Technology (IEE), Kassel. All rights reserved.
5
5
 
6
6
 
@@ -216,7 +216,7 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
216
216
  if nr_pv_bus > 0:
217
217
  # one pv bus. Get bus from pv_buses_in_set
218
218
  ref_bus = pv_buses_in_set.pop()
219
- else:
219
+ else:
220
220
  if nr_active_bus > 0:
221
221
  # no pv bus but another active bus. Get bus from active_buses_in_set
222
222
  ref_bus = active_buses_in_set.pop()
@@ -224,11 +224,10 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
224
224
  # neither pv buses nor active buses. Use any bus in dj
225
225
  ref_bus = dj.pop()
226
226
  map_to = bus_lookup[ref_bus]
227
- for bus in dj:
228
- # update lookup
229
- bus_lookup[bus] = map_to
230
- if bus != ref_bus:
231
- merged_bus[bus] = 1
227
+ dj = list(dj)
228
+ bus_lookup[dj] = map_to
229
+ merged_bus[dj] = 1
230
+ merged_bus[ref_bus] = 0
232
231
  else:
233
232
  # no PV buses in set
234
233
  for dj in disjoint_sets:
@@ -241,11 +240,10 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
241
240
  # neither pv buses nor active busese. Use any bus in dj
242
241
  ref_bus = dj.pop()
243
242
  map_to = bus_lookup[ref_bus]
244
- for bus in dj:
245
- # update bus lookup
246
- bus_lookup[bus] = map_to
247
- if bus != ref_bus:
248
- merged_bus[bus] = 1
243
+ dj = list(dj)
244
+ bus_lookup[dj] = map_to
245
+ merged_bus[dj] = 1
246
+ merged_bus[ref_bus] = 0
249
247
  return bus_lookup, merged_bus
250
248
 
251
249
 
@@ -694,6 +692,9 @@ def _calc_shunts_and_add_on_ppc(net, ppc):
694
692
  s = net["shunt"]
695
693
  if len(s) > 0:
696
694
  vl = _is_elements["shunt"]
695
+ # fill missing vn_kv values in shunt table with rated voltage of connected bus
696
+ idx_s_vnkv_isnan = s.loc[np.isnan(s.vn_kv)].index
697
+ s.loc[idx_s_vnkv_isnan, "vn_kv"] = net.bus.loc[s.bus[idx_s_vnkv_isnan].values, "vn_kv"].values
697
698
  v_ratio = (ppc["bus"][bus_lookup[s["bus"].values], BASE_KV] / s["vn_kv"].values) ** 2 * base_multiplier
698
699
 
699
700
  if "step_dependency_table" in s:
@@ -1,10 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- # Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
3
+ # Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
4
4
  # and Energy System Technology (IEE), Kassel. All rights reserved.
5
5
 
6
6
 
7
7
  import numpy as np
8
+ import pandas as pd
8
9
 
9
10
  from pandapower.pf.ppci_variables import bustypes
10
11
  from pandapower.pypower.bustypes import bustypes_dc
@@ -17,10 +18,7 @@ from pandapower.pypower.idx_ssc import SSC_BUS, SSC_SET_VM_PU, SSC_CONTROLLABLE
17
18
  from pandapower.pypower.idx_vsc import VSC_MODE_AC, VSC_BUS, VSC_VALUE_AC, VSC_CONTROLLABLE, VSC_MODE_AC_V, \
18
19
  VSC_MODE_AC_SL
19
20
 
20
- try:
21
- import pandaplan.core.pplog as logging
22
- except ImportError:
23
- import logging
21
+ import logging
24
22
 
25
23
  logger = logging.getLogger(__name__)
26
24
 
@@ -28,7 +26,7 @@ logger = logging.getLogger(__name__)
28
26
  def _build_gen_ppc(net, ppc):
29
27
  '''
30
28
  Takes the empty ppc network and fills it with the gen values. The gen
31
- datatype will be float afterwards.
29
+ datatype will be floated afterwards.
32
30
 
33
31
  **INPUT**:
34
32
  **net** -The pandapower format network
@@ -188,7 +186,7 @@ def _enforce_controllable_vm_pu_p_mw(net, ppc, gen_is, f, t):
188
186
  controllable = net["gen"]["controllable"].values[gen_is]
189
187
  not_controllable = ~controllable.astype(bool)
190
188
 
191
- # if there are some non controllable gens -> set vm_pu and p_mw fixed
189
+ # if there are some non-controllable gens -> set vm_pu and p_mw fixed
192
190
  if np.any(not_controllable):
193
191
  bus = net["gen"]["bus"].values[not_controllable]
194
192
  vm_pu = net["gen"]["vm_pu"].values[not_controllable]
@@ -286,6 +284,11 @@ def add_q_constraints(net, element, is_element, ppc, f, t, delta, inverted=False
286
284
  else:
287
285
  ppc["gen"][f:t, QMAX] = tab["max_q_mvar"].values[is_element] + delta
288
286
 
287
+ # Add qmin and qmax limit from q_capability_curve_characteristic
288
+ if "q_capability_curve_characteristic" in net.keys() and net._options["enforce_q_lims"]:
289
+ _calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta,
290
+ inverted)
291
+
289
292
 
290
293
  def add_p_constraints(net, element, is_element, ppc, f, t, delta, inverted=False):
291
294
  tab = net[element]
@@ -400,7 +403,8 @@ def _gen_xward_mask(net, ppc):
400
403
 
401
404
 
402
405
  def _get_xward_pq_buses(net, ppc):
403
- # find the PQ and PV buses of the xwards; in build_branch.py the F_BUS is set to the PQ bus and T_BUS is set to the auxiliary PV bus
406
+ # find the PQ and PV buses of the xwards; in build_branch.py the F_BUS is set to the PQ bus and T_BUS is set to
407
+ # the auxiliary PV bus
404
408
  ft = net["_pd2ppc_lookups"].get('branch', dict()).get("xward", [])
405
409
  if len(ft) > 0:
406
410
  f, t = ft
@@ -414,14 +418,14 @@ def _get_xward_pq_buses(net, ppc):
414
418
 
415
419
 
416
420
  def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
417
- """Unitise the slack contribution factors in each island to sum to 1."""
421
+ """Unitise the slack contribution factors on each island to sum to 1."""
418
422
  subnets = _subnetworks(ppc)
419
423
  gen_buses = ppc['gen'][gen_mask, GEN_BUS].astype(np.int64)
420
424
 
421
425
  # it is possible that xward and gen are at the same bus (but not reasonable)
422
426
  if len(np.intersect1d(gen_buses, xward_pq_buses)):
423
- raise NotImplementedError("Found some of the xward PQ buses with slack weight > 0 that coincide with PV or SL buses."
424
- "This configuration is not supported.")
427
+ raise NotImplementedError("Found some of the xward PQ buses with slack weight > 0 that coincide with PV or "
428
+ "SL buses. This configuration is not supported.")
425
429
 
426
430
  gen_buses = np.r_[gen_buses, xward_pq_buses]
427
431
  slack_weights_gen = np.r_[ppc['gen'][gen_mask, SL_FAC], ppc['gen'][xward_mask, SL_FAC]].astype(np.float64)
@@ -447,11 +451,50 @@ def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
447
451
  else:
448
452
  # ppc['gen'][subnet_gen_mask, SL_FAC] /= sum_slack_weights
449
453
  slack_weights_gen /= sum_slack_weights
450
- buses, slack_weights_bus, _ = _sum_by_group(gen_buses[subnet_gen_mask], slack_weights_gen[subnet_gen_mask],
454
+ buses, slack_weights_bus, _ = _sum_by_group(gen_buses[subnet_gen_mask], slack_weights_gen[subnet_gen_mask],
451
455
  slack_weights_gen[subnet_gen_mask])
452
456
  ppc['bus'][buses, SL_FAC_BUS] = slack_weights_bus
453
457
 
454
458
  # raise NotImplementedError if there are several separate zones for distributed slack:
455
459
  if not np.isclose(sum(ppc['bus'][:, SL_FAC_BUS]), 1):
456
- raise NotImplementedError("Distributed slack calculation is not implemented for several separate zones at once, "
460
+ raise NotImplementedError("Distributed slack calculation is not implemented for several separate zones at once,"
457
461
  "please calculate the zones separately.")
462
+
463
+
464
+ def _calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta, inverted):
465
+ if element not in ["gen", "sgen"]:
466
+ logger.warning(f"The given element type is not valid for q_min and q_max reactive power capability calculation "
467
+ f"of the {element}. Please give gen or sgen as an argument of the function")
468
+ return
469
+
470
+ if len(net[element]) == 0:
471
+ logger.warning(f"No. of {element} elements is zero.")
472
+ return
473
+
474
+ # Filter rows with True 'reactive_capability_curve'
475
+ element_data = net[element].loc[net[element]['reactive_capability_curve'].fillna(False)]
476
+
477
+ if len(element_data) > 0:
478
+ # Extract the relevant data
479
+ q_table_ids = element_data['id_q_capability_curve_characteristic']
480
+ p_mw_values = element_data['p_mw']
481
+
482
+ # Retrieve the q_max and q_min characteristic functions as vectorized callables
483
+ q_max_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_max_characteristic']
484
+ q_min_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_min_characteristic']
485
+
486
+ # Vectorized function application using NumPy
487
+ calc_q_max = np.vectorize(lambda func, p: func(p))(q_max_funcs, p_mw_values)
488
+ calc_q_min = np.vectorize(lambda func, p: func(p))(q_min_funcs, p_mw_values)
489
+
490
+ if np.any(pd.isna(calc_q_min)) or np.any(pd.isna(calc_q_max)):
491
+ logger.warning(f"The reactive_capability_curve of {element} is True, but the relevant "
492
+ f"characteristic value is None. So default Q limit value has been used in the load flow.")
493
+
494
+ curve_q = net[element][["min_q_mvar", "max_q_mvar"]]
495
+ curve_q.loc[element_data.index] = np.column_stack((calc_q_min, calc_q_max))
496
+ sign = (1 - 2 * inverted)
497
+ ppc["gen"][f:t, [QMIN, QMAX]] = sign * curve_q.values[is_element] - (sign * delta)
498
+ else:
499
+ logger.warning(f"One of {element}(s) id characteristic or curve style of {element} is incorrect "
500
+ f"or not available even if the q_capability_curve_table is available.")
@@ -9,16 +9,9 @@ import pandas as pd
9
9
  import warnings
10
10
  from packaging.version import Version
11
11
 
12
- import pandapower as pp
13
-
14
- try:
15
- import pandaplan.core.pplog as logging
16
- except ImportError:
17
- import logging
12
+ import logging
18
13
 
19
14
  logger = logging.getLogger(__name__)
20
-
21
-
22
15
  try:
23
16
  import lightsim2grid
24
17
  v = Version(lightsim2grid.__version__)
@@ -41,9 +34,11 @@ try:
41
34
  except ImportError:
42
35
  KLU_solver_available = False
43
36
 
37
+ from pandapower.run import runpp
38
+
44
39
 
45
40
  def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None, write_to_net=True,
46
- contingency_evaluation_function=pp.runpp, **kwargs):
41
+ contingency_evaluation_function=runpp, **kwargs):
47
42
  """
48
43
  Obtain either loading (N-0) or max. loading (N-0 and all N-1 cases), and min/max bus voltage magnitude.
49
44
  The variable "temperature_degree_celsius" can be used in addition to "loading_percent" to obtain max. temperature.
@@ -141,7 +136,7 @@ def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None
141
136
  return contingency_results
142
137
 
143
138
 
144
- def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=pp.runpp, **kwargs):
139
+ def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=runpp, **kwargs):
145
140
  """
146
141
  Execute contingency analysis using the lightsim2grid library. This works much faster than using
147
142
  pandapower.
@@ -1,23 +1,25 @@
1
- from pandapower.auxiliary import ControllerNotConverged
2
-
3
1
  import pandapower.control.basic_controller
4
2
  import pandapower.control.controller
5
-
3
+ from pandapower.control.controller.DERController.der_control import DERController
4
+ from pandapower.control.controller.characteristic_control import CharacteristicControl
6
5
  # --- Controller ---
7
6
  from pandapower.control.controller.const_control import ConstControl
8
7
  from pandapower.control.controller.pq_control import PQController
9
- from pandapower.control.controller.characteristic_control import CharacteristicControl
8
+ from pandapower.control.controller.shunt_control import DiscreteShuntController
9
+ from pandapower.control.controller.station_control import BinarySearchControl, DroopControl
10
10
  from pandapower.control.controller.trafo.ContinuousTapControl import ContinuousTapControl
11
11
  from pandapower.control.controller.trafo.DiscreteTapControl import DiscreteTapControl
12
- from pandapower.control.controller.trafo.VmSetTapControl import VmSetTapControl
13
12
  from pandapower.control.controller.trafo.TapDependentImpedance import TapDependentImpedance
13
+ from pandapower.control.controller.trafo.VmSetTapControl import VmSetTapControl
14
14
  from pandapower.control.controller.trafo_control import TrafoController
15
- from pandapower.control.controller.station_control import BinarySearchControl, DroopControl
16
- from pandapower.control.controller.DERController.der_control import DERController
17
- from pandapower.control.controller.shunt_control import DiscreteShuntController
18
-
19
15
  # --- Other ---
20
16
  from pandapower.control.run_control import *
17
+ from pandapower.control.util.auxiliary import (
18
+ get_controller_index,
19
+ plot_characteristic,
20
+ _create_trafo_characteristics,
21
+ create_trafo_characteristic_object,
22
+ create_q_capability_curve_characteristics_object
23
+ )
21
24
  from pandapower.control.util.characteristic import Characteristic, SplineCharacteristic
22
- from pandapower.control.util.auxiliary import (plot_characteristic, _create_trafo_characteristics,
23
- create_trafo_characteristic_object)
25
+ from pandapower.control.util.diagnostic import control_diagnostic, trafo_characteristic_table_diagnostic