diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index de902fe..bf691d9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,5 +12,5 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.12.1 # must match uv.lock hooks: - - id: ruff + - id: ruff-check - id: ruff-format diff --git a/stubs/pandapower-stubs/_typing.pyi b/stubs/pandapower-stubs/_typing.pyi index 6df58b7..6581234 100644 --- a/stubs/pandapower-stubs/_typing.pyi +++ b/stubs/pandapower-stubs/_typing.pyi @@ -37,3 +37,8 @@ class SupportsGeoInterface(Protocol): def __geo_interface__(self) -> dict[str, Any]: ... # values are arbitrary ConvertibleToCRS: TypeAlias = str | int | tuple[str, str] | list[str] | dict[str, Any] | SupportsToWkt + +from pandapower.auxiliary import pandapowerNet # noqa: E402 + +class RunPPFunc(Protocol): + def __call__(self, net: pandapowerNet, *, calculate_voltage_angles: bool, **kwargs) -> object: ... diff --git a/stubs/pandapower-stubs/auxiliary.pyi b/stubs/pandapower-stubs/auxiliary.pyi index f35bee3..14b2759 100644 --- a/stubs/pandapower-stubs/auxiliary.pyi +++ b/stubs/pandapower-stubs/auxiliary.pyi @@ -9,15 +9,13 @@ import pandas as pd from numpy.typing import ArrayLike, DTypeLike, NDArray from shapely.geometry.base import BaseGeometry -from pandapower._typing import Float, Int +from pandapower._typing import Array2D, Float, Int from pandapower.std_types import _StdTypes _T = TypeVar("_T") -_KT = TypeVar("_KT") -_VT = TypeVar("_VT") def log_to_level(msg: str, passed_logger: logging.Logger, level: str) -> None: ... -def version_check(package_name: str, level="UserWarning", ignore_not_installed: bool = False) -> None: ... +def version_check(package_name: str, level: str = "UserWarning", ignore_not_installed: bool = False) -> None: ... def soft_dependency_error(fct_name: str, required_packages: str | Iterable[str]) -> NoReturn: ... def warn_and_fix_parameter_renaming( old_parameter_name: str, @@ -28,14 +26,14 @@ def warn_and_fix_parameter_renaming( **kwargs: Any, ) -> _T: ... -class ADict(dict[_KT, _VT], MutableMapping[_KT, _VT]): - def __setattr__(self, key: str, value: _VT) -> None: ... - def __delattr__(self, key: _KT, force: bool = False) -> None: ... # type: ignore[override] - def __call__(self, key: _KT) -> _VT: ... - def __getattr__(self, name: str) -> _VT: ... +class ADict(dict[str, _T], MutableMapping[str, _T]): + def __setattr__(self, key: str, value: _T) -> None: ... + def __delattr__(self, key: str, force: bool = False) -> None: ... + def __call__(self, key: str) -> _T: ... + def __getattr__(self, key: str) -> _T: ... def __deepcopy__(self, memo: dict[int, Any] | None) -> Self: ... -class pandapowerNet(ADict[str, pd.DataFrame]): +class pandapowerNet(ADict[pd.DataFrame]): # These attributes are not defined in the class body, but are added via __getitem__ bus: pd.DataFrame bus_dc: pd.DataFrame @@ -197,8 +195,8 @@ def phase_shift_unit_operator(angle_deg: Float) -> np.complex128: ... a: Final[np.complex128] asq: Final[np.complex128] -Tabc: Final[np.ndarray[tuple[int, int], np.dtype[np.complex128]]] -T012: Final[np.ndarray[tuple[int, int], np.dtype[np.complex128]]] +Tabc: Final[Array2D[np.complex128]] +T012: Final[Array2D[np.complex128]] def sequence_to_phase(X012: ArrayLike) -> NDArray[np.complex128]: ... def phase_to_sequence(Xabc: ArrayLike) -> NDArray[np.complex128]: ... diff --git a/stubs/pandapower-stubs/build_bus.pyi b/stubs/pandapower-stubs/build_bus.pyi index a101021..3e48bee 100644 --- a/stubs/pandapower-stubs/build_bus.pyi +++ b/stubs/pandapower-stubs/build_bus.pyi @@ -1,28 +1,48 @@ from _typeshed import Incomplete -from typing import TypeVar +from collections.abc import Collection +from typing import Literal, TypeVar import numpy as np from numpy.typing import NDArray +from pandapower._typing import Array1D, Bool, Float, Int, ScalarOrVector from pandapower.auxiliary import pandapowerNet _T = TypeVar("_T") def ds_find(ar, bus): ... -def ds_union(ar, bus1, bus2, bus_is_pv) -> None: ... -def ds_create(ar, switch_bus, switch_elm, switch_et_bus, switch_closed, switch_z_ohm, bus_is_pv, bus_in_service) -> None: ... -def fill_bus_lookup(ar, bus_lookup, bus_index) -> None: ... -def create_bus_lookup_numba(net: pandapowerNet, bus_index, bus_is_idx, gen_is_mask, eg_is_mask) -> NDArray[np.int_]: ... +def ds_union(ar, bus1: Int, bus2: Int, bus_is_pv, bus_is_active, merged_bus) -> None: ... +def ds_create( + ar, + switch_bus: Collection[Int], + switch_elm: Collection[Int], + switch_et_bus: Collection[Int], + switch_closed: Collection[Bool], + switch_z_ohm: Collection[Float], + bus_is_pv, + bus_is_active, + bus_in_service, + merged_bus, +) -> None: ... +def fill_bus_lookup(ar, bus_lookup, bus_index: Collection[Int]) -> None: ... +def create_bus_lookup_numba( + net: pandapowerNet, bus_index: Collection[Int], bus_is_idx: ScalarOrVector[Int] +) -> tuple[Array1D[np.int64], Array1D[np.bool]]: ... class DisjointSet(dict[_T, _T]): def add(self, item: _T) -> None: ... def find(self, item: _T) -> _T: ... def union(self, item1: _T, item2: _T) -> None: ... -def create_consecutive_bus_lookup(net: pandapowerNet, bus_index): ... +def create_consecutive_bus_lookup(net: pandapowerNet, bus_index: Collection[Int]) -> Array1D[np.int64]: ... def create_bus_lookup_numpy( - net: pandapowerNet, bus_index, bus_is_idx, gen_is_mask, eg_is_mask, closed_bb_switch_mask -) -> NDArray[np.int_]: ... -def create_bus_lookup(net: pandapowerNet, bus_index, bus_is_idx, gen_is_mask, eg_is_mask, numba: bool) -> NDArray[np.int_]: ... -def get_voltage_init_vector(net: pandapowerNet, init_v, mode, sequence: Incomplete | None = None): ... -def set_reference_buses(net: pandapowerNet, ppc, bus_lookup, mode) -> None: ... + net: pandapowerNet, bus_index: Collection[Int], closed_bb_switch_mask: NDArray[np.bool] +) -> tuple[Array1D[np.int64], Array1D[np.bool]]: ... +def create_bus_lookup( + net: pandapowerNet, bus_index: Collection[Int], bus_is_idx: ScalarOrVector[Int], numba: Bool +) -> tuple[Array1D[np.int64], Array1D[np.bool]]: ... +def get_voltage_init_vector( + net: pandapowerNet, init_v, mode: Literal["magnitude", "angle"], sequence: Incomplete | None = None +): ... +def set_reference_buses(net: pandapowerNet, ppc, bus_lookup, mode: str) -> None: ... +def set_reference_buses_dc(net: pandapowerNet, ppc, bus_lookup, mode: str) -> None: ... diff --git a/stubs/pandapower-stubs/grid_equivalents/auxiliary.pyi b/stubs/pandapower-stubs/grid_equivalents/auxiliary.pyi index fd9606c..351bd97 100644 --- a/stubs/pandapower-stubs/grid_equivalents/auxiliary.pyi +++ b/stubs/pandapower-stubs/grid_equivalents/auxiliary.pyi @@ -1,27 +1,40 @@ -from _typeshed import Incomplete +from _typeshed import SupportsGetItem +from collections.abc import Collection, Iterable +from typing import TypeVar -home: Incomplete -desktop: Incomplete +import pandas as pd + +from pandapower._typing import Bool, Int, RunPPFunc +from pandapower.auxiliary import pandapowerNet + +_S = TypeVar("_S", tuple[Int, ...], list[Int]) + +impedance_columns: list[str] def add_ext_grids_to_boundaries( - net, - boundary_buses, - adapt_va_degree: bool = False, - runpp_fct=..., - calc_volt_angles: bool = True, - allow_net_change_for_convergence: bool = False, + net: pandapowerNet, + boundary_buses: Iterable[Int], + adapt_va_degree: Bool = False, + runpp_fct: RunPPFunc = ..., + calc_volt_angles: Bool = True, + allow_net_change_for_convergence: Bool = False, +) -> pd.Index[int]: ... +def drop_internal_branch_elements( + net: pandapowerNet, internal_buses: Collection[Int], branch_elements: Iterable[Int] | None = None +) -> None: ... +def calc_zpbn_parameters( + net: pandapowerNet, boundary_buses: _S, all_external_buses: _S, slack_as: str = "gen", existing_shift_degree: Bool = False +) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]: ... +def drop_assist_elms_by_creating_ext_net(net: pandapowerNet, elms: Iterable[str] | None = None) -> None: ... +def build_ppc_and_Ybus(net: pandapowerNet) -> None: ... +def drop_measurements_and_controllers(net: pandapowerNet, buses: Collection[Int], skip_controller: Bool = False) -> None: ... +def ensure_origin_id(net: pandapowerNet, elms: Iterable[str] | None = None) -> None: ... +def drop_and_edit_cost_functions( + net: pandapowerNet, buses: Collection[Int], drop_cost: Bool, add_origin_id: Bool, check_unique_elms_name: Bool = True ) -> None: ... -def drop_internal_branch_elements(net, internal_buses, branch_elements: Incomplete | None = None) -> None: ... -def calc_zpbn_parameters(net, boundary_buses, all_external_buses, slack_as: str = "gen", existing_shift_degree: bool = False): ... -def check_validity_of_Ybus_eq(net_zpbn, Ybus_eq, bus_lookups): ... -def drop_assist_elms_by_creating_ext_net(net, elms: Incomplete | None = None) -> None: ... -def build_ppc_and_Ybus(net) -> None: ... -def drop_measurements_and_controller(net, buses, skip_controller: bool = False) -> None: ... -def match_controller_and_new_elements(net, net_org) -> None: ... -def ensure_origin_id(net, no_start: int = 0, elms: Incomplete | None = None) -> None: ... -def drop_and_edit_cost_functions(net, buses, drop_cost, add_origin_id, check_unique_elms_name: bool = True) -> None: ... -def match_cost_functions_and_eq_net(net, boundary_buses, eq_type) -> None: ... -def check_network(net) -> None: ... -def get_boundary_vp(net_eq, bus_lookups): ... -def adaptation_phase_shifter(net, v_boundary, p_boundary): ... -def replace_motor_by_load(net, all_external_buses) -> None: ... +def match_cost_functions_and_eq_net(net: pandapowerNet, boundary_buses: Iterable[Int], eq_type: str) -> None: ... +def get_boundary_vp( + net_eq: pandapowerNet, bus_lookups: SupportsGetItem[str, SupportsGetItem[str, Collection[Int]]] +) -> tuple[pd.DataFrame, pd.DataFrame]: ... +def adaptation_phase_shifter(net: pandapowerNet, v_boundary: pd.DataFrame, p_boundary: pd.DataFrame) -> pandapowerNet: ... +def replace_motor_by_load(net: pandapowerNet, all_external_buses: Collection[Int]) -> None: ... diff --git a/stubs/pandapower-stubs/grid_equivalents/get_equivalent.pyi b/stubs/pandapower-stubs/grid_equivalents/get_equivalent.pyi index 0151754..559bcd1 100644 --- a/stubs/pandapower-stubs/grid_equivalents/get_equivalent.pyi +++ b/stubs/pandapower-stubs/grid_equivalents/get_equivalent.pyi @@ -1,18 +1,24 @@ +from collections.abc import Collection +from typing import Literal + +from pandapower._typing import Bool, Int, RunPPFunc +from pandapower.auxiliary import pandapowerNet + def get_equivalent( - net, - eq_type, - boundary_buses, - internal_buses, - return_internal: bool = True, - show_computing_time: bool = False, + net: pandapowerNet, + eq_type: Literal["rei", "ward", "xward"], + boundary_buses: Collection[Int], + internal_buses: Collection[Int], + return_internal: Bool = True, + show_computing_time: Bool = False, ward_type: str = "ward_injection", - adapt_va_degree: bool = False, - calculate_voltage_angles: bool = True, - allow_net_change_for_convergence: bool = False, - runpp_fct=..., + adapt_va_degree: Bool = False, + calculate_voltage_angles: Bool = True, + allow_net_change_for_convergence: Bool = False, + runpp_fct: RunPPFunc = ..., **kwargs, -): ... +) -> pandapowerNet | None: ... def merge_internal_net_and_equivalent_external_net( - net_eq, net_internal, eq_type, show_computing_time: bool = False, calc_volt_angles: bool = False, **kwargs -): ... -def drop_repeated_characteristic(net) -> None: ... + net_eq: pandapowerNet, net_internal: pandapowerNet, fuse_bus_column: str = "auto", show_computing_time: bool = False, **kwargs +) -> pandapowerNet: ... +def drop_repeated_characteristic(net: pandapowerNet) -> None: ... diff --git a/stubs/pandapower-stubs/grid_equivalents/rei_generation.pyi b/stubs/pandapower-stubs/grid_equivalents/rei_generation.pyi index eb86c82..c8a1b64 100644 --- a/stubs/pandapower-stubs/grid_equivalents/rei_generation.pyi +++ b/stubs/pandapower-stubs/grid_equivalents/rei_generation.pyi @@ -1 +1,12 @@ -def adapt_impedance_params(Z, sign: int = 1, adaption: float = 1e-15): ... +from typing import TypeVar, overload + +import numpy as np + +_S = TypeVar("_S", bound=tuple[int, ...]) + +@overload +def adapt_impedance_params(Z: complex, sign: int = 1, adaption: float = 1e-15) -> float: ... +@overload +def adapt_impedance_params( + Z: np.ndarray[_S, np.dtype[np.complexfloating]], sign: int = 1, adaption: float = 1e-15 +) -> np.ndarray[_S, np.dtype[np.float64]]: ... diff --git a/stubs/pandapower-stubs/grid_equivalents/toolbox.pyi b/stubs/pandapower-stubs/grid_equivalents/toolbox.pyi index 9abab98..31baf87 100644 --- a/stubs/pandapower-stubs/grid_equivalents/toolbox.pyi +++ b/stubs/pandapower-stubs/grid_equivalents/toolbox.pyi @@ -1,8 +1,18 @@ +from _typeshed import SupportsKeysAndGetItem +from collections.abc import Collection, Iterable + +from pandapower._typing import Int +from pandapower.auxiliary import pandapowerNet + def getFromDict(dict_, keys): ... def setInDict(dict_, keys, value) -> None: ... def appendSetInDict(dict_, keys, set_) -> None: ... def setSetInDict(dict_, keys, set_) -> None: ... def append_set_to_dict(dict_, set_, keys) -> None: ... -def set_bus_zone_by_boundary_branches(net, all_boundary_branches) -> None: ... -def get_boundaries_by_bus_zone_with_boundary_branches(net): ... -def get_connected_switch_buses_groups(net, buses): ... +def set_bus_zone_by_boundary_branches( + net: pandapowerNet, all_boundary_branches: SupportsKeysAndGetItem[str, Collection[Int]] +) -> None: ... +def get_boundaries_by_bus_zone_with_boundary_branches( + net: pandapowerNet, +) -> tuple[dict[str, dict[str, set[int]]], dict[str, dict[str, set[int]]]]: ... +def get_connected_switch_buses_groups(net: pandapowerNet, buses: Iterable[Int]) -> tuple[set[int], list[list[int]]]: ... diff --git a/stubs/pandapower-stubs/grid_equivalents/ward_generation.pyi b/stubs/pandapower-stubs/grid_equivalents/ward_generation.pyi index 0b48f05..49b4311 100644 --- a/stubs/pandapower-stubs/grid_equivalents/ward_generation.pyi +++ b/stubs/pandapower-stubs/grid_equivalents/ward_generation.pyi @@ -1,4 +1,13 @@ -def create_passive_external_net_for_ward_addmittance( - net, all_external_buses, boundary_buses, calc_volt_angles: bool = ..., runpp_fct=... +from collections.abc import Collection + +from pandapower._typing import Bool, Int, RunPPFunc +from pandapower.auxiliary import pandapowerNet + +def create_passive_external_net_for_ward_admittance( + net: pandapowerNet, + all_external_buses: Collection[Int], + boundary_buses: Collection[Int] | object, # not used! + calc_volt_angles: Bool = True, + runpp_fct: RunPPFunc = ..., + **kwargs, ) -> None: ... -def get_ppc_buses(net, buses, nogo_buses): ... diff --git a/stubs/pandapower-stubs/io_utils.pyi b/stubs/pandapower-stubs/io_utils.pyi index 5c1462b..081b110 100644 --- a/stubs/pandapower-stubs/io_utils.pyi +++ b/stubs/pandapower-stubs/io_utils.pyi @@ -126,7 +126,7 @@ class JSONSerializableClass: overwrite: bool = False, preserve_dtypes: bool = False, fill_dict: dict[str, Any] | None = None, - ) -> int: ... + ) -> np.int64: ... def equals(self, other: object) -> bool: ... @classmethod def from_dict(cls, d: dict[str, object]) -> Self: ... diff --git a/stubs/pandapower-stubs/pf/create_jacobian_facts.pyi b/stubs/pandapower-stubs/pf/create_jacobian_facts.pyi new file mode 100644 index 0000000..871b8de --- /dev/null +++ b/stubs/pandapower-stubs/pf/create_jacobian_facts.pyi @@ -0,0 +1,18 @@ +from typing import Final + +from scipy.sparse import csr_array, csr_matrix # type: ignore[import-untyped] + +SMALL_NUMBER: Final = 1e-9 + +def create_J_modification_svc( + J, svc_buses, pvpq, pq, pq_lookup, Vm, x_control, svc_x_l_pu, svc_x_cvar_pu, nsvc_controllable, svc_controllable +) -> csr_matrix: ... +def create_J_modification_tcsc( + J, V, y_tcsc_pu, x_control, tcsc_controllable, tcsc_x_l_pu, f, t, pvpq, pq, pvpq_lookup, pq_lookup, nsvc +) -> csr_matrix: ... +def create_J_modification_ssc_vsc( + J, V, Vm, y_pu, f, t, pvpq, pq, pvpq_lookup, pq_lookup, control_v, control_delta +) -> csr_matrix: ... +def create_J_modification_hvdc( + J, V_dc, Ybus_hvdc, Ybus_vsc_dc, vsc_g_pu, vsc_gl_pu, dc_p, dc_p_lookup, vsc_dc_fb, vsc_dc_tb, vsc_dc_slack, vsc_dc_mode_p +) -> csr_array: ... diff --git a/stubs/pandapower-stubs/pf/dSbus_dV_numba.pyi b/stubs/pandapower-stubs/pf/dSbus_dV_numba.pyi index cbb7d27..e674cc2 100644 --- a/stubs/pandapower-stubs/pf/dSbus_dV_numba.pyi +++ b/stubs/pandapower-stubs/pf/dSbus_dV_numba.pyi @@ -1,4 +1,6 @@ -from _typeshed import Incomplete +from typing import TypeVar -def dSbus_dV_numba_sparse(Yx, Yp, Yj, V, Vnorm, Ibus): ... -def dSbus_dV(Ybus, V, I: Incomplete | None = None): ... +_YxT = TypeVar("_YxT") # probably bound to ndarray + +def dSbus_dV_numba_sparse(Yx: _YxT, Yp, Yj, V, Vnorm, Ibus) -> tuple[_YxT, _YxT]: ... +def dSbus_dV(Ybus, V, I=None): ... diff --git a/stubs/pandapower-stubs/pf/makeYbus_facts.pyi b/stubs/pandapower-stubs/pf/makeYbus_facts.pyi new file mode 100644 index 0000000..f4743ee --- /dev/null +++ b/stubs/pandapower-stubs/pf/makeYbus_facts.pyi @@ -0,0 +1,12 @@ +from scipy.sparse import csr_matrix # type: ignore[import-untyped] + +from pandapower._typing import Float, Int + +def calc_y_svc(x_control_degree, svc_x_l_ohm, svc_x_cvar_ohm, v_base_kv, baseMVA: Float): ... +def calc_y_svc_pu(x_control, svc_x_l_pu, svc_x_cvar_pu): ... +def makeYbus_svc(Ybus, x_control_svc, svc_x_l_pu, svc_x_cvar_pu, svc_buses) -> csr_matrix: ... +def makeYbus_tcsc(Ybus, x_control_tcsc, tcsc_x_l_pu, tcsc_x_cvar_pu, tcsc_fb, tcsc_tb) -> csr_matrix: ... +def makeYft_tcsc(Ybus_tcsc, tcsc_fb, tcsc_tb, x_control_tcsc, tcsc_x_l_pu, tcsc_x_cvar_pu) -> tuple[csr_matrix, csr_matrix]: ... +def makeYbus_ssc_vsc(Ybus, internal_y_pu, fb, tb, controllable) -> tuple[csr_matrix, csr_matrix, csr_matrix]: ... +def make_Ybus_facts(from_bus, to_bus, y_pu, n: Int, ysf_pu=0, yst_pu=0, dtype=...) -> csr_matrix: ... +def make_Yft_facts(from_bus, to_bus, y_pu, n: Int, ysf_pu=0, yst_pu=0) -> tuple[csr_matrix, csr_matrix]: ... diff --git a/stubs/pandapower-stubs/pf/makeYbus_numba.pyi b/stubs/pandapower-stubs/pf/makeYbus_numba.pyi index cc6501a..e803164 100644 --- a/stubs/pandapower-stubs/pf/makeYbus_numba.pyi +++ b/stubs/pandapower-stubs/pf/makeYbus_numba.pyi @@ -1,2 +1,9 @@ -def gen_Ybus(Yf_x, Yt_x, Ysh, col_Y, f, t, f_sort, t_sort, nb, nl, r_nl): ... -def makeYbus(baseMVA, bus, branch): ... +import numpy as np +from scipy.sparse import csr_array, csr_matrix # type: ignore[import-untyped] + +from pandapower._typing import Array1D, Float, Int + +def gen_Ybus( + Yf_x, Yt_x, Ysh, col_Y, f, t, f_sort, t_sort, nb: Int, nl: Int, r_nl +) -> tuple[Array1D[np.complex128], Array1D[np.int64], Array1D[np.int64], int]: ... +def makeYbus(baseMVA: Float, bus, branch) -> tuple[csr_matrix, csr_array, csr_array]: ... diff --git a/stubs/pandapower-stubs/pf/pfsoln_numba.pyi b/stubs/pandapower-stubs/pf/pfsoln_numba.pyi index 1f31216..1d80613 100644 --- a/stubs/pandapower-stubs/pf/pfsoln_numba.pyi +++ b/stubs/pandapower-stubs/pf/pfsoln_numba.pyi @@ -1,34 +1,52 @@ -from _typeshed import Incomplete +from typing import TypeVar -EPS: Incomplete +import numpy as np + +from pandapower._typing import Array1D, Array2D, Float, Int + +EPS: np.float64 + +_BusT = TypeVar("_BusT") # probably bound to ndarray +_GenT = TypeVar("_GenT") # probably bound to ndarray +_BranchT = TypeVar("_BranchT") # probably bound to ndarray def pfsoln( - baseMVA, - bus, - gen, - branch, + baseMVA: Float, + bus: _BusT, + gen: _GenT, + branch: _BranchT, + svc, + tcsc, + ssc, + vsc, Ybus, Yf, Yt, V, ref, ref_gens, - Ibus: Incomplete | None = None, - limited_gens: Incomplete | None = None, -): ... + Ibus=None, + limited_gens=None, +) -> tuple[_BusT, _GenT, _BranchT]: ... def pf_solution_single_slack( - baseMVA, - bus, - gen, - branch, + baseMVA: Float, + bus: _BusT, + gen: _GenT, + branch: _BranchT, + svc, + tcsc, + ssc, + vsc, Ybus, Yf, Yt, V, ref, ref_gens, - Ibus: Incomplete | None = None, - limited_gens: Incomplete | None = None, -): ... -def calc_branch_flows(Yy_x, Yy_p, Yy_j, v, baseMVA, dim_x, bus_ind): ... -def calc_branch_flows_batch(Yy_x, Yy_p, Yy_j, V, baseMVA, dim_x, bus_ind, base_kv): ... + Ibus=None, + limited_gens=None, +) -> tuple[_BusT, _GenT, _BranchT]: ... +def calc_branch_flows(Yy_x, Yy_p, Yy_j, v, baseMVA: Float, dim_x: Int, bus_ind) -> Array1D[np.complex128]: ... +def calc_branch_flows_batch( + Yy_x, Yy_p, Yy_j, V, baseMVA: Float, dim_x: Int, bus_ind, base_kv +) -> tuple[Array2D[np.complex128], Array2D[np.float64], Array2D[np.float64]]: ... diff --git a/stubs/pandapower-stubs/pf/runpp_3ph.pyi b/stubs/pandapower-stubs/pf/runpp_3ph.pyi index 7c0f54c..12bc5e9 100644 --- a/stubs/pandapower-stubs/pf/runpp_3ph.pyi +++ b/stubs/pandapower-stubs/pf/runpp_3ph.pyi @@ -1,21 +1,22 @@ -from pandapower.auxiliary import pandapowerNet, ppException +from typing import Literal -class Not_implemented(ppException): ... +from pandapower._typing import Float, Int +from pandapower.auxiliary import pandapowerNet def runpp_3ph( net: pandapowerNet, calculate_voltage_angles: bool = True, - init: str = "auto", - max_iteration: str = "auto", - tolerance_mva: float = 1e-08, - trafo_model: str = "t", - trafo_loading: str = "current", + init: Literal["auto", "flat", "dc", "results"] = "auto", + max_iteration: Int | Literal["auto"] = "auto", + tolerance_mva: Float = 1e-08, + trafo_model: Literal["t", "pi"] = "t", # "pi" is not supported in 3ph + trafo_loading: Literal["current", "power"] = "current", enforce_q_lims: bool = False, numba: bool = True, recycle: dict[str, bool] | None = None, check_connectivity: bool = True, - switch_rx_ratio: float = 2.0, - delta_q: float = 0, + switch_rx_ratio: Float = 2.0, + delta_q: Float = 0, v_debug: bool = False, **kwargs, ) -> None: ... diff --git a/stubs/pandapower-stubs/protection/__init__.pyi b/stubs/pandapower-stubs/protection/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/stubs/pandapower-stubs/protection/basic_protection_device.pyi b/stubs/pandapower-stubs/protection/basic_protection_device.pyi new file mode 100644 index 0000000..2a2c37c --- /dev/null +++ b/stubs/pandapower-stubs/protection/basic_protection_device.pyi @@ -0,0 +1,14 @@ +import numpy as np + +from pandapower._typing import Int +from pandapower.auxiliary import pandapowerNet +from pandapower.io_utils import JSONSerializableClass + +class ProtectionDevice(JSONSerializableClass): + index: np.int64 + def __init__( + self, net: pandapowerNet, index: Int | None = None, in_service: bool = True, overwrite: bool = False, **kwargs + ) -> None: ... + def reset_device(self): ... + def has_tripped(self) -> bool: ... + def protection_function(self, net: pandapowerNet, scenario): ... diff --git a/stubs/pandapower-stubs/protection/example_grids.pyi b/stubs/pandapower-stubs/protection/example_grids.pyi new file mode 100644 index 0000000..0e393eb --- /dev/null +++ b/stubs/pandapower-stubs/protection/example_grids.pyi @@ -0,0 +1,6 @@ +from pandapower.auxiliary import pandapowerNet + +def three_radial_bus_net() -> pandapowerNet: ... +def dtoc_relay_net(open_loop: bool = True) -> pandapowerNet: ... +def idmt_relay_net(open_loop: bool = True) -> pandapowerNet: ... +def idtoc_relay_net(open_loop: bool = True) -> pandapowerNet: ... diff --git a/stubs/pandapower-stubs/protection/protection_devices/__init__.pyi b/stubs/pandapower-stubs/protection/protection_devices/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/stubs/pandapower-stubs/protection/protection_devices/fuse.pyi b/stubs/pandapower-stubs/protection/protection_devices/fuse.pyi new file mode 100644 index 0000000..c74446d --- /dev/null +++ b/stubs/pandapower-stubs/protection/protection_devices/fuse.pyi @@ -0,0 +1,45 @@ +from typing import Any, Literal + +from pandapower._typing import Bool, Float, Int +from pandapower.auxiliary import pandapowerNet +from pandapower.protection.basic_protection_device import ProtectionDevice + +class Fuse(ProtectionDevice): + switch_index: Int + fuse_type: str + in_service: bool + name: str + rated_i_a: float + characteristic_index: int + i_start_a: float | None = None + i_stop_a: float | None = None + activation_parameter: str + tripped: bool + z_ohm: float + def __init__( + self, + net: pandapowerNet, + switch_index: Int, + fuse_type: str = "none", + rated_i_a: Float = 0, + characteristic_index: Int | None = None, + in_service: Bool = True, + overwrite: Bool = False, + curve_select: Int = 0, + z_ohm: Float = 0.0001, + name: str | None = None, + **kwargs, + ) -> None: ... + def create_characteristic(self, net, x_values, y_values, interpolator_kind="Pchip", **kwargs) -> None: ... + def reset_device(self) -> None: ... + def has_tripped(self) -> bool: ... + def status_to_net(self, net: pandapowerNet) -> None: ... + def protection_function(self, net: pandapowerNet, scenario: Literal["sc", "pp"] = "sc") -> dict[str, Any]: ... + def plot_protection_characteristic( + self, + net: pandapowerNet, + num: Int = 35, + xlabel: str = "I [A]", + ylabel: str = "time [s]", + title: str = "Time-Current Characteristic of Fuse", + ) -> None: ... diff --git a/stubs/pandapower-stubs/protection/protection_devices/ocrelay.pyi b/stubs/pandapower-stubs/protection/protection_devices/ocrelay.pyi new file mode 100644 index 0000000..b799038 --- /dev/null +++ b/stubs/pandapower-stubs/protection/protection_devices/ocrelay.pyi @@ -0,0 +1,68 @@ +from _typeshed import Incomplete +from typing import Any, Literal + +import pandas as pd + +from pandapower._typing import Bool, Float, Int +from pandapower.auxiliary import pandapowerNet +from pandapower.protection.basic_protection_device import ProtectionDevice + +class OCRelay(ProtectionDevice): + switch_index: Incomplete + oc_relay_type: Incomplete + time_settings: Incomplete + overload_factor: Incomplete + ct_current_factor: Incomplete + safety_factor: Incomplete + inverse_overload_factor: Incomplete + pickup_current_manual: Incomplete + sc_fraction: Incomplete + curve_type: Incomplete + kwargs: Incomplete + + activation_parameter: Incomplete + tripped: Incomplete + I_g: Incomplete + I_gg: Incomplete + I_s: Incomplete + time_grading: Incomplete + t_g: Incomplete + t_gg: Incomplete + t_grade: Incomplete + tms: Incomplete + def __init__( + self, + net: pandapowerNet, + switch_index: Int, + oc_relay_type: str, + time_settings, + overload_factor: Float = 1.2, + ct_current_factor: Float = 1.25, + safety_factor: Float = 1, + inverse_overload_factor: Float = 1.2, + pickup_current_manual: pd.DataFrame | None = None, + in_service: Bool = True, + overwrite: Bool = True, + sc_fraction: Float = 0.95, + curve_type: str = "standard_inverse", + **kwargs, + ) -> None: ... + def create_protection_function(self, net: pandapowerNet) -> None: ... + def reset_device(self) -> None: ... + def has_tripped(self) -> bool: ... + def status_to_net(self, net: pandapowerNet) -> None: ... + def protection_function(self, net: pandapowerNet, scenario: Literal["sc", "pp"]) -> dict[str, Any]: ... + def plot_protection_characteristic( + self, + net: pandapowerNet, + num: Int = 60, + xlabel: str = "I [A]", + ylabel: str = "time [s]", + xmin: Float = 10, + xmax: Float = 10000, + ymin: Float = 0.01, + ymax: Float = 10000, + title: str = "Time-Current Characteristic of OC Relay ", + ) -> None: ... + +def time_grading(net: pandapowerNet, time_settings) -> pd.DataFrame: ... diff --git a/stubs/pandapower-stubs/protection/run_protection.pyi b/stubs/pandapower-stubs/protection/run_protection.pyi new file mode 100644 index 0000000..ef091d2 --- /dev/null +++ b/stubs/pandapower-stubs/protection/run_protection.pyi @@ -0,0 +1,7 @@ +from typing import Literal + +import pandas as pd + +from pandapower.auxiliary import pandapowerNet + +def calculate_protection_times(net: pandapowerNet, scenario: Literal["pp", "sc"] = "sc") -> pd.DataFrame: ... diff --git a/stubs/pandapower-stubs/protection/utility_functions.pyi b/stubs/pandapower-stubs/protection/utility_functions.pyi new file mode 100644 index 0000000..d2ff1a2 --- /dev/null +++ b/stubs/pandapower-stubs/protection/utility_functions.pyi @@ -0,0 +1,57 @@ +from _typeshed import Incomplete +from collections.abc import Collection, Iterable +from typing import Any, TypeVar +from typing_extensions import deprecated + +import numpy as np +import pandas as pd +from matplotlib.collections import PatchCollection + +from pandapower._typing import Float, Int, ScalarOrVector +from pandapower.auxiliary import pandapowerNet + +_I = TypeVar("_I", bound=Int) + +def create_sc_bus(net_copy: pandapowerNet, sc_line_id: ScalarOrVector[Int], sc_fraction: Float) -> pandapowerNet: ... +def calc_faults_at_full_line( + net: pandapowerNet, + line: Int, + location_step_size: Float = 0.01, + start_location=0.01, + end_location: Float = 1, + sc_case: str = "min", +) -> list[float]: ... +def get_opposite_side_bus_from_switch(net: pandapowerNet, switch_id: Int) -> np.int64: ... +def get_opposite_side_bus_from_bus_line(net: pandapowerNet, bus_idx: Int, line_idx: Int) -> np.int64: ... +def get_from_bus_info_switch(net: pandapowerNet, switch_id: Int) -> bool: ... +def get_from_bus_info_bus_line(net: pandapowerNet, bus_idx: Int, line_idx: Int) -> bool: ... +def get_line_impedance(net: pandapowerNet, line_idx: Int) -> complex: ... +def get_lowest_impedance_line(net: pandapowerNet, lines: Iterable[_I]) -> _I: ... +def check_for_closed_bus_switches(net_copy: pandapowerNet) -> pandapowerNet: ... +def fuse_bus_switches(net: pandapowerNet, bus_switches: pd.Series[Any] | pd.DataFrame) -> pandapowerNet: ... +def get_fault_annotation(net: pandapowerNet, fault_current: Float = 0.0, font_size_bus: Float = 0.06) -> PatchCollection: ... +def get_sc_location_annotation(net: pandapowerNet, sc_location: Float, font_size_bus: Float = 0.06) -> PatchCollection: ... +def plot_tripped_grid(net: pandapowerNet, trip_decisions, sc_location, bus_size=0.055, plot_annotations: bool = True) -> None: ... +def plot_tripped_grid_protection_device( + net: pandapowerNet, trip_decisions, sc_location, sc_bus, bus_size=0.055, plot_annotations: bool = True +) -> None: ... +def calc_line_intersection(m1, b1, m2, b2): ... +@deprecated("Use pandapower.get_connected_elements(net, 'line', bus_idx) instead!") +def get_connected_lines(net: pandapowerNet, bus_idx: Int): ... +@deprecated("Use pandapower.next_bus(net, bus, element_id instead!") +def next_buses(net: pandapowerNet, bus, element_id): ... +def source_to_end_path(net: pandapowerNet, start_bus, bus_list, bus_order): ... +@deprecated("Use pandapower.get_connected_switches(net, buses, consider='l', status='closed') instead!") +def get_connected_switches(net: pandapowerNet, buses): ... +@deprecated("Use pandapower.get_connected_buses_at_element(net, element, element_type='l', respect_in_service=False) instead!") +def connected_bus_in_line(net: pandapowerNet, element): ... +def switch_geodatas(net: pandapowerNet, size, distance_to_bus): ... +def create_I_t_plot(trip_decisions, switch_id) -> None: ... +def power_flow_end_points(net: pandapowerNet) -> tuple[list[np.int64], list[np.int64]]: ... +def bus_path_from_to_bus(net: pandapowerNet, radial_start_bus, loop_start_bus, end_bus) -> list[Incomplete]: ... +def get_switches_in_path(net: pandapowerNet, paths: Iterable[Collection[Incomplete]]) -> list[list[pd.Index[int]]]: ... +def get_vi_angle(net: pandapowerNet, switch_id: Int, **kwargs) -> float: ... +def bus_path_multiple_ext_bus(net: pandapowerNet) -> list[list[np.int64]]: ... +def get_line_path(net: pandapowerNet, bus_path: Collection[Int]) -> list[int]: ... +def parallel_lines(net: pandapowerNet) -> list[tuple[np.int64, np.int64]]: ... +def read_fuse_from_std_type(): ... diff --git a/stubs/pandapower-stubs/results.pyi b/stubs/pandapower-stubs/results.pyi index 4ec4c4e..b4aa1fd 100644 --- a/stubs/pandapower-stubs/results.pyi +++ b/stubs/pandapower-stubs/results.pyi @@ -5,6 +5,7 @@ from pandapower.auxiliary import pandapowerNet _Mode: TypeAlias = Literal["pf", "opf", "sc", "se", "pf_3ph"] +BRANCH_RESULTS_KEYS: tuple[str, ...] suffix_mode: dict[str, str] def verify_results(net: pandapowerNet, mode: _Mode = "pf") -> None: ... diff --git a/stubs/pandapower-stubs/results_bus.pyi b/stubs/pandapower-stubs/results_bus.pyi index 96a88f8..e205f46 100644 --- a/stubs/pandapower-stubs/results_bus.pyi +++ b/stubs/pandapower-stubs/results_bus.pyi @@ -1,4 +1,5 @@ -from _typeshed import Incomplete +from collections.abc import Mapping +from typing import Any from typing_extensions import TypeAlias import numpy as np @@ -12,10 +13,11 @@ _BType: TypeAlias = NDArray[np.int_] def write_voltage_dependend_load_results( net: pandapowerNet, p: ArrayLike, q: ArrayLike, b: ArrayLike -) -> tuple[NDArray[Incomplete], NDArray[Incomplete], NDArray[Incomplete]] | None: ... +) -> tuple[_PType, _QType, _BType] | None: ... def write_pq_results_to_element( - net: pandapowerNet, ppc: Incomplete, element: str, suffix: str | None = None + net: pandapowerNet, ppc: Mapping[str, Any], element: str, suffix: str | None = None ) -> pandapowerNet: ... +def write_p_dc_results_to_element(net: pandapowerNet, ppc: Mapping[str, Any], element: str) -> pandapowerNet: ... def write_pq_results_to_element_3ph(net: pandapowerNet, element: str) -> pandapowerNet: ... def get_p_q_b(net: pandapowerNet, element: str, suffix: str | None = None) -> tuple[_PType, _QType, _BType]: ... def get_p_q_b_3ph(net: pandapowerNet, element: str) -> tuple[_PType, _PType, _PType, _QType, _QType, _QType, _BType]: ... diff --git a/stubtest_allowlist.txt b/stubtest_allowlist.txt index 2d3908b..2616805 100644 --- a/stubtest_allowlist.txt +++ b/stubtest_allowlist.txt @@ -1,31 +1,28 @@ # pandapower allowlist # ==================== -# TODO modules -pandapower\.build_bus.* +# TODO: modules pandapower\.contingency.* pandapower\.control.* pandapower\.converter.* -pandapower\.grid_equivalents.* -pandapower\.pf.* -pandapower\.protection.* pandapower\.pypower.* -pandapower\.results.* -# TODO constants +# TODO: constants pandapower\.[A-Z0-9_]+$ -# OK stubs-only +# OK: stubs-only pandapower\._typing -# OK runtime-only helpers +# OK: runtime-only helpers pandapower\..*\.(std_)?logger +pandapower\.grid_equivalents(\.auxiliary)?\.(home|desktop) pandapower\.(\w+\.)*([a-zA-Z0-9]+_(available|INSTALLED|IMPORTED)|GRAPHS_EQUAL_POSSIBLE|TYPE_CHECKING) -# OK runtime-only unintentional reexports +# OK: runtime-only unintentional reexports pandapower\.(nan|pp_version) pandapower\.networks\.(nan|pp_dir) pandapower\.topology\.BASE_KV -# OK requires optional dependencies +# OK: requires optional dependencies pandapower\.timeseries\.ts_runpp # requires numba +pandapower\.pf\.(makeYbus_numba|dSbus_dV_numba|create_jacobian_numba) # requires numba pandapower\.topology\.graph_tool_interface # requires graph-tool