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

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 

9 

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) 

21 

22m2 = mpopf.LinDistMPL(case=case) 

23r2 = mpopf.cvxpy_solve(m2, mpopf.cp_obj_loss, solver="CLARABEL") 

24 

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) 

39 

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")