|
| 1 | +# Copyright (c) 2024, RTE (https://www.rte-france.com) |
| 2 | +# See AUTHORS.txt |
| 3 | +# This Source Code Form is subject to the terms of the Mozilla Public License, version 2.0. |
| 4 | +# If a copy of the Mozilla Public License, version 2.0 was not distributed with this file, |
| 5 | +# you can obtain one at http://mozilla.org/MPL/2.0/. |
| 6 | +# SPDX-License-Identifier: MPL-2.0 |
| 7 | +# This file is part of LightSim2grid, LightSim2grid a implements a c++ backend targeting the Grid2Op platform. |
| 8 | + |
| 9 | +import warnings |
| 10 | +import copy |
| 11 | +import pandapower as pp |
| 12 | +import numpy as np |
| 13 | +import hashlib |
| 14 | +from scipy.interpolate import interp1d |
| 15 | +import matplotlib.pyplot as plt |
| 16 | +from grid2op import make, Parameters |
| 17 | +from grid2op.Chronics import FromNPY, ChangeNothing |
| 18 | +from grid2op.Backend import PandaPowerBackend |
| 19 | +from grid2op.Exceptions import Grid2OpException |
| 20 | +import lightsim2grid |
| 21 | +from lightsim2grid import LightSimBackend |
| 22 | +from benchmark_grid_size import (get_loads_gens, |
| 23 | + make_grid2op_env_pp, |
| 24 | + run_grid2op_env, |
| 25 | + make_grid2op_env) |
| 26 | +from benchmark_solvers import solver_gs, solver_names, order_solver_print |
| 27 | + |
| 28 | +from tqdm import tqdm |
| 29 | +import os |
| 30 | +from utils_benchmark import print_configuration, get_env_name_displayed |
| 31 | +from benchmark_solvers import solver_names |
| 32 | + |
| 33 | +try: |
| 34 | + from tabulate import tabulate |
| 35 | + TABULATE_AVAIL = True |
| 36 | +except ImportError: |
| 37 | + print("The tabulate package is not installed. Some output might not work properly") |
| 38 | + TABULATE_AVAIL = False |
| 39 | + |
| 40 | +VERBOSE = False |
| 41 | +MAKE_PLOT = False |
| 42 | +WITH_PP = False |
| 43 | +DEBUG = False |
| 44 | + |
| 45 | +case_names = [ |
| 46 | + "case14.json", |
| 47 | + "case118.json", |
| 48 | + "case_illinois200.json", |
| 49 | + "case300.json", |
| 50 | + "case1354pegase.json", |
| 51 | + "case1888rte.json", |
| 52 | + # # "GBnetwork.json", # 2224 buses |
| 53 | + # "case2848rte.json", |
| 54 | + # "case2869pegase.json", |
| 55 | + # "case3120sp.json", |
| 56 | + # "case6495rte.json", |
| 57 | + # "case6515rte.json", |
| 58 | + # "case9241pegase.json" |
| 59 | + ] |
| 60 | + |
| 61 | + |
| 62 | +if __name__ == "__main__": |
| 63 | + prng = np.random.default_rng(42) |
| 64 | + case_names_displayed = [get_env_name_displayed(el) for el in case_names] |
| 65 | + nb_iters = [] |
| 66 | + ts_sizes = [] |
| 67 | + errors = {} |
| 68 | + for case_name in tqdm(case_names): |
| 69 | + |
| 70 | + if not os.path.exists(case_name): |
| 71 | + import pandapower.networks as pn |
| 72 | + case = getattr(pn, os.path.splitext(case_name)[0])() |
| 73 | + pp.to_json(case, case_name) |
| 74 | + |
| 75 | + # load the case file |
| 76 | + case = pp.from_json(case_name) |
| 77 | + ts_sizes.append(case.bus.shape[0]) |
| 78 | + pp.runpp(case) # for slack |
| 79 | + |
| 80 | + # create the env |
| 81 | + param = Parameters.Parameters() |
| 82 | + param.init_from_dict({"NO_OVERFLOW_DISCONNECTION": True}) |
| 83 | + |
| 84 | + with warnings.catch_warnings(): |
| 85 | + warnings.filterwarnings("ignore") |
| 86 | + env_pp = make("blank", |
| 87 | + param=param, test=True, |
| 88 | + backend=PandaPowerBackend(lightsim2grid=False), |
| 89 | + chronics_class=ChangeNothing, |
| 90 | + grid_path=case_name, |
| 91 | + _add_to_name=f"{case_name}", |
| 92 | + ) |
| 93 | + env_ls = make("blank", |
| 94 | + param=param, test=True, |
| 95 | + backend=LightSimBackend(), |
| 96 | + chronics_class=ChangeNothing, |
| 97 | + grid_path=case_name, |
| 98 | + _add_to_name=f"{case_name}", |
| 99 | + ) |
| 100 | + env_ls.backend.set_solver_type(lightsim2grid.SolverType.GaussSeidel) |
| 101 | + all_iters = [1, 3, 10, 30, 100, 300, 1_000, 3_000, |
| 102 | + 10_000, 30_000, |
| 103 | + 100_000, 300_000 |
| 104 | + ] |
| 105 | + iters = [] |
| 106 | + errors_p = [] |
| 107 | + errors_q = [] |
| 108 | + for max_iter in all_iters: |
| 109 | + env_ls.backend.set_solver_max_iter(max_iter) |
| 110 | + env_ls.backend._grid.tell_solver_need_reset() |
| 111 | + conv = True |
| 112 | + try: |
| 113 | + obs = env_ls.reset() |
| 114 | + except Grid2OpException as exc_: |
| 115 | + conv = False |
| 116 | + iters.append(env_ls.backend._grid.get_solver().get_nb_iter()) |
| 117 | + v_tmp = env_ls.backend._grid.get_solver().get_V() |
| 118 | + res_tmp = env_ls.backend._grid.check_solution(v_tmp, False) |
| 119 | + error_p = 1. * np.abs(res_tmp.real).max() |
| 120 | + error_q = 1. * np.abs(res_tmp.imag).max() |
| 121 | + errors_p.append(error_p) |
| 122 | + errors_q.append(error_q) |
| 123 | + if conv: |
| 124 | + break |
| 125 | + if conv: |
| 126 | + nb_iters.append(iters[-1]) |
| 127 | + else: |
| 128 | + nb_iters.append(None) |
| 129 | + |
| 130 | + errors[case.bus.shape[0]] = (errors_p, errors_q) |
| 131 | + |
| 132 | + print("Configuration:") |
| 133 | + print_configuration() |
| 134 | + print(f"Solver used for linear algebra: {lightsim2grid.SolverType.GaussSeidel}") |
| 135 | + print() |
| 136 | + hds = ["grid size (nb bus)", "gauss seidel max iter"] |
| 137 | + tab = [] |
| 138 | + for sz, nb_it in zip(ts_sizes, nb_iters): |
| 139 | + tab.append([sz, nb_it]) |
| 140 | + |
| 141 | + if TABULATE_AVAIL: |
| 142 | + res_use_with_grid2op_2 = tabulate(tab, headers=hds, tablefmt="rst") |
| 143 | + print(res_use_with_grid2op_2) |
| 144 | + else: |
| 145 | + print(tab) |
| 146 | + |
| 147 | + print(errors[118][0]) |
| 148 | + print(errors[118][1]) |
| 149 | + import pickle |
| 150 | + with open("res_gauss_seidel.pickle", "wb") as f: |
| 151 | + pickle.dump(errors, file=f) |
| 152 | + with open("res_gauss_seidel_nb_iters.pickle", "wb") as f: |
| 153 | + pickle.dump(nb_iters, file=f) |
| 154 | + print() |
| 155 | + print() |
| 156 | + |
| 157 | + |
| 158 | +# total computation time : 1h27min16s |
| 159 | +# Configuration: |
| 160 | + |
| 161 | +# - date: 2024-12-02 18:46 CET |
| 162 | +# - system: Linux 5.15.0-56-generic |
| 163 | +# - OS: ubuntu 20.04 |
| 164 | +# - processor: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz |
| 165 | +# - python version: 3.8.10.final.0 (64 bit) |
| 166 | +# - numpy version: 1.24.3 |
| 167 | +# - pandas version: 2.0.3 |
| 168 | +# - pandapower version: 2.14.0 |
| 169 | +# - grid2op version: 1.11.0.dev2 |
| 170 | +# - lightsim2grid version: 0.9.2.post2 |
| 171 | +# - lightsim2grid extra information: |
| 172 | + |
| 173 | +# - klu_solver_available: True |
| 174 | +# - nicslu_solver_available: False |
| 175 | +# - cktso_solver_available: False |
| 176 | +# - compiled_march_native: False |
| 177 | +# - compiled_o3_optim: False |
| 178 | + |
| 179 | +# Solver used for linear algebra: SolverType.GaussSeidel |
| 180 | + |
| 181 | +# ==================== ======================= |
| 182 | +# grid size (nb bus) gauss seidel max iter |
| 183 | +# ==================== ======================= |
| 184 | +# 14 278 |
| 185 | +# 118 3274 |
| 186 | +# 200 8360 |
| 187 | +# 300 40783 |
| 188 | +# 1354 122169 |
| 189 | +# 1888 |
| 190 | +# ==================== ======================= |
| 191 | +# [31.858705410410803, 13.801689961508492, 7.912199121114395, 6.387621207822959, 4.5494311573542525, 1.3539274305627065, 0.01652457790687702, 5.5928201247405206e-08, 9.957519963773673e-09] |
| 192 | +# [111.7637849724719, 52.1105433668106, 6.3902552555152345, 1.1851759157023143, 0.8457897295792693, 0.25197455746676584, 0.0030761171444685202, 1.0415372012959338e-08, 1.8561325626140559e-09] |
0 commit comments