grid_feedback_optimizer.models package

Submodules

grid_feedback_optimizer.models.loader module

grid_feedback_optimizer.models.loader.load_network(file_path: str | Path) Network

Load a network from a JSON file and validate it using Pydantic.

Parameters:

file_path – Path to the JSON network file.

Returns:

Validated Network object.

Return type:

Network

grid_feedback_optimizer.models.loader.load_network_from_excel(file_path: str | Path) Network

Load a Network object from an Excel file where each sheet corresponds to a component type (e.g., ‘buses’, ‘lines’, etc.).

Missing sheets are treated as empty lists.

grid_feedback_optimizer.models.network module

class grid_feedback_optimizer.models.network.Bus(*, index: int, u_rated: float, u_pu_max: float, u_pu_min: float)

Bases: BaseModel

index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

u_pu_max: float
u_pu_min: float
u_rated: float
class grid_feedback_optimizer.models.network.Line(*, index: int, from_bus: int, to_bus: int, r1: float, x1: float, c1: float, tan1: float, i_n: float)

Bases: BaseModel

c1: float
from_bus: int
i_n: float
index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

r1: float
tan1: float
to_bus: int
x1: float
class grid_feedback_optimizer.models.network.Load(*, index: int, bus: int, p_norm: float, q_norm: float)

Bases: BaseModel

Represents a non-controllable unit: either a load or a generator.

bus: int
index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

p_norm: float
q_norm: float
class grid_feedback_optimizer.models.network.Network(*, buses: List[Bus], lines: List[Line], transformers: List[Transformer] = [], sources: List[Source], renew_gens: List[RenewGen], loads: List[Load])

Bases: BaseModel

buses: List[Bus]
lines: List[Line]
loads: List[Load]
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

renew_gens: List[RenewGen]
sources: List[Source]
transformers: List[Transformer]
class grid_feedback_optimizer.models.network.RenewGen(*, index: int, bus: int, p_max: float, s_inv: float | None = None, q_min: float | None = None, q_max: float | None = None, pf_min: float | None = None, p_min: float | None = 0.0, q_norm: float | None = 0.0, p_norm: float | None = None, c1_p: float | None = 0.0, c2_p: Annotated[float, Ge(ge=0)] = 1.0, c1_q: float | None = 0.0, c2_q: Annotated[float, Ge(ge=0)] = 0.1)

Bases: BaseModel

Represents a renewable generator or power-consuming device.

Notes

  • If p_max > 0 and p_min >= 0 → behaves as a generator.

  • If p_max <= 0 and p_min <= 0 → behaves as a load/consuming device.

  • Mixed cases (p_min < 0 < p_max) → flexible device (can consume or generate).

bus: int
c1_p: float | None
c1_q: float | None
c2_p: float
c2_q: float
compute_p_norm()

Compute p_norm only if not provided by user.

index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

p_max: float
p_min: float | None
p_norm: float | None
pf_min: float | None
q_max: float | None
q_min: float | None
q_norm: float | None
s_inv: float | None
class grid_feedback_optimizer.models.network.Source(*, index: int, bus: int, u_ref_pu: float)

Bases: BaseModel

bus: int
index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

u_ref_pu: float
class grid_feedback_optimizer.models.network.Transformer(*, index: int, from_bus: int, to_bus: int, u1: float, u2: float, sn: float, uk: float, pk: float, i0: float, p0: float, winding_from: WindingType, winding_to: WindingType, clock: int, tap_side: BranchSide, tap_min: int, tap_max: int, tap_size: float, tap_pos: int | None = 0)

Bases: BaseModel

clock: int
from_bus: int
i0: float
index: int
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

p0: float
pk: float
sn: float
tap_max: int
tap_min: int
tap_pos: int | None
tap_side: BranchSide
tap_size: float
to_bus: int
u1: float
u2: float
uk: float
winding_from: WindingType
winding_to: WindingType

grid_feedback_optimizer.models.solve_data module

class grid_feedback_optimizer.models.solve_data.OptimizationInputs(*, u_pu_meas: ndarray, P_line_meas: ndarray, Q_line_meas: ndarray, p_gen_last: ndarray, q_gen_last: ndarray, P_transformer_meas: ndarray | None = None, Q_transformer_meas: ndarray | None = None)

Bases: BaseModel

Structured container for optimization inputs at each iteration.

P_line_meas: ndarray
P_transformer_meas: ndarray | None
Q_line_meas: ndarray
Q_transformer_meas: ndarray | None
check_lengths()

Ensure measurement and generator arrays have consistent lengths.

model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

p_gen_last: ndarray
q_gen_last: ndarray
to_dict()

Convert to a plain dict (for compatibility with existing code).

u_pu_meas: ndarray
class grid_feedback_optimizer.models.solve_data.OptimizationModelData(*, p_min: ndarray, p_max: ndarray, q_min: ndarray | None = None, q_max: ndarray | None = None, s_inv: ndarray | None = None, pf_min: ndarray | None = None, c1_p: ndarray, c2_p: ndarray, c1_q: ndarray, c2_q: ndarray, p_norm: ndarray, q_norm: ndarray, u_pu_max: ndarray, u_pu_min: ndarray, s_line: ndarray, s_transformer: ndarray | None = None)

Bases: BaseModel

Minimal structure needed for the optimizer.

c1_p: ndarray
c1_q: ndarray
c2_p: ndarray
c2_q: ndarray
check_fill_optional_arrays()

Ensure optional arrays are initialized as arrays of None if missing.

model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

p_max: ndarray
p_min: ndarray
p_norm: ndarray
pf_min: ndarray | None
q_max: ndarray | None
q_min: ndarray | None
q_norm: ndarray
s_inv: ndarray | None
s_line: ndarray
s_transformer: ndarray | None
u_pu_max: ndarray
u_pu_min: ndarray
class grid_feedback_optimizer.models.solve_data.SolveResults(*, final_output: Dict[Any, Any], final_gen_update: ndarray, iterations: List[Dict[str, Any]])

Bases: BaseModel

Container for optimization and power flow results. Provides structured access and convenient save/load utilities.

final_gen_update: ndarray
final_output: Dict[Any, Any]
iterations: List[Dict[str, Any]]
model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

plot_iterations() None

Plot evolution of voltages, line loadings, transformer loadings, and generator active/reactive powers over optimization iterations.

Layout: 5 rows * 1 column (shared x-axis: iteration number)

print_summary() None

Print a concise summary of the optimization results.

save(output_file: str = 'optimization_results.json') None

Save the results of the optimization and power flow to a JSON file.

Module contents