Skip to content

Commit

Permalink
workaround for set validation
Browse files Browse the repository at this point in the history
  • Loading branch information
sasanjac committed Jul 5, 2023
1 parent 87b9549 commit d04b042
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 10 deletions.
7 changes: 7 additions & 0 deletions psdm/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
import enum
import json
import pathlib
import typing as t

import pydantic

T = t.TypeVar("T")


class VoltageSystemType(enum.Enum):
AC = "AC"
Expand Down Expand Up @@ -42,3 +45,7 @@ def to_json(self, file_path: str | pathlib.Path, indent: int = 2) -> None:
@classmethod
def from_json(cls, json_str: str) -> Base:
return cls.model_validate_json(json_str)


def validate_set(value: list[T]) -> list[T]:
return list(set(value))
19 changes: 16 additions & 3 deletions psdm/steadystate_case/case.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from loguru import logger

from psdm.base import Base
from psdm.base import validate_set
from psdm.meta import Meta
from psdm.steadystate_case.external_grid import ExternalGrid
from psdm.steadystate_case.load import Load
Expand All @@ -21,9 +22,21 @@

class Case(Base):
meta: Meta
loads: pydantic.conset(Load) # type: ignore[valid-type]
transformers: pydantic.conset(Transformer) # type: ignore[valid-type]
external_grids: pydantic.conset(ExternalGrid) # type: ignore[valid-type]
loads: list[Load]
transformers: list[Transformer]
external_grids: list[ExternalGrid]

@pydantic.field_validator("loads")
def validate_loads(cls, value: list[Load]) -> list[Load]:
return validate_set(value)

@pydantic.field_validator("transformers")
def validate_transformers(cls, value: list[Transformer]) -> list[Transformer]:
return validate_set(value)

@pydantic.field_validator("external_grids")
def validate_external_grids(cls, value: list[ExternalGrid]) -> list[ExternalGrid]:
return validate_set(value)

def is_valid_topology(self, topology: Topology) -> bool:
logger.info("Verifying steadystate case ...")
Expand Down
31 changes: 26 additions & 5 deletions psdm/topology/topology.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pydantic

from psdm.base import Base
from psdm.base import validate_set
from psdm.meta import Meta
from psdm.topology.branch import Branch
from psdm.topology.external_grid import ExternalGrid
Expand All @@ -17,8 +18,28 @@

class Topology(Base):
meta: Meta
branches: pydantic.conset(Branch) # type: ignore[valid-type]
nodes: pydantic.conset(Node) # type: ignore[valid-type]
loads: pydantic.conset(Load) # type: ignore[valid-type]
transformers: pydantic.conset(Transformer) # type: ignore[valid-type]
external_grids: pydantic.conset(ExternalGrid) # type: ignore[valid-type]
branches: list[Branch]
nodes: list[Node]
loads: list[Load]
transformers: list[Transformer]
external_grids: list[ExternalGrid]

@pydantic.field_validator("branches")
def validate_branches(cls, value: list[Branch]) -> list[Branch]:
return validate_set(value)

@pydantic.field_validator("nodes")
def validate_nodes(cls, value: list[Node]) -> list[Node]:
return validate_set(value)

@pydantic.field_validator("loads")
def validate_loads(cls, value: list[Load]) -> list[Load]:
return validate_set(value)

@pydantic.field_validator("transformers")
def validate_transformers(cls, value: list[Transformer]) -> list[Transformer]:
return validate_set(value)

@pydantic.field_validator("external_grids")
def validate_external_grids(cls, value: list[ExternalGrid]) -> list[ExternalGrid]:
return validate_set(value)
7 changes: 6 additions & 1 deletion psdm/topology/transformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import pydantic

from psdm.base import Base
from psdm.base import validate_set
from psdm.topology.windings import Winding


Expand Down Expand Up @@ -72,7 +73,7 @@ class Transformer(Base):
vector_group: VectorGroup # specifier for connection of wiring e.g. DYn5
i_0: float # no-load current in %
p_fe: float # no-load losses (Iron losses)
windings: pydantic.conset(Winding) # type: ignore[valid-type] # winding object for each voltage level
windings: list[Winding] # winding object for each voltage level
phase_technology_type: TransformerPhaseTechnologyType | None = None # three- or single-phase-transformer
description: str | None = None
tap_u_abs: float | None = None # voltage deviation per tap position change in %
Expand All @@ -81,3 +82,7 @@ class Transformer(Base):
tap_min: int | None = None # lower position of tap for tap control
tap_neutral: int | None = None # initial position where rated transformation ratio is specified
tap_side: TapSide | None = None # transformer side of where tap changer is installed

@pydantic.field_validator("windings")
def validate_windings(cls, value: list[Winding]) -> list[Winding]:
return validate_set(value)
7 changes: 6 additions & 1 deletion psdm/topology_case/case.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@
import pydantic

from psdm.base import Base
from psdm.base import validate_set
from psdm.meta import Meta
from psdm.topology_case.element_state import ElementState


class Case(Base):
meta: Meta
elements: pydantic.conset(ElementState) # type: ignore[valid-type]
elements: list[ElementState]

@pydantic.field_validator("elements")
def validate_elements(cls, value: list[ElementState]) -> list[ElementState]:
return validate_set(value)

0 comments on commit d04b042

Please sign in to comment.