Coverage for tests/test_verify_pyomo.py: 100%
25 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-13 17:34 -0800
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-13 17:34 -0800
1import distopf as opf
2import pyomo.environ as pyo
3from distopf.pyomo_models.objectives import loss_objective
4from distopf.pyomo_models.solvers import solve
5from distopf.pyomo_models.lindist_loads import LinDistPyoMPL
6import distopf.matrix_models.multiperiod as mpopf
7from distopf.importer import create_case
8from distopf import CASES_DIR
10case = create_case(
11 data_path=CASES_DIR / "csv" / "ieee123_30der", n_steps=1, start_step=0
12)
13case.gen_data.control_variable = ""
14case.schedules.default = 1
15case.schedules.PV = 1
16case.bat_data = case.bat_data.head(0) # delete battery data
17m1 = LinDistPyoMPL(case=case)
18m1.model.objective = loss_objective
19results = pyo.SolverFactory("ipopt").solve(m1.model)
20r1 = solve(m1.model)
22m2 = mpopf.LinDistMPL(case=case)
23r2 = mpopf.cvxpy_solve(m2, mpopf.cp_obj_loss, solver="CLARABEL")
25v1 = r1.voltages
26v2 = m2.get_voltages(r2.x).sort_values("id").reset_index(drop=True)
27vd = v1.loc[:, ["a", "b", "c"]] - v2.loc[:, ["a", "b", "c"]]
28max_variation = vd.abs().max().max()
29print(f"max variation: {max_variation}")
30assert max_variation < 1e-5
31# print(f"Matrix Objective Value: {r2.fun}")
32# pl1 = r1.p_load.sort_values("id").reset_index(drop=True)
33# ql1 = r1.q_load.sort_values("id").reset_index(drop=True)
34# pf1 = r1.p_flow.sort_values("id").reset_index(drop=True)
35# qf1 = r1.q_flow.sort_values("id").reset_index(drop=True)
36# pg1 = r1.p_gen.sort_values("id").reset_index(drop=True)
37# qg1 = r1.q_gen.sort_values("id").reset_index(drop=True)
38# qc1 = r1.q_cap.sort_values("id").reset_index(drop=True)
40# pl2 = m2.get_p_loads(r2.x).sort_values("id").reset_index(drop=True)
41# ql2 = m2.get_q_loads(r2.x).sort_values("id").reset_index(drop=True)
42# qc2 = m2.get_q_caps(r2.x).sort_values("id").reset_index(drop=True)
43# pg2 = m2.get_p_gens(r2.x).sort_values("id").reset_index(drop=True)
44# qg2 = m2.get_q_gens(r2.x).sort_values("id").reset_index(drop=True)
45# pf2 = m2.get_p_flows(r2.x).sort_values("id").reset_index(drop=True)
46# qf2 = m2.get_q_flows(r2.x).sort_values("id").reset_index(drop=True)
47# s2 = m2.get_apparent_power_flows(r2.x).sort_values("tb").reset_index(drop=True)
48# # opf.voltage_differences(v1, v2).show(renderer="browser")
49# # opf.plot_pq(pg1, qg1).show(renderer="browser")
50# # opf.plot_pq(pg2, qg2).show(renderer="browser")
51# # opf.plot_pq(pl1, ql1).show(renderer="browser")
52# # opf.plot_pq(pl2, ql2).show(renderer="browser")
53# vd1 = v1.copy()
54# vd1.loc[:, ["a", "b", "c"]] = v1.loc[:, ["a", "b", "c"]] - v2.loc[:, ["a", "b", "c"]]
55# pgd = pg1.copy()
56# pgd.loc[:, ["a", "b", "c"]] = pg1.loc[:, ["a", "b", "c"]] - pg2.loc[:, ["a", "b", "c"]]
57# qgd = qg1.copy()
58# qgd.loc[:, ["a", "b", "c"]] = qg1.loc[:, ["a", "b", "c"]] - qg2.loc[:, ["a", "b", "c"]]
59# pfd = pf1.copy()
60# pfd.loc[:, ["a", "b", "c"]] = pf1.loc[:, ["a", "b", "c"]] - pf2.loc[:, ["a", "b", "c"]]
61# qfd = qf1.copy()
62# qfd.loc[:, ["a", "b", "c"]] = qf1.loc[:, ["a", "b", "c"]] - qf2.loc[:, ["a", "b", "c"]]
63# opf.plot_network(
64# case, v=vd1, p_flow=pfd, q_flow=qfd, p_gen=pgd, q_gen=qgd, v_max=0.002, v_min=0
65# ).show(renderer="browser")
66# opf.plot_network(
67# case,
68# v=vd1,
69# p_flow=pfd,
70# q_flow=qfd,
71# p_gen=pgd,
72# q_gen=qgd,
73# v_max=0.002,
74# v_min=0,
75# show_reactive_power=True,
76# ).show(renderer="browser")
77# opf.plot_network(case, v=vd1, s=s2, p_gen=pgd, q_gen=qgd).show(renderer="browser")