LightSim2Grid 实现了一个针对 Grid2Op 平台的 c++ 后端。
项目描述
LightSim2Grid
使用 c++ KLU 和 Eigen 库为 grid2op 提供快速后端。它的主要目标是作为 grid2op 平台的快速后端,主要用作电力系统领域中顺序决策的测试平台。
请参阅免责声明以更详细地了解此软件包是什么以及不是什么。例如,此软件包不应用于详细的电力系统计算或模拟。
用法
安装后(不要忘记,如果您使用了上面的可选虚拟环境,则需要加载它source venv/bin/activate),您可以将其用作任何 python 包。
1.作为grid2op后端(首选方法)
此功能要求您安装 grid2op,版本至少为 0.7.0。你可以安装它
pip install grid2op>=1.6.4
然后你可以通过这种方式使用 LightSimBackend 而不是默认的 PandapowerBackend:
import grid2op
from lightsim2grid import LightSimBackend
env_name = "l2rpn_case14_sandbox" # or any other name.
env = grid2op.make(env_name, backend=LightSimBackend())
# do regular computation as you would with grid2op
你很高兴。
2.替换pandapower“newtonpf”方法(高级方法)
也可以直接使用 lightsim2grid 的“求解器”部分。
假设你以某种方式得到:
Ybus您的电力系统的导纳矩阵,例如由 pandapower 给出(将转换为 scipysparse.csc_matrix)V0每条总线上的(复数)电压矢量,例如由 pandapower 给出Sbus每条总线的(复杂)功率吸收,例如 pandapower 给出的ref松弛总线的 ID(在 0.5.6 版中添加以匹配最近的 pandapower 更改)pv光伏客车一览pqPQ总线列表ppci一个 ppc 内部 pandapower 测试用例(或字典,用于检索与每个松弛总线关联的系数)optionspandapower“选项”列表(或带有键max_iteration和的字典tolerance_mva)
您可以使用以下代码定义替换newtonpf函数的功能:pandapower.pandapower.newtonpf
from lightsim2grid.newtonpf import newtonpf
V, converged, iterations, J = newtonpf(Ybus, V, Sbus, ref, weights, pv, pq, ppci, options)
此函数使用 KLU 算法和牛顿求解器的 c++ 实现来提高速度。
安装(来自pypi官方仓库,推荐)
从 0.5.3 版开始,可以像大多数 python 包一样安装 lightsim2grid,调用:
python -m pip install lightsim2grid
它包括更快的 grid2op 后端和SuiteSparse更快的KLU求解器,即使在 Windows 上也是如此。这绝对是在您的系统上安装 lightsim2grid 并让它运行而没有太多问题的最简单方法。
请注意,尽管这些软件包已在您使用的平台不同的平台上编译。从您的机器上安装它可能仍然会获得一些好处(在性能方面)。
Pypi 包可用于带有 python 版本的 linux、windows 和 macos:
- 3.7
- 3.8
- 3.9
- 3.10 (lightsim2grid >= 0.6.1)
安装(来自源代码,适用于更高级的用户)
你需要:
- 克隆此存储库并获取 Eigen(编译必需)和 SparseSuite(可选,但推荐)的代码
- (可选,但推荐)编译一段 SparseSuite
- (可选)[实验性] 检索并获得 NICSLU 线性求解器的适当许可证(请参阅https://github.com/chenxm1986/nicslu)
- (可选)指定一些编译标志以使包在您的机器上运行得更快
- 安装软件包
重要的提示
这个包依赖于优秀的pybind11包将c++代码轻松集成到python中。
因此,要安装您需要的 lightsim2gridpybind11及其要求,其中包括一个工作编译器:例如(截至撰写时)gcc(ubuntu 上的默认值,版本 >= 4.8)、clang(MacOS 上的默认值,版本 >= 5.0.0)或 Microsoft视觉工作室(Microsoft Visual Studio 2015 Update 3 或更新版本)。
本自述文件不包括此类编译器的安装。更多信息请参考 pybind11的文档。如果您在安装此类编译器时遇到问题,请不要犹豫写 github 问题(在 Windows 上nb您必须安装 Visual Studio,在 MacO 的 linux 上您可能已经安装了工作编译器)。
1. 检索来源
首先,您可以使用 git 下载它:
git clone https://github.com/BDonnot/lightsim2grid.git
cd lightsim2grid
# it is recommended to do a python virtual environment
python -m virtualenv venv # optional
source venv/bin/activate # optional
# retrieve the code of SparseSuite and Eigen (dependencies, mandatory)
git submodule init
git submodule update
(可选,推荐)SuiteSparse 的编译
SuiteSparse 带有更快的 KLU 线性求解器。
自 0.3.0 版起,此要求已被删除。这意味着在 linux / macos 上,您仍然可以从更快的 KLU 求解器中受益。您仍然可以从 lightsim 的加速(与默认的 PandaPowerBackend 相比)中受益,但这种加速将低于您设法编译 SuiteSparse(有关更多信息,请参阅基准小节)。
NB在这两种情况下计算功率流的算法是完全相同的。它是一种基于 Newton-Raphson 的方法。但是要执行这种算法,需要求解一些线性方程组。两个版本(有和没有 KLU)的唯一区别是线性方程求解器不同。直到双浮点精度,两个结果(有和没有 KLU)都应该匹配。
有两种方法可以安装此软件包。要么使用“make”(Linux / unix 上的首选方法——包括 MacOS),要么使用“cmake”,它适用于所有平台,但需要更多时间且自动化程度较低(主要是因为 SuiteSparse 不能直接使用“cmake”构建所以我们需要额外的步骤来实现它。)
(可选)选项 A. 使用“make”编译 SuiteSparse
这是在您的系统上编译 SuiteSparse 的最简单方法,但不幸的是,它仅适用于“make”可用的操作系统(例如Linux 或 MacOS),但这不适用于 Windows……Windows 上的编译将在下一段中介绍 (可选)选项 B. 使用“cmake”编译 SuiteSparse
无论如何,在这种情况下,这非常容易。做就是了:
# compile static libraries of SparseSuite
make
你很高兴。而已。
(可选)选项 B. 使用“cmake”编译 SuiteSparse
这适用于大多数平台,包括 MacOS、Linux 和 Windows。
它需要安装免费cmake程序并比其他系统做更多的工作。这就是为什么我们只建议在 Windows 上使用它。
主要步骤(对于windows,somme命令需要在linux/macos上适配)是:
cd build_cmakepy generate_c_files.pymkdir build和 cd 那里:cd buildcmake -DCMAKE_INSTALL_PREFIX=..\built -DCMAKE_BUILD_TYPE=Release ..cmake --build . --config Releasecmake --build . --config Release --target install
如需更多信息,请随时阅读专用的自述文件。
(可选)包括 NICSLU 线性求解器(实验性)
另一个可以与 lighsim2grid 一起使用的线性求解器是“NICSLU”线性求解器,在某些情况下,它可能比 KLU 线性求解器更快。如果使用 lightsim2grid,这可以提高速度。
要使用它,您需要:
- 从https://github.com/chenxm1986/nicslu检索源代码(仅作为免费软件提供)并将其保存在您的计算机上。假设您将这个 github 存储库克隆到
NICSLU_GIT(例如NICSLU_GIT="/home/user/Documents/nicslu/")。另请注意,您需要检查您的使用是否符合他们的许可证! - 在编译lightsim2grid之前定义“PATH_NICSLU”环境变量,在linux上你可以这样做
export PATH_NICSLU=NICSLU_GIT/nicsluDATE(例如export PATH_NICSLU=/home/user/Documents/nicslu/nicslu202103,如果你克隆存储库作为示例step 1)并使用作者在2021年3月编译的nicslu版本[在编写自述文件时分发的版本])
就是这样。Lightsim 将能够使用此线性求解器。
不过要小心,您需要许可证文件才能使用它。到目前为止,最好的方法是将许可证文件复制粘贴到与您执行 python 的位置相同的位置(即您每次都需要复制粘贴它)。
(可选)安装定制
如果您费心从源代码编译包,您可能还想从一些额外的加速中受益。
这可以通过指定__O3_OPTIM和__COMPILE_MARCHNATIVE环境变量来实现。
第一个将使用-O3编译器标志(/O2在 Windows 上)编译包,这将告诉编译器进一步优化代码以提高速度。
第二个将使用-march=native标志编译包(在 macOS 和 linux 上)
在基于 linux 的机器上做这些事情的例子是:
export __O3_OPTIM=1
export __COMPILE_MARCHNATIVE=1
如果要禁用它们,只需将它们各自的值设置为 0。
2.python包的安装
现在您只需要以这种方式安装 lightsim2grid 包,就像任何 python 包一样:
# install the dependency
pip install -U pybind11
# compile and install the python package
pip install -U .
你完成了:-)
基准
当与 grid2op 一起用于各种环境大小时,Lightsim2grid 比 pandapower 快得多。
首先在基于 IEEE case14 网格的环境中:
| case14_sandbox | grid2op 速度 (it/s) | grid2op 'backend.runpf' 时间(毫秒) | 求解器功率流时间(毫秒) |
|---|---|---|---|
| 聚丙烯 | 70.5 | 11 | 4.27 |
| LS+GS | 881 | 0.447 | 0.327 |
| LS+GS 小号 | 877 | 0.446 | 0.327 |
| LS+SLU(单) | 1110 | 0.191 | 0.0655 |
| LS+SLU | 1120 | 0.195 | 0.0683 |
| LS+KLU(单人) | 1200 | 0.138 | 0.0176 |
| LS+KLU | 1180 | 0.141 | 0.0188 |
| LS+NICSLU(单) | 1200 | 0.139 | 0.0179 |
| LS+NICSLU | 1200 | 0.139 | 0.0184 |
然后在基于 IEEE 案例 118 的环境中:
| neurips_2020_track2 | grid2op 速度 (it/s) | grid2op 'backend.runpf' 时间(毫秒) | 求解器功率流时间(毫秒) |
|---|---|---|---|
| 聚丙烯 | 39.6 | 13.3 | 5.58 |
| LS+GS | 5.3 | 188 | 188 |
| LS+GS 小号 | 36.5 | 26.6 | 26.4 |
| LS+SLU(单) | 642 | 0.775 | 0.607 |
| LS+SLU | 588 | 0.932 | 0.769 |
| LS+KLU(单人) | 945 | 0.277 | 0.116 |
| LS+KLU | 918 | 0.306 | 0.144 |
| LS+NICSLU(单) | 947 | 0.274 | 0.11 |
| LS+NICSLU | 929 | 0.298 | 0.134 |
有关更多信息(包括重现这些结果的确切方法,以及使用的计算机),您可以查阅文档上的专用基准页面。
哲学
Lightsim2grid 旨在提供针对 grid2op 平台的某种高效(在计算速度方面)的后端。
它提供了一个与 grid2op 兼容的 c++ api,能够计算来自给定电网的流量(以及电压和无功功率)。这个网格可以根据grid2op机制进行修改(更多信息见grid2Op官方文档)。
该代码的目的不是在性能方面提供最先进的求解器,也不是在电力系统元素(例如负载、发电机、电力线、变压器等)建模的真实性方面。
Lightsim2grid 代码库被“组织”成 4 个不同的部分:
- 修改元素(例如断开电源线或更改发电机的电压幅度设定值,或 grid2op 可能执行的任何其他操作)
- 从电网的状态生成
Ybus(稀疏)复数导纳矩阵和Sbus复数注入向量(例如,每个元件的物理特性,哪些元件在使用中,每个发电机产生的功率和每个负载消耗的功率,什么是电网拓扑ETC。) - 求解具有“标准”“功率流约束”的方程的复杂电压
V(和部分Sbus矢量) (例如,在给定组件处设置的电压幅度,在其他方面,它是 的虚部)V.(Ybus.V)* = SbusVSbus - 计算有功功率、无功功率、电力线上的流量等,根据在步骤 3) 计算的
V和Sbus复矢量。
步骤 1、2 和 4 在GridModel类中完成。
第 3 步的执行得益于“潮流求解器”。
使用自定义潮流求解器
目前,一些基本的“求解器”(例如执行上述点的程序3.)是可用的,基于 Gauss Seidel 或 Newton-Raphson 方法来执行“功率流”。
没有什么可以阻止任何其他“求解器”与 lightsim2grid 一起使用,从而与 grid2op 一起使用。为此,您只需要在 C++ 中实现一个“lightsim2grid 求解器”,主要包括定义一个函数:
bool compute_pf(const Eigen::SparseMatrix<cplx_type> & Ybus, // the admittance matrix
CplxVect & V, // store the results of the powerflow and the Vinit !
const CplxVect & Sbus, // the injection vector
const Eigen::VectorXi & ref, // bus id participating to the distributed slack
const RealVect & slack_weights, // slack weights for each bus
const Eigen::VectorXi & pv, // (might be ignored) index of the components of Sbus should be computed
const Eigen::VectorXi & pq, // (might be ignored) index of the components of |V| should be computed
int max_iter, // maximum number of iteration (might be ignored)
real_type tol // solver tolerance
);
使用的类型有:
real_type: double => 表示实数的类型cplx_type: std::complex<real_type> => 表示复数的类型CplxVect: Eigen::Matrix<cplx_type, Eigen::Dynamic, 1> => 表示复数向量的类型RealVect: Eigen::Matrix<real_type, Eigen::Dynamic, 1> => 表示实数向量的类型Eigen::VectorXi=> 表示一个整数向量Eigen::SparseMatrix<cplx_type>=> 表示稀疏矩阵
例如,参见BaseNRSolver以了解 Newton Raphson 求解器的实现(它需要一些“线性求解器”,有关这些的更多详细信息在下面的部分中给出)
在这方面的任何贡献都非常受欢迎。
注意目前“求解器”仅使用上述信息来执行功率流。如果需要实施更“深入”的解决方案,请通过 github 问题告知我们。例如,提议的“求解器”使用有关电网元素(电力线、拓扑等)的直接信息来执行一些电力流可能完全没问题。
NB在 lightsim2grid 中“嵌入”求解器的所有代码不是强制性的。由于不同的定制,只有在满足某些条件时才完全有可能安装给定的“lightsim求解器”。例如,在基于 Windows 的机器上,SuiteSparse 库无法轻松编译,因此 KLUSolver 不可用。
注意如果某些“lightsim2grid”求解器仅在机器上安装了某些软件包时可用,那将完全没问题。
使用自定义线性求解器求解功率流
在 lightsim2grid(c++ 部分)中,由于使用“模板元编程”而不重新编码 Newton Raphson 算法(或 DC 潮流算法)并利用线性求解器,它也是可能的。
“线性求解器”是可以实现 3 个基本功能的任何东西:
initialize(const Eigen::SparseMatrix<real_type> & J):初始化求解器并准备求解线性系统J.x = b(通常每个能流调用一次)ErrorType solve(const Eigen::SparseMatrix<real_type> & J, RealVect & b, bool has_just_been_inialized): 有效解决J.x = b(通常每个能流调用多次)ErrorType reset():清除求解器的状态(通常在能流结束时执行以将状态重置为“空白”/“好像刚刚初始化”状态)
在 c++ 代码“KLUSolver.h”、“SparLUSolver.h”和“NICSLU.h”中给出了一些示例
这种用法通常需要大约 20 / 30 行 c++ 代码(不包括注释,例如用于异常处理的锅炉代码)。
引用
如果您在您的一项工作中使用此软件包,请引用:
@misc{lightsim2grid,
author = {B. Donnot},
title = {{Lightsim2grid - A c++ backend targeting the Grid2Op platform. }},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://GitHub.com/bdonnot/lightsim2grid}},
}
各种各样的
编译的自定义
启用 NICSLU
为此,您需要声明PATH_NICSLU指向 NICSLU 包的有效安装的环境变量(请参阅https://github.com/chenxm1986/nicslu)。例如:export PATH_NICSLU=/home/user/Documents/nicslu/nicslu202103
启用03优化
默认情况下,至少在 ubuntu 上,仅使用“-O2”编译器标志。使用O3优化标志,需要指定__COMPLILE_O3环境变量:set __COMPLILE_O3=1编译前(so before
python3 setup.py buildor python -m pip install -e .)
这个编译参数会增加编译时间,但会使包更快。
启用“-march=native”优化
默认情况下,为了可移植性,我们不使用-march=native标志进行编译。这会导致某些平台上的一些错误。如果你想进一步提高性能。
您可以set __COMPILE_MARCHNATIVE=1在编译之前启用它(所以在
python3 setup.py buildor之前python -m pip install -e .)
分析代码
这是目前正在进行的工作。它远非完美,可能只适用于linux。
有关更多详细信息,请参阅https://github.com/xflash96/pybind11_package_example/blob/main/tutorial.md#perf。
cd benchmarks
perf record ./test_profile.py
perf report
本地测试
还有一些官方测试,以确保求解器返回与 pandapower 相同的结果,在“lightsim2grid/tests”中执行
cd lightsim2grid/tests
python -m unittest discover
该测试确保该模拟器给出的结果与 pandapower 在使用 Newton-Raphson 算法时给出的结果一致,使用单个松弛总线,不对发电机执行 q 限制等。
注意要运行这些测试,您需要从源代码安装 grid2op,否则 LightSim2gridBackend 的所有测试都将失败。为此,您可以执行以下操作:
git clone https://github.com/rte-france/Grid2Op.git
cd Grid2Op
pip3 install -U -e .
cd ..
自动执行的测试
每次在 lightsim2grid 代码中进行修改时,都会在标准平台上自动执行一些测试。
目前,这些测试包括在 gcc(版本 8、10、11 和 12)和 clang(版本 10、13 和 14)上的编译。
注意clang 和 gcc 的中间版本(例如gcc 9 或 clang 12)没有定期测试,但 lightsim2grid 曾经在这些版本上工作。我们假设如果它适用于例如clang 10 和 clang 14 那么它也可以在所有中间版本上编译。
NB包可能在这些编译器的早期版本上工作(我们从未测试过)。lightsim2grid 的唯一“真正”要求是有一个支持 c++11 的编译器(至少)。
已知的问题
存储单元
存储单元的处理存在差异,当不要求在 pandapower 和 lightsim2grid 之间生产/消耗任何东西(设定点为 0)时,仅在存储单元单独在其总线上的情况下。
Pandapower 没有检测到它,情节可以继续。另一方面,lightsim2grid 检测到它并引发错误,因为在这种情况下,网格不再连接(这是所需的行为)。
编译问题
在 clang 编译器(MacOS 计算机上的默认编译器)上,有时需要将 pybind11 版本降级到 2.6.2 才能安装软件包。
您可以使用以下命令降级 pybind11:python -m pip install -U pybind11==2.6.2
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置发行版
LightSim2Grid -0.7.0.post1.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | f81e30a128d4723ad4291561a0f80a57fa5aec22bb256d1a22f65756aa0ccf14 |
|
| MD5 | c24ce4f4cc3ed619d5da116d939c9816 |
|
| 布莱克2-256 | 59da56ca62cea089342b4a6ef8b1a8e4c2c6b5f595e3a633cc5c9443f51f8c4b |
LightSim2Grid -0.7.0.post1-cp310-cp310-win_amd64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | c1552a7738b4a0524922611ac8331344d0c29b94157411adb3bfc5e322cfb44b |