diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 744584f..ff359fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: PowerGrid Synth CI +name: CI on: push: @@ -14,10 +14,10 @@ jobs: python-version: ["3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} @@ -37,10 +37,10 @@ jobs: python-version: ["3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.gitignore b/.gitignore index 7aafed9..f54cf77 100644 --- a/.gitignore +++ b/.gitignore @@ -71,4 +71,6 @@ docs/bin program.md report_status_*.md -workplan.md \ No newline at end of file +workplan.md +# Generated by the examples and quick-start snippets +/output/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3b406ab --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,49 @@ +# Changelog + +## 0.2.0 (unreleased) + +The project is now called **GridStudio**. The Python package and import name stay `powergrid_synth`, so existing code keeps working. + +### Changed behaviour + +- **Pipeline stages store their results on the graph.** `BusTypeAllocator.allocate()`, `CapacityAllocator.allocate()`, `LoadAllocator.allocate()`, `LoadAllocator.allocate_reactive()` and `GenerationDispatcher.dispatch()` now write `bus_type`, `pg_max`, `pl`, `ql` and `pg` to the graph in addition to returning them. Before, the caller had to copy each result onto the graph with `networkx.set_node_attributes`; skipping that step silently produced a grid with no generators and no loads. Code that still copies the results by hand keeps working. Pass `update_graph=False` for the old return-only behaviour. +- **Running a stage too early is an error.** A stage that needs `bus_type`, `pg_max`, `pl` or `pg` and finds none on the graph raises a `ValueError` naming the stage to run first, instead of returning an empty result. +- **Distribution feeders meet the requested totals.** Loads now add up to exactly `total_load_mw` and generation to `total_gen_mw`. Before, redrawing negative shares pushed the total above the request, more so on larger feeders (median 1.7 times the requested load at 200 nodes with the default parameters). This changes the power values for a given seed; the topology is unchanged. Pass `match_totals=False` to get the earlier values. +- **Progress output is controlled in one place.** Messages go through the `powergrid_synth` logger instead of `print`. `synthesize()` and `synthesize_distribution()` print one line per stage and accept `verbose=False`. `powergrid_synth.set_verbosity("silent" | "warning" | "info" | "debug")` sets the level for the package; the per-level and per-iteration detail that used to be printed always is now at the `"debug"` level. +- **Unknown export formats are rejected up front.** `synthesize()` and `synthesize_distribution()` raise a `ValueError` before generating anything, instead of printing a note and skipping the format after the pipeline has run. A missing pandapower installation is reported at the same point. +- `SchweetzerFeederGenerator` is renamed `SchweitzerFeederGenerator`. The old name still works and emits a `DeprecationWarning`. +- `generate_feeder()` and `synthesize_distribution()` return `DistributionGrid` objects (a `networkx.Graph` subclass) instead of plain graphs. + +### Added + +- `synthesize(export_formats=None)` returns the graph without writing files. +- `LoadAllocator.allocate_reactive()` can be called without arguments and then uses the loads stored on the graph. +- In reference mode, `synthesize()` stores the reference grid's voltage levels in `grid.graph["base_kv_map"]`, and `nx_to_pandapower()` / `GridExporter` use it when no mapping is passed, so a later export matches the one made by `synthesize()`. + +### Fixed + +- Excel export failed with the documented `[export]` extra because `xlsxwriter` was missing from it. +- Error messages for missing optional dependencies suggested `pip install powergrid_synth[export]`, which cannot work while the package is not on PyPI. They now give the install-from-GitHub command. +- A leftover debug statement printed the bare `gamma` value for every transformer connection. +- Built packages had an empty long description on case-sensitive file systems, because `pyproject.toml` pointed at `README.md` while the file was named `readme.md`. + +### Documentation + +- The README is rewritten: working install command, a description of the attributes on the returned graphs, and a step-by-step example that produces a complete grid. +- UCTE is no longer listed as an export format; pypowsybl's UCTE writer requires UCTE node codes and fails on synthetic grids. +- The README states that AC power flow is not guaranteed to converge on generated grids. +- Two references had DOIs that do not resolve, and the Schweitzer et al. reference had the wrong title, journal and pages; all are corrected. +- The docs no longer tell users to `pip install powergridsynth`, a package that does not exist. + +### Licence + +- GridStudio is released under the Apache License 2.0, and the repository now contains the `LICENSE` file. The README previously said MIT, with no licence file to back it. + +### Repository + +- Built documentation (`docs/_build/`) and generated output (`output/`) are no longer tracked. +- The version is defined once, in `powergrid_synth/__init__.py`. + +## 0.1.1 + +Initial release. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c3fb23e --- /dev/null +++ b/README.md @@ -0,0 +1,395 @@ +# GridStudio + +[![CI](https://github.com/mshyang/GridStudio/actions/workflows/ci.yml/badge.svg)](https://github.com/mshyang/GridStudio/actions/workflows/ci.yml) +[![Documentation](https://readthedocs.org/projects/power-grid-synthesizer/badge/?version=latest)](https://power-grid-synthesizer.readthedocs.io/en/latest/) +![Python Version](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue) +[![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE) + +GridStudio generates realistic **synthetic power grids**: multi-voltage transmission networks and radial distribution feeders, complete with bus types, generation, load, dispatch and line parameters. Grids come back as NetworkX graphs that you can export to standard power-system formats or run through a power-flow solver. + +It is meant for work that needs many plausible grids when real network data is scarce or confidential: benchmarking, simulation studies, and training data for machine-learning models of power grids. + +- **Transmission grids** use the [Chung-Lu-Chain (CLC)](https://arxiv.org/abs/1711.11098) graph model, which reproduces a prescribed degree distribution and diameter per voltage level. Bus types, generation and load (active and reactive), dispatch, and line impedances and limits are then assigned from empirical statistics of real grids (NYISO, WECC). +- **Distribution feeders** use the algorithm of [Schweitzer et al. (2017)](https://doi.org/10.1109/JETCAS.2017.2682934), producing radial MV/LV trees with realistic cable types, cable lengths, loads and distributed generation. + +> **Package name.** The Python package is called `powergrid_synth`, the project's earlier name. You install and import it under that name. + +## Contents + +- [Install](#install) +- [Transmission grids](#transmission-grids) +- [Distribution feeders](#distribution-feeders) +- [Export and power flow](#export-and-power-flow) +- [Progress output](#progress-output) +- [Examples](#examples) +- [Package layout](#package-layout) +- [Documentation](#documentation) +- [Development](#development) +- [References](#references) +- [License](#license) + +## Install + +GridStudio is not on PyPI yet, so install it from GitHub. Python 3.10, 3.11 and 3.12 are supported. + +```bash +pip install "powergrid_synth[export] @ git+https://github.com/mshyang/GridStudio" +``` + +The `[export]` extra is what most people want. Without it you get the core only: + +| Install | Dependencies | What works | +|---------|--------------|------------| +| core: `pip install git+https://github.com/mshyang/GridStudio` | numpy, scipy, networkx, matplotlib, pandas | Building grids from your own specifications (`mode="synthetic"`, `mode="default"`), every pipeline stage, analysis and plotting | +| with `[export]` | adds pandapower, pypowsybl, numba, lightsim2grid, xlsxwriter, openpyxl | Everything above, plus cloning a reference grid (`mode="reference"`), reading and writing grid files, and power flow | + +If you call something that needs the extra without having it, the error message contains the install command. + +## Transmission grids + +### Quick start + +`synthesize()` runs the whole pipeline in one call. There are two modes. + +```python +from powergrid_synth import synthesize + +# Mode I: clone the statistical profile of an existing grid +grid = synthesize( + mode="reference", + reference_case="case118", # a pandapower or pypowsybl built-in, or pass reference_file=... + seed=42, + output_dir="output", + output_name="ieee118_clone", + export_formats=["json", "cgmes", "matpower"], +) + +# Mode II: build a grid from your own specification (no reference needed) +grid = synthesize( + mode="synthetic", + level_specs=[ # one entry per voltage level, highest voltage first + {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, + {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, + {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, + ], + connection_specs={ # transformers between level pairs + (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, + (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, + }, + seed=42, + export_formats=None, # just return the graph, write nothing +) +``` + +Each call prints one line per stage: + +```text +[1] Loaded reference grid: 118 nodes, 179 edges. +[2] Topology generated: 123 nodes, 171 edges. +[3] Bus types assigned: Gen: 28 (23%), Load: 68 (55%), Conn: 27 (22%) +[4] Generation capacities: total = 10889.0 MW +[5] Loads allocated: total P = 8062.9 MW, Q = 3685.6 Mvar (74% loading) +[6] Generation dispatched: 8101.4 MW (reserve 2787.7 MW) +[7] Transmission lines: 171 lines, avg capacity = 662.7 MVA +... +``` + +Things worth knowing: + +- **The same `seed` gives the same grid.** +- **The number of buses is approximate.** The CLC model pads each level's degree sequence and only the largest connected component is kept, so the result can be smaller or larger than requested. Twelve seeds of the 500-bus specification above gave 420 to 473 buses; twelve clones of the 118-bus IEEE case gave 118 to 126. Check `grid.number_of_nodes()`. +- **Files are written by default.** If you leave `export_formats` out, a JSON file is written to `output/synthetic_grid.json`, replacing any file of that name. Set `output_name` per grid, or pass `export_formats=None`. +- In a level specification, `n` is the number of buses, `avg_k` the average degree, `diam` the target diameter and `dist_type` the degree distribution (`"dgln"` discrete generalised log-normal, `"dpl"` discrete power law, `"poisson"`). + +See [`examples/transmission/Synthesize.ipynb`](examples/transmission/Synthesize.ipynb) for a full walkthrough. + +### What you get back + +A `PowerGridGraph`, which is a `networkx.Graph` with one extra method, `grid.level(i)`, returning the subgraph of one voltage level. Everything is stored in node and edge attributes: + +| On | Attribute | Meaning | +|----|-----------|---------| +| node | `voltage_level` | Voltage level index, `0` being the highest voltage | +| node | `bus_type` | `'Gen'`, `'Load'` or `'Conn'` (connection bus, neither generation nor load) | +| node | `pg_max` | Generation capacity in MW (generator buses) | +| node | `pg` | Dispatched generation in MW (generator buses) | +| node | `pl`, `ql` | Active load in MW and reactive load in Mvar (load buses) | +| edge | `type` | `'line'` within a level, `'transformer'` between levels | +| edge | `r`, `x`, `z` | Resistance, reactance and impedance magnitude in per unit | +| edge | `capacity` | Thermal limit in MW | +| graph | `grid.graph["base_kv_map"]` | Level index to kV, taken from the reference grid (reference mode only) | + +```python +import networkx as nx + +generators = [n for n, d in grid.nodes(data=True) if d["bus_type"] == "Gen"] +total_load = sum(nx.get_node_attributes(grid, "pl").values()) +backbone = grid.level(0) +``` + +### Step by step + +Use the individual stages when you want to inspect or replace one of them. Each stage stores its result on the graph and also returns it as a dictionary, so the stages chain without any glue code. + +```python +from powergrid_synth import ( + InputConfigurator, PowerGridGenerator, BusTypeAllocator, + CapacityAllocator, LoadAllocator, GenerationDispatcher, + TransmissionLineAllocator, GridVisualizer, +) + +level_specs = [ + {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, + {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, + {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, +] +connection_specs = { + (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, + (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, +} + +# 1. Turn the specification into degree sequences +params = InputConfigurator(seed=42).create_params(level_specs, connection_specs) + +# 2. Generate the topology (keep_lcc=True drops disconnected fragments) +grid = PowerGridGenerator(seed=42).generate_grid( + degrees_by_level=params["degrees_by_level"], + diameters_by_level=params["diameters_by_level"], + transformer_degrees=params["transformer_degrees"], + keep_lcc=True, +) + +# 3. Run the stages in this order; each one reads what the previous ones wrote +bus_types = BusTypeAllocator(grid).allocate() # writes bus_type +capacities = CapacityAllocator(grid).allocate() # writes pg_max +loads = LoadAllocator(grid) +loads.allocate(loading_level="H") # writes pl +loads.allocate_reactive() # writes ql +dispatch = GenerationDispatcher(grid).dispatch() # writes pg +limits = TransmissionLineAllocator(grid).allocate() # writes r, x, z, capacity + +# 4. Plot +GridVisualizer().plot_grid(grid, layout="yifan_hu", title="Synthetic grid") +``` + +Running a stage before the one it depends on raises an error that names the missing step. Pass `update_graph=False` to a stage if you only want the returned dictionary. + +| Stage | Class | Method | +|-------|-------|--------| +| 1. Topology | `PowerGridGenerator` | CLC graph model per voltage level; k-stars model for transformers between levels | +| 2. Bus types | `BusTypeAllocator` | Entropy-based Artificial Immune System search that reproduces the observed correlation between bus type and node degree | +| 3. Generation capacity | `CapacityAllocator` | Exponential sampling with heavy tail, assigned by a 2-D capacity-degree probability table | +| 4. Load | `LoadAllocator` | 2-D load-degree probability table; reactive load from sampled power factors | +| 5. Dispatch | `GenerationDispatcher` | Uncommitted, partially committed and fully committed units, then iterative balancing against load | +| 6. Lines | `TransmissionLineAllocator` | Log-normal impedances, Lévy-stable line angles, DC power-flow based swapping, limits from a 2-D table | + +The statistical tables for the reference systems (NYISO-2935, WECC-16994) live in `powergrid_synth/core/reference_data.py`; choose between them with `ref_sys_id`. + +## Distribution feeders + +### Quick start + +```python +from powergrid_synth import synthesize_distribution + +# Mode I: fit the model to a reference network, then generate similar feeders +feeders = synthesize_distribution( + mode="reference", + reference_case="cigre_lv", + n_feeders=5, + n_nodes=20, + total_load_mw=0.5, + seed=42, + output_dir="output", # omit to write nothing + export_formats=["json"], +) + +# Mode II: use the published default parameters (no reference needed) +feeders = synthesize_distribution( + mode="default", + n_feeders=10, + n_nodes=30, + total_load_mw=0.8, + total_gen_mw=0.1, + seed=7, +) + +feeder = feeders[0] +print(feeder.max_hop, feeder.total_load_mw, feeder.total_gen_mw, feeder.is_radial) +``` + +The result is a list of `DistributionGrid` objects, again `networkx.Graph` subclasses, with helpers such as `max_hop`, `total_load_mw`, `total_gen_mw`, `is_radial`, `nodes_at_hop(h)` and `nodes_by_type(...)`. + +| On | Attribute | Meaning | +|----|-----------|---------| +| node | `h` | Hop distance from the source (node `0`) | +| node | `node_type` | `'load'`, `'injection'` (generation) or `'intermediate'` (no load) | +| node | `P_mw`, `Q_mvar` | Active and reactive power; positive is load, negative is generation | +| node | `pf` | Power factor | +| edge | `cable_type`, `max_i_ka` | Cable from the built-in library and its current rating | +| edge | `length_km`, `r_ohm`, `x_ohm` | Cable length and total resistance and reactance | + +Each feeder's loads add up to exactly `total_load_mw` and its generation to `total_gen_mw`. Pass `match_totals=False` for the unscaled sampling used up to version 0.1.1, which overshoots the requested load on larger feeders. + +### Step by step + +```python +from powergrid_synth.distribution import ( + SchweitzerFeederGenerator, pandapower_to_feeders, fit_params_from_feeders, +) + +# Option A: default parameters (Table III of Schweitzer et al.) +feeder = SchweitzerFeederGenerator(seed=42).generate_feeder( + n_nodes=50, total_load_mw=8.0, total_gen_mw=1.0, +) + +# Option B: fit the parameters to a real network first +import pandapower.networks as pn + +reference = pandapower_to_feeders(pn.create_cigre_network_lv()) +params = fit_params_from_feeders(reference) +feeder = SchweitzerFeederGenerator(params=params, seed=0).generate_feeder( + n_nodes=44, total_load_mw=0.7, +) +``` + +| Step | What happens | +|------|--------------| +| 1. Nodes | Hop distances from a negative binomial distribution, power factors from an empirical CDF | +| 2. Tree | Target degrees from a mixture of Gammas, connected bottom-up into a radial tree | +| 3. Node roles | Intermediate, injection and load nodes chosen by hop distance; power shared out with sampled deviations | +| 4. Cable types | Picked from a cable library by estimated downstream current | +| 5. Cable lengths | Modified Cauchy distribution with a hop-dependent upper bound | + +## Export and power flow + +Grids convert to pandapower and pypowsybl networks, and from there to files: + +```python +from powergrid_synth import GridExporter, nx_to_pandapower, load_grid +import pandapower as pp + +exporter = GridExporter(grid) +exporter.to_json("grid.json") # pandapower JSON +exporter.to_matpower("grid") # writes grid.mat +exporter.to_cgmes("grid_cgmes") # writes the EQ / SSH / SV / TP profiles +exporter.to_pypowsybl("grid.xiidm", format="XIIDM") + +net = nx_to_pandapower(grid) # run a power flow yourself +pp.rundcpp(net) + +same_grid = load_grid("grid.xiidm") # read any pypowsybl-supported file back in +``` + +| Via | Format | Call | +|-----|--------|------| +| pandapower | JSON | `GridExporter.to_json()` | +| | Excel (.xlsx) | `GridExporter.to_excel()` | +| | SQLite | `GridExporter.to_sqlite()` | +| | Pickle | `GridExporter.to_pickle()` | +| pypowsybl | CGMES | `GridExporter.to_cgmes()` | +| | MATPOWER | `GridExporter.to_matpower()` | +| | PSS/E | `GridExporter.to_psse()` | +| | XIIDM, BIIDM, JIIDM, AMPL | `GridExporter.to_pypowsybl(path, format=...)` | + +In `synthesize(export_formats=[...])` the names are `"json"`, `"excel"`, `"sqlite"`, `"pickle"`, `"xiidm"`, `"cgmes"`, `"matpower"` and `"psse"`. UCTE export is not supported, because UCTE requires its own node naming scheme. + +```text +Export: NetworkX <-> pandapower -> pypowsybl -> CGMES / XIIDM / MATPOWER / PSS/E / ... +Import: CGMES / XIIDM / MATPOWER / PSS/E / ... -> pypowsybl -> NetworkX (load_grid, pypowsybl_to_nx) +``` + +| Solver | Library | Type | Call | +|--------|---------|------|------| +| Newton-Raphson | pandapower | AC | `pp.runpp(net)` | +| Linear | pandapower | DC | `pp.rundcpp(net)` | +| Load flow | pypowsybl | AC | `pypowsybl.loadflow.run_ac(net)` | +| Load flow | pypowsybl | DC | `pypowsybl.loadflow.run_dc(net)` | +| Built-in | powergrid_synth | DC | `DCPowerFlow(grid).run()` | + +**AC convergence is not guaranteed.** Generation and load are balanced for a DC power flow; voltages and reactive power are not tuned. On 20 seeded clones of the IEEE-118 case, pandapower's DC power flow solved all 20 and its AC Newton-Raphson converged on 12. If you need AC-feasible cases, run the AC power flow and keep the grids that converge. [`examples/transmission/ieee_test.ipynb`](examples/transmission/ieee_test.ipynb) shows export and power-flow validation in full. + +## Progress output + +`synthesize()` and `synthesize_distribution()` print one line per stage. Pass `verbose=False` to silence a call, or set the level for the whole package: + +```python +import powergrid_synth as pgs + +pgs.set_verbosity("silent") # nothing +pgs.set_verbosity("warning") # problems only +pgs.set_verbosity("info") # one line per stage (default) +pgs.set_verbosity("debug") # per-level and per-iteration detail from every stage +``` + +Messages go through the standard `logging` module under the logger name `powergrid_synth`. + +## Examples + +Start with the two notebooks in bold. The Colab versions install the package for you. + +### Transmission + +| Notebook | Topic | Colab | +|----------|-------|-------| +| [**Synthesize**](examples/transmission/Synthesize.ipynb) | The full pipeline in one call, both modes | | +| [SynthesizePypowsybl](examples/transmission/SynthesizePypowsybl.ipynb) | Reference grids from pypowsybl built-ins and CGMES files | | +| [TopologyGeneration](examples/transmission/TopologyGeneration.ipynb) | CLC topology generation and input configuration | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/TopologyGeneration_colab.ipynb) | +| [BusTypeAssignment](examples/transmission/BusTypeAssignment.ipynb) | Bus-type allocation | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/BusTypeAssignment_colab.ipynb) | +| [GenLoadSettings](examples/transmission/GenLoadSettings.ipynb) | Generation capacity and load allocation | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/GenLoadSettings_colab.ipynb) | +| [ieee_test](examples/transmission/ieee_test.ipynb) | Validation against IEEE test cases, export and power flow | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/ieee_test_colab.ipynb) | +| [pegase9241_test](examples/transmission/pegase9241_test.ipynb) | A large case: PEGASE 9241 | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/pegase9241_test_colab.ipynb) | +| [rte7k_from_source_file](examples/transmission/rte7k_from_source_file.ipynb) | A large case read from a file: RTE 7000 (20 MB notebook, too large for GitHub's preview) | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/rte7k_from_source_file_colab.ipynb) | + +### Distribution + +| Notebook | Topic | +|----------|-------| +| [**DistributionSynth**](examples/distribution/DistributionSynth.ipynb) | Feeder synthesis with default and custom parameters | +| [DistributionSynthFromRef](examples/distribution/DistributionSynthFromRef.ipynb) | Fitting the parameters to a pandapower network | +| [DistributionSynthPypowsybl](examples/distribution/DistributionSynthPypowsybl.ipynb) | Loading CIGRE LV from CGMES, full pipeline and one-call version | +| [CLC4Distribution](examples/distribution/CLC4Distribution.ipynb) | Comparing CLC and Schweitzer topologies at distribution scale | + +## Package layout + +```text +powergrid_synth/ +├── transmission/ CLC pipeline: generator, input_configurator, bus_type_allocator, +│ capacity_allocator, load_allocator, generation_dispatcher, +│ transmission (lines), synthesize (one-call function) +├── distribution/ Schweitzer pipeline: distribution_synthesis, distribution_params, +│ distribution_analysis (fitting), distribution_converter, +│ distribution_validation, synthesize (one-call function) +└── core/ Shared: grid_graph (graph classes), exporter, data_format_converter, + dcpf (built-in DC power flow), analysis, comparison, + hierarchical_analysis, visualization, reference_data +``` + +Everything in the examples above can be imported from `powergrid_synth` directly; the distribution building blocks are in `powergrid_synth.distribution`. + +## Documentation + +Theory, tutorials and the API reference are at [power-grid-synthesizer.readthedocs.io](https://power-grid-synthesizer.readthedocs.io/en/latest/). + +## Development + +```bash +git clone https://github.com/mshyang/GridStudio.git +cd GridStudio +pip install -e ".[dev,export]" +pytest +``` + +Changes between versions are listed in [CHANGELOG.md](CHANGELOG.md). + +## References + +1. S. G. Aksoy, E. Purvine, E. Cotilla-Sanchez, M. Halappanavar (2019). "A Generative Graph Model for Electrical Infrastructure Networks." *Journal of Complex Networks*, 7(1), 128–162. [arXiv:1711.11098](https://arxiv.org/abs/1711.11098), [doi:10.1093/comnet/cny016](https://doi.org/10.1093/comnet/cny016) +2. S. H. Elyas, Z. Wang (2017). "Improved Synthetic Power Grid Modeling With Correlated Bus Type Assignments." *IEEE Transactions on Power Systems*, 32(5), 3391–3402. [doi:10.1109/TPWRS.2016.2634318](https://doi.org/10.1109/TPWRS.2016.2634318) +3. S. H. Elyas, Z. Wang, R. J. Thomas (2017). "On the Statistical Settings of Generation and Load in a Synthetic Grid Modeling." [arXiv:1706.09294](https://arxiv.org/abs/1706.09294) +4. S. Sadeghian, S. H. Elyas, Z. Wang (2018). "A Novel Algorithm for Statistical Assignment of Transmission Capacities in Synthetic Grid Modeling." *IEEE Power & Energy Society General Meeting*. [doi:10.1109/PESGM.2018.8585532](https://doi.org/10.1109/PESGM.2018.8585532) +5. E. Schweitzer, A. Scaglione, A. Monti, G. A. Pagani (2017). "Automated Generation Algorithm for Synthetic Medium Voltage Radial Distribution Systems." *IEEE Journal on Emerging and Selected Topics in Circuits and Systems*, 7(2), 271–284. [doi:10.1109/JETCAS.2017.2682934](https://doi.org/10.1109/JETCAS.2017.2682934) + +## License + +GridStudio is released under the [Apache License 2.0](LICENSE). diff --git a/docs/README.md b/docs/README.md index e728597..65a401a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,261 +1,98 @@ # Getting Started -**Source code:** [GitHub repository](https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer) +**Source code:** [github.com/mshyang/GridStudio](https://github.com/mshyang/GridStudio) + +GridStudio's Python package is called `powergrid_synth`, the project's earlier name. You install and import it under that name. ## Installation -### From PyPI +GridStudio is not on PyPI yet, so install it from GitHub. Python 3.10, 3.11 and 3.12 are supported. ```bash -pip install powergridsynth +pip install "powergrid_synth[export] @ git+https://github.com/mshyang/GridStudio" ``` -### From source (development mode) +The `[export]` extra is what most people want. Without it you get the core only: -1. Clone the repository: -```bash -git clone https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git -cd Chung_Lu_Chain-synthesizer -``` +| Install | Dependencies | What works | +|---------|--------------|------------| +| core: `pip install git+https://github.com/mshyang/GridStudio` | numpy, scipy, networkx, matplotlib, pandas | Building grids from your own specifications (`mode="synthetic"`, `mode="default"`), every pipeline stage, analysis and plotting | +| with `[export]` | adds pandapower, pypowsybl, numba, lightsim2grid, xlsxwriter, openpyxl | Everything above, plus cloning a reference grid (`mode="reference"`), reading and writing grid files, and power flow | -2. Create and activate a virtual environment (e.g. with `uv`): -```bash -uv venv powergrid -source powergrid/bin/activate -``` +If you call something that needs the extra without having it, the error message contains the install command. -3. Install in editable mode with development dependencies: -```bash -uv pip install -e ".[dev]" -``` - -For one-call synthesis, converters, exporters, and power-flow integrations, install the optional extras as well: +### From source ```bash -uv pip install -e ".[dev,export]" +git clone https://github.com/mshyang/GridStudio.git +cd GridStudio +pip install -e ".[dev,export]" +pytest ``` -Core dependencies: `numpy`, `scipy`, `networkx`, `matplotlib`, `pandas`. - -Optional export/power-flow dependencies: `pandapower`, `numba`, `lightsim2grid`, `pypowsybl`, `pypowsybl-jupyter`. - ---- - -## Transmission Grid Synthesis - -### Quick Start - -The high-level `synthesize()` function runs the entire CLC transmission pipeline in one call: +## A first grid ```python from powergrid_synth import synthesize -# Mode I — clone an existing grid's statistical profile grid = synthesize( mode="reference", - reference_case="case118", + reference_case="case118", # clone the statistical profile of the IEEE 118-bus case seed=42, - export_formats=["json", "cgmes", "matpower"], -) - -# Mode II — fully synthetic from user-specified parameters -grid = synthesize( - mode="synthetic", - level_specs=[ - {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, - {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, - {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, - ], - connection_specs={ - (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, - (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, - }, - seed=42, - export_formats=["json", "matpower"], -) -``` - -See `examples/transmission/Synthesize.ipynb` for a full walkthrough. - -### Step-by-Step Usage - -For fine-grained control over each pipeline stage: - -```python -from powergrid_synth import ( - InputConfigurator, PowerGridGenerator, BusTypeAllocator, - CapacityAllocator, LoadAllocator, GenerationDispatcher, - TransmissionLineAllocator, GridVisualizer, -) - -# 1. Configure voltage levels and inter-level connections -level_specs = [ - {'n': 50, 'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'}, - {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'}, - {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'}, -] -connection_specs = { - (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15}, - (1, 2): {'type': 'k-stars', 'c': 0.15, 'gamma': 4.15}, -} - -config = InputConfigurator(seed=42) -params = config.create_params(level_specs, connection_specs) - -# 2. Generate topology (CLC model) -gen = PowerGridGenerator(seed=42) -grid = gen.generate_grid( - degrees_by_level=params['degrees_by_level'], - diameters_by_level=params['diameters_by_level'], - transformer_degrees=params['transformer_degrees'], + export_formats=None, # return the graph only; pass e.g. ["json", "matpower"] to write files ) -# 3. Assign bus types, generation/load, dispatch, and line parameters -BusTypeAllocator(grid).allocate() -CapacityAllocator(grid).allocate() -LoadAllocator(grid).allocate() -GenerationDispatcher(grid).dispatch() -TransmissionLineAllocator(grid).allocate() - -# 4. Visualize -GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid") +print(grid) # PowerGridGraph with 123 nodes and 171 edges +print(grid.nodes[0]) # voltage_level, bus_type and, depending on the type, pg_max / pg / pl / ql ``` -### Synthesis Pipeline - -| Step | Module | Method | -|------|--------|--------| -| **1. Topology generation** | `generator.py`, `preprocessing.py`, `edge_creation.py`, `transformer_edges.py` | CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model | -| **2. Bus-type assignment** | `bus_type_allocator.py` | Entropy-based AIS optimisation reproducing empirical 2-D joint distribution of bus types and node degrees | -| **3. Generation capacity** | `capacity_allocator.py` | Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table | -| **4. Load allocation** | `load_allocator.py` | Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model | -| **5. Generation dispatch** | `generation_dispatcher.py` | Three-category partitioning with 2-D bin matching and iterative balancing | -| **6. Transmission lines** | `transmission.py`, `dcpf.py` | LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment | - -### Modules - -| Module | Description | -|--------|-------------| -| `generator.py` | Main orchestrator — `PowerGridGenerator` | -| `preprocessing.py` | Backbone setup and spatial-box assignment (Algorithm 1) | -| `edge_creation.py` | Intra-level edge creation via CLC model (Algorithm 2) | -| `transformer_edges.py` | Inter-level connections via k-stars model (Algorithm 3) | -| `input_configurator.py` | High-level specification → detailed input parameters | -| `deg_dist_optimizer.py` | Optimises distribution parameters (DGLN α,β / Power-Law γ) to match target average degree | -| `bus_type_allocator.py` | AIS-based Generator / Load / Connection bus-type assignment | -| `capacity_allocator.py` | Generation capacity (Pg_max) allocation | -| `load_allocator.py` | Active-power load (Pl) and reactive-power load (Ql) allocation | -| `generation_dispatcher.py` | Dispatch factor (α) assignment and generation–load balancing | -| `transmission.py` | Branch impedance (R, X) and thermal capacity (F_max) allocation | -| `dcpf.py` | Lightweight DC power-flow solver | -| `reference_data.py` | Pre-computed empirical statistics for NYISO, WECC reference systems | - ---- +The result is a `networkx.Graph` subclass. Buses carry `voltage_level`, `bus_type` (`'Gen'`, `'Load'`, `'Conn'`), `pg_max` and `pg` (generators, MW), `pl` and `ql` (loads, MW and Mvar). Branches carry `type` (`'line'` or `'transformer'`), `r`, `x`, `z` (per unit) and `capacity` (MW). -## Distribution Grid Synthesis +Two things to keep in mind: -### Quick Start +- The same `seed` gives the same grid. +- The number of buses is approximate, because only the largest connected component is kept. Check `grid.number_of_nodes()`. -The high-level `synthesize_distribution()` function generates realistic radial MV/LV feeders in one call: +## A first feeder ```python from powergrid_synth import synthesize_distribution -# Mode I — fit parameters from a reference distribution network -feeders = synthesize_distribution( - mode="reference", - reference_case="cigre_lv", - n_feeders=5, - n_nodes=20, - total_load_mw=0.5, - seed=42, - output_dir="output", - export_formats=["json"], -) - -# Mode II — use default Table III parameters (no reference needed) feeders = synthesize_distribution( mode="default", - n_feeders=10, + n_feeders=3, n_nodes=30, total_load_mw=0.8, seed=7, ) -``` -See `examples/distribution/DistributionSynth.ipynb` and `examples/distribution/DistributionSynthFromRef.ipynb` for detailed walkthroughs. - -### Synthesis Pipeline - -| Step | Description | -|------|-------------| -| **1. Tree topology** | Random radial tree generation with branching and hop-count constraints | -| **2. Cable types** | Assign cable types from a realistic catalogue (weighted by frequency) | -| **3. Cable lengths** | Sample cable lengths from a Cauchy distribution fitted to reference data | -| **4. Loads** | Distribute total load across buses | -| **5. Generation** | Assign distributed generation (PV, etc.) to buses | - -### Modules - -| Module | Description | -|--------|-------------| -| `distribution_synthesis.py` | `SchweetzerFeederGenerator` — generates a single radial feeder graph | -| `distribution_params.py` | `FeederParams` dataclass with default Table III values | -| `distribution_analysis.py` | `fit_params_from_feeders` — extract statistical parameters from reference feeders | -| `distribution_converter.py` | `pandapower_to_feeders`, `pypowsybl_to_feeders` — convert real networks to feeder graphs | -| `distribution_input_model.py` | Input configuration and validation | -| `distribution_validation.py` | Structural and electrical validation of generated feeders | -| `synthesize.py` | `synthesize_distribution` — one-call high-level function | - ---- - -## Shared Infrastructure - -### Analysis, Export & Visualisation - -| Module | Description | -|--------|-------------| -| `grid_graph.py` | `PowerGridGraph`, `TransmissionGrid`, `DistributionGrid` — NetworkX Graph subclasses with voltage-level filtering and radial-tree helpers | -| `analysis.py` | Topological metrics (diameter, clustering, path length) | -| `hierarchical_analysis.py` | Per-voltage-level analysis | -| `comparison.py` | Side-by-side comparison of synthetic vs. reference grids | -| `visualization.py` | Plotting routines (Yifan Hu layout, per-level views, interactive dashboards) | -| `exporter.py` | Export to **JSON, Excel, SQLite, Pickle** (pandapower) and **CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL** (pypowsybl) | -| `data_format_converter.py` | Conversion between NetworkX ↔ pandapower ↔ pypowsybl; import from CGMES/XIIDM/MATPOWER/PSS·E via `load_grid` | +feeder = feeders[0] +print(feeder.max_hop, feeder.total_load_mw, feeder.is_radial) +``` -### Export Formats +## Progress output -| Via | Format | Method | -|----|--------|--------| -| **pandapower** | JSON | `GridExporter.to_json()` | -| | Excel (.xlsx) | `GridExporter.to_excel()` | -| | SQLite | `GridExporter.to_sqlite()` | -| | Pickle | `GridExporter.to_pickle()` | -| **pypowsybl** | CGMES | `GridExporter.to_cgmes()` | -| | XIIDM | `GridExporter.to_pypowsybl(format='XIIDM')` | -| | MATPOWER | `GridExporter.to_matpower()` | -| | PSS/E | `GridExporter.to_psse()` | -| | UCTE, AMPL, BIIDM, JIIDM | `GridExporter.to_pypowsybl(format=...)` | +Both functions print one line per stage. Pass `verbose=False` to silence a call, or set the level for the whole package: -### Power-Flow Solvers +```python +import powergrid_synth as pgs -| Solver | Library | Type | Call | -|--------|---------|------|------| -| Newton-Raphson AC | **pandapower** | AC | `pp.runpp(net)` | -| Linear DC | **pandapower** | DC | `pp.rundcpp(net)` | -| AC load-flow | **pypowsybl** | AC | `pypowsybl.loadflow.run_ac(net)` | -| DC load-flow | **pypowsybl** | DC | `pypowsybl.loadflow.run_dc(net)` | -| Built-in DCPF | **powergrid_synth** | DC | `DCPowerFlow(graph).run()` | +pgs.set_verbosity("silent") # nothing +pgs.set_verbosity("warning") # problems only +pgs.set_verbosity("info") # one line per stage (default) +pgs.set_verbosity("debug") # per-level and per-iteration detail from every stage +``` -## Testing +## Where next -```bash -pytest tests/ -v -``` +- The [home page](index.rst) summarises both pipelines, the step-by-step API, export formats and power-flow solvers. +- The [examples](examples/index.rst) are notebooks covering each stage. +- The [theory](theory/index.rst) pages explain the models behind each stage. -## Building Documentation +## Building the documentation ```bash +pip install -r docs/requirements.txt cd docs make html ``` diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo deleted file mode 100644 index 35045ac..0000000 --- a/docs/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ceb4f7c01dddd0f636156f4f85225e87 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/README.html b/docs/_build/html/README.html deleted file mode 100644 index 8a8b6c0..0000000 --- a/docs/_build/html/README.html +++ /dev/null @@ -1,631 +0,0 @@ - - - - - - - - - Getting Started — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Getting Started

-

Source code: GitHub repository

-
-

Installation

-
-

From PyPI

-
pip install powergridsynth
-
-
-
-
-

From source (development mode)

-
    -
  1. Clone the repository:

  2. -
-
git clone https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git
-cd Chung_Lu_Chain-synthesizer
-
-
-
    -
  1. Create and activate a virtual environment (e.g. with uv):

  2. -
-
uv venv powergrid
-source powergrid/bin/activate
-
-
-
    -
  1. Install in editable mode with development dependencies:

  2. -
-
uv pip install -e ".[dev]"
-
-
-

For one-call synthesis, converters, exporters, and power-flow integrations, install the optional extras as well:

-
uv pip install -e ".[dev,export]"
-
-
-

Core dependencies: numpy, scipy, networkx, matplotlib, pandas.

-

Optional export/power-flow dependencies: pandapower, numba, lightsim2grid, pypowsybl, pypowsybl-jupyter.

-
-
-
-
-

Transmission Grid Synthesis

-
-

Quick Start

-

The high-level synthesize() function runs the entire CLC transmission pipeline in one call:

-
from powergrid_synth import synthesize
-
-# Mode I — clone an existing grid's statistical profile
-grid = synthesize(
-    mode="reference",
-    reference_case="case118",
-    seed=42,
-    export_formats=["json", "cgmes", "matpower"],
-)
-
-# Mode II — fully synthetic from user-specified parameters
-grid = synthesize(
-    mode="synthetic",
-    level_specs=[
-        {"n": 50,  "avg_k": 3.5, "diam": 10, "dist_type": "dgln"},
-        {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"},
-        {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"},
-    ],
-    connection_specs={
-        (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15},
-        (1, 2): {"type": "k-stars", "c": 0.15,  "gamma": 4.15},
-    },
-    seed=42,
-    export_formats=["json", "matpower"],
-)
-
-
-

See examples/transmission/Synthesize.ipynb for a full walkthrough.

-
-
-

Step-by-Step Usage

-

For fine-grained control over each pipeline stage:

-
from powergrid_synth import (
-    InputConfigurator, PowerGridGenerator, BusTypeAllocator,
-    CapacityAllocator, LoadAllocator, GenerationDispatcher,
-    TransmissionLineAllocator, GridVisualizer,
-)
-
-# 1. Configure voltage levels and inter-level connections
-level_specs = [
-    {'n': 50,  'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'},
-    {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'},
-    {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'},
-]
-connection_specs = {
-    (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15},
-    (1, 2): {'type': 'k-stars', 'c': 0.15,  'gamma': 4.15},
-}
-
-config = InputConfigurator(seed=42)
-params = config.create_params(level_specs, connection_specs)
-
-# 2. Generate topology (CLC model)
-gen = PowerGridGenerator(seed=42)
-grid = gen.generate_grid(
-    degrees_by_level=params['degrees_by_level'],
-    diameters_by_level=params['diameters_by_level'],
-    transformer_degrees=params['transformer_degrees'],
-)
-
-# 3. Assign bus types, generation/load, dispatch, and line parameters
-BusTypeAllocator(grid).allocate()
-CapacityAllocator(grid).allocate()
-LoadAllocator(grid).allocate()
-GenerationDispatcher(grid).dispatch()
-TransmissionLineAllocator(grid).allocate()
-
-# 4. Visualize
-GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid")
-
-
-
-
-

Synthesis Pipeline

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Step

Module

Method

1. Topology generation

generator.py, preprocessing.py, edge_creation.py, transformer_edges.py

CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model

2. Bus-type assignment

bus_type_allocator.py

Entropy-based AIS optimisation reproducing empirical 2-D joint distribution of bus types and node degrees

3. Generation capacity

capacity_allocator.py

Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table

4. Load allocation

load_allocator.py

Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model

5. Generation dispatch

generation_dispatcher.py

Three-category partitioning with 2-D bin matching and iterative balancing

6. Transmission lines

transmission.py, dcpf.py

LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment

-
-
-

Modules

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Module

Description

generator.py

Main orchestrator — PowerGridGenerator

preprocessing.py

Backbone setup and spatial-box assignment (Algorithm 1)

edge_creation.py

Intra-level edge creation via CLC model (Algorithm 2)

transformer_edges.py

Inter-level connections via k-stars model (Algorithm 3)

input_configurator.py

High-level specification → detailed input parameters

deg_dist_optimizer.py

Optimises distribution parameters (DGLN α,β / Power-Law γ) to match target average degree

bus_type_allocator.py

AIS-based Generator / Load / Connection bus-type assignment

capacity_allocator.py

Generation capacity (Pg_max) allocation

load_allocator.py

Active-power load (Pl) and reactive-power load (Ql) allocation

generation_dispatcher.py

Dispatch factor (α) assignment and generation–load balancing

transmission.py

Branch impedance (R, X) and thermal capacity (F_max) allocation

dcpf.py

Lightweight DC power-flow solver

reference_data.py

Pre-computed empirical statistics for NYISO, WECC reference systems

-
-
-
-
-

Distribution Grid Synthesis

-
-

Quick Start

-

The high-level synthesize_distribution() function generates realistic radial MV/LV feeders in one call:

-
from powergrid_synth import synthesize_distribution
-
-# Mode I — fit parameters from a reference distribution network
-feeders = synthesize_distribution(
-    mode="reference",
-    reference_case="cigre_lv",
-    n_feeders=5,
-    n_nodes=20,
-    total_load_mw=0.5,
-    seed=42,
-    output_dir="output",
-    export_formats=["json"],
-)
-
-# Mode II — use default Table III parameters (no reference needed)
-feeders = synthesize_distribution(
-    mode="default",
-    n_feeders=10,
-    n_nodes=30,
-    total_load_mw=0.8,
-    seed=7,
-)
-
-
-

See examples/distribution/DistributionSynth.ipynb and examples/distribution/DistributionSynthFromRef.ipynb for detailed walkthroughs.

-
-
-

Synthesis Pipeline

- - - - - - - - - - - - - - - - - - - - - - - -

Step

Description

1. Tree topology

Random radial tree generation with branching and hop-count constraints

2. Cable types

Assign cable types from a realistic catalogue (weighted by frequency)

3. Cable lengths

Sample cable lengths from a Cauchy distribution fitted to reference data

4. Loads

Distribute total load across buses

5. Generation

Assign distributed generation (PV, etc.) to buses

-
-
-

Modules

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Module

Description

distribution_synthesis.py

SchweetzerFeederGenerator — generates a single radial feeder graph

distribution_params.py

FeederParams dataclass with default Table III values

distribution_analysis.py

fit_params_from_feeders — extract statistical parameters from reference feeders

distribution_converter.py

pandapower_to_feeders, pypowsybl_to_feeders — convert real networks to feeder graphs

distribution_input_model.py

Input configuration and validation

distribution_validation.py

Structural and electrical validation of generated feeders

synthesize.py

synthesize_distribution — one-call high-level function

-
-
-
-
-

Shared Infrastructure

-
-

Analysis, Export & Visualisation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Module

Description

grid_graph.py

PowerGridGraph, TransmissionGrid, DistributionGrid — NetworkX Graph subclasses with voltage-level filtering and radial-tree helpers

analysis.py

Topological metrics (diameter, clustering, path length)

hierarchical_analysis.py

Per-voltage-level analysis

comparison.py

Side-by-side comparison of synthetic vs. reference grids

visualization.py

Plotting routines (Yifan Hu layout, per-level views, interactive dashboards)

exporter.py

Export to JSON, Excel, SQLite, Pickle (pandapower) and CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL (pypowsybl)

data_format_converter.py

Conversion between NetworkX ↔ pandapower ↔ pypowsybl; import from CGMES/XIIDM/MATPOWER/PSS·E via load_grid

-
-
-

Export Formats

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Via

Format

Method

pandapower

JSON

GridExporter.to_json()

Excel (.xlsx)

GridExporter.to_excel()

SQLite

GridExporter.to_sqlite()

Pickle

GridExporter.to_pickle()

pypowsybl

CGMES

GridExporter.to_cgmes()

XIIDM

GridExporter.to_pypowsybl(format='XIIDM')

MATPOWER

GridExporter.to_matpower()

PSS/E

GridExporter.to_psse()

UCTE, AMPL, BIIDM, JIIDM

GridExporter.to_pypowsybl(format=...)

-
-
-

Power-Flow Solvers

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Solver

Library

Type

Call

Newton-Raphson AC

pandapower

AC

pp.runpp(net)

Linear DC

pandapower

DC

pp.rundcpp(net)

AC load-flow

pypowsybl

AC

pypowsybl.loadflow.run_ac(net)

DC load-flow

pypowsybl

DC

pypowsybl.loadflow.run_dc(net)

Built-in DCPF

powergrid_synth

DC

DCPowerFlow(graph).run()

-
-
-
-

Testing

-
pytest tests/ -v
-
-
-
-
-

Building Documentation

-
cd docs
-make html
-
-
-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html deleted file mode 100644 index 8e1dd63..0000000 --- a/docs/_build/html/_modules/index.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - Overview: module code — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • - -
  • -
  • -
-
-
- - -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/_sources/README.md.txt b/docs/_build/html/_sources/README.md.txt deleted file mode 100644 index e728597..0000000 --- a/docs/_build/html/_sources/README.md.txt +++ /dev/null @@ -1,261 +0,0 @@ -# Getting Started - -**Source code:** [GitHub repository](https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer) - -## Installation - -### From PyPI - -```bash -pip install powergridsynth -``` - -### From source (development mode) - -1. Clone the repository: -```bash -git clone https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git -cd Chung_Lu_Chain-synthesizer -``` - -2. Create and activate a virtual environment (e.g. with `uv`): -```bash -uv venv powergrid -source powergrid/bin/activate -``` - -3. Install in editable mode with development dependencies: -```bash -uv pip install -e ".[dev]" -``` - -For one-call synthesis, converters, exporters, and power-flow integrations, install the optional extras as well: - -```bash -uv pip install -e ".[dev,export]" -``` - -Core dependencies: `numpy`, `scipy`, `networkx`, `matplotlib`, `pandas`. - -Optional export/power-flow dependencies: `pandapower`, `numba`, `lightsim2grid`, `pypowsybl`, `pypowsybl-jupyter`. - ---- - -## Transmission Grid Synthesis - -### Quick Start - -The high-level `synthesize()` function runs the entire CLC transmission pipeline in one call: - -```python -from powergrid_synth import synthesize - -# Mode I — clone an existing grid's statistical profile -grid = synthesize( - mode="reference", - reference_case="case118", - seed=42, - export_formats=["json", "cgmes", "matpower"], -) - -# Mode II — fully synthetic from user-specified parameters -grid = synthesize( - mode="synthetic", - level_specs=[ - {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, - {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, - {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, - ], - connection_specs={ - (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, - (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, - }, - seed=42, - export_formats=["json", "matpower"], -) -``` - -See `examples/transmission/Synthesize.ipynb` for a full walkthrough. - -### Step-by-Step Usage - -For fine-grained control over each pipeline stage: - -```python -from powergrid_synth import ( - InputConfigurator, PowerGridGenerator, BusTypeAllocator, - CapacityAllocator, LoadAllocator, GenerationDispatcher, - TransmissionLineAllocator, GridVisualizer, -) - -# 1. Configure voltage levels and inter-level connections -level_specs = [ - {'n': 50, 'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'}, - {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'}, - {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'}, -] -connection_specs = { - (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15}, - (1, 2): {'type': 'k-stars', 'c': 0.15, 'gamma': 4.15}, -} - -config = InputConfigurator(seed=42) -params = config.create_params(level_specs, connection_specs) - -# 2. Generate topology (CLC model) -gen = PowerGridGenerator(seed=42) -grid = gen.generate_grid( - degrees_by_level=params['degrees_by_level'], - diameters_by_level=params['diameters_by_level'], - transformer_degrees=params['transformer_degrees'], -) - -# 3. Assign bus types, generation/load, dispatch, and line parameters -BusTypeAllocator(grid).allocate() -CapacityAllocator(grid).allocate() -LoadAllocator(grid).allocate() -GenerationDispatcher(grid).dispatch() -TransmissionLineAllocator(grid).allocate() - -# 4. Visualize -GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid") -``` - -### Synthesis Pipeline - -| Step | Module | Method | -|------|--------|--------| -| **1. Topology generation** | `generator.py`, `preprocessing.py`, `edge_creation.py`, `transformer_edges.py` | CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model | -| **2. Bus-type assignment** | `bus_type_allocator.py` | Entropy-based AIS optimisation reproducing empirical 2-D joint distribution of bus types and node degrees | -| **3. Generation capacity** | `capacity_allocator.py` | Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table | -| **4. Load allocation** | `load_allocator.py` | Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model | -| **5. Generation dispatch** | `generation_dispatcher.py` | Three-category partitioning with 2-D bin matching and iterative balancing | -| **6. Transmission lines** | `transmission.py`, `dcpf.py` | LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment | - -### Modules - -| Module | Description | -|--------|-------------| -| `generator.py` | Main orchestrator — `PowerGridGenerator` | -| `preprocessing.py` | Backbone setup and spatial-box assignment (Algorithm 1) | -| `edge_creation.py` | Intra-level edge creation via CLC model (Algorithm 2) | -| `transformer_edges.py` | Inter-level connections via k-stars model (Algorithm 3) | -| `input_configurator.py` | High-level specification → detailed input parameters | -| `deg_dist_optimizer.py` | Optimises distribution parameters (DGLN α,β / Power-Law γ) to match target average degree | -| `bus_type_allocator.py` | AIS-based Generator / Load / Connection bus-type assignment | -| `capacity_allocator.py` | Generation capacity (Pg_max) allocation | -| `load_allocator.py` | Active-power load (Pl) and reactive-power load (Ql) allocation | -| `generation_dispatcher.py` | Dispatch factor (α) assignment and generation–load balancing | -| `transmission.py` | Branch impedance (R, X) and thermal capacity (F_max) allocation | -| `dcpf.py` | Lightweight DC power-flow solver | -| `reference_data.py` | Pre-computed empirical statistics for NYISO, WECC reference systems | - ---- - -## Distribution Grid Synthesis - -### Quick Start - -The high-level `synthesize_distribution()` function generates realistic radial MV/LV feeders in one call: - -```python -from powergrid_synth import synthesize_distribution - -# Mode I — fit parameters from a reference distribution network -feeders = synthesize_distribution( - mode="reference", - reference_case="cigre_lv", - n_feeders=5, - n_nodes=20, - total_load_mw=0.5, - seed=42, - output_dir="output", - export_formats=["json"], -) - -# Mode II — use default Table III parameters (no reference needed) -feeders = synthesize_distribution( - mode="default", - n_feeders=10, - n_nodes=30, - total_load_mw=0.8, - seed=7, -) -``` - -See `examples/distribution/DistributionSynth.ipynb` and `examples/distribution/DistributionSynthFromRef.ipynb` for detailed walkthroughs. - -### Synthesis Pipeline - -| Step | Description | -|------|-------------| -| **1. Tree topology** | Random radial tree generation with branching and hop-count constraints | -| **2. Cable types** | Assign cable types from a realistic catalogue (weighted by frequency) | -| **3. Cable lengths** | Sample cable lengths from a Cauchy distribution fitted to reference data | -| **4. Loads** | Distribute total load across buses | -| **5. Generation** | Assign distributed generation (PV, etc.) to buses | - -### Modules - -| Module | Description | -|--------|-------------| -| `distribution_synthesis.py` | `SchweetzerFeederGenerator` — generates a single radial feeder graph | -| `distribution_params.py` | `FeederParams` dataclass with default Table III values | -| `distribution_analysis.py` | `fit_params_from_feeders` — extract statistical parameters from reference feeders | -| `distribution_converter.py` | `pandapower_to_feeders`, `pypowsybl_to_feeders` — convert real networks to feeder graphs | -| `distribution_input_model.py` | Input configuration and validation | -| `distribution_validation.py` | Structural and electrical validation of generated feeders | -| `synthesize.py` | `synthesize_distribution` — one-call high-level function | - ---- - -## Shared Infrastructure - -### Analysis, Export & Visualisation - -| Module | Description | -|--------|-------------| -| `grid_graph.py` | `PowerGridGraph`, `TransmissionGrid`, `DistributionGrid` — NetworkX Graph subclasses with voltage-level filtering and radial-tree helpers | -| `analysis.py` | Topological metrics (diameter, clustering, path length) | -| `hierarchical_analysis.py` | Per-voltage-level analysis | -| `comparison.py` | Side-by-side comparison of synthetic vs. reference grids | -| `visualization.py` | Plotting routines (Yifan Hu layout, per-level views, interactive dashboards) | -| `exporter.py` | Export to **JSON, Excel, SQLite, Pickle** (pandapower) and **CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL** (pypowsybl) | -| `data_format_converter.py` | Conversion between NetworkX ↔ pandapower ↔ pypowsybl; import from CGMES/XIIDM/MATPOWER/PSS·E via `load_grid` | - -### Export Formats - -| Via | Format | Method | -|----|--------|--------| -| **pandapower** | JSON | `GridExporter.to_json()` | -| | Excel (.xlsx) | `GridExporter.to_excel()` | -| | SQLite | `GridExporter.to_sqlite()` | -| | Pickle | `GridExporter.to_pickle()` | -| **pypowsybl** | CGMES | `GridExporter.to_cgmes()` | -| | XIIDM | `GridExporter.to_pypowsybl(format='XIIDM')` | -| | MATPOWER | `GridExporter.to_matpower()` | -| | PSS/E | `GridExporter.to_psse()` | -| | UCTE, AMPL, BIIDM, JIIDM | `GridExporter.to_pypowsybl(format=...)` | - -### Power-Flow Solvers - -| Solver | Library | Type | Call | -|--------|---------|------|------| -| Newton-Raphson AC | **pandapower** | AC | `pp.runpp(net)` | -| Linear DC | **pandapower** | DC | `pp.rundcpp(net)` | -| AC load-flow | **pypowsybl** | AC | `pypowsybl.loadflow.run_ac(net)` | -| DC load-flow | **pypowsybl** | DC | `pypowsybl.loadflow.run_dc(net)` | -| Built-in DCPF | **powergrid_synth** | DC | `DCPowerFlow(graph).run()` | - -## Testing - -```bash -pytest tests/ -v -``` - -## Building Documentation - -```bash -cd docs -make html -``` diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt deleted file mode 100644 index 2f89abd..0000000 --- a/docs/_build/html/_sources/index.rst.txt +++ /dev/null @@ -1,255 +0,0 @@ -PowerGridSynth -============== - -**PowerGridSynth** is an open-source Python package for generating realistic **synthetic power grids** at both the transmission and distribution level. - -- **Transmission grids** are synthesized using a `Chung-Lu-Chain (CLC) `_ graph model that reproduces prescribed degree distributions and diameters across multiple voltage levels, then layers on bus-type assignment, generation/load capacity allocation (active *and* reactive power), generation dispatch, and transmission-line impedance/capacity assignment drawn from empirical statistics of real grids (NYISO, WECC). -- **Distribution feeders** are synthesized using the algorithm of `Schweitzer et al. (2017) `_, producing radial MV/LV tree graphs with realistic cable types, lengths, and load/generation profiles. - -Synthesised grids can be **exported to 12+ industry-standard formats** via `pandapower `_ and `pypowsybl `_ and validated with **DC and AC power-flow solvers** from both libraries. - -The goal of the project is to provide synthetic yet realistic power grids for grid modeling, simulation and analysis, with the ultimate goal of building **Foundation Models** for power grids. It is part of `LF Energy `_, a Linux Foundation focused on the energy sector. This project is supported by `AI-EFFECT `_ (Artificial Intelligence Experimentation Facility For the Energy Sector). - - -Transmission Grid Synthesis ----------------------------- - -Synthesis Pipeline -~~~~~~~~~~~~~~~~~~ - -.. list-table:: - :widths: 5 30 65 - :header-rows: 1 - - * - Step - - Module - - Method - * - 1 - - Topology generation - - CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model - * - 2 - - Bus-type assignment - - Entropy-based Artificial Immune System (AIS) optimisation reproducing empirical 2-D joint distribution of bus types and node degrees - * - 3 - - Generation capacity - - Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table - * - 4 - - Load allocation - - Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model - * - 5 - - Generation dispatch - - Three-category partitioning (uncommitted / partially committed / fully committed) with 2-D bin matching and iterative balancing - * - 6 - - Transmission lines - - LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment via 2-D table - - -Quick Start -~~~~~~~~~~~ - -The high-level ``synthesize()`` function runs the entire CLC transmission pipeline in one call: - -.. code-block:: python - - from powergrid_synth import synthesize - - # Mode I — clone an existing grid's statistical profile - grid = synthesize( - mode="reference", - reference_case="case118", - seed=42, - export_formats=["json", "cgmes", "matpower"], - ) - - # Mode II — fully synthetic from user-specified parameters - grid = synthesize( - mode="synthetic", - level_specs=[ - {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, - {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, - {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, - ], - connection_specs={ - (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, - (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, - }, - seed=42, - export_formats=["json", "matpower"], - ) - -See :doc:`examples/Synthesize.nblink` for a full walkthrough. - -Step-by-Step Usage -~~~~~~~~~~~~~~~~~~ - -For fine-grained control over individual pipeline stages: - -.. code-block:: python - - from powergrid_synth import ( - InputConfigurator, PowerGridGenerator, BusTypeAllocator, - CapacityAllocator, LoadAllocator, GenerationDispatcher, - TransmissionLineAllocator, GridVisualizer, - ) - - # 1. Configure voltage levels and inter-level connections - level_specs = [ - {'n': 50, 'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'}, - {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'}, - {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'}, - ] - connection_specs = { - (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15}, - (1, 2): {'type': 'k-stars', 'c': 0.15, 'gamma': 4.15}, - } - - config = InputConfigurator(seed=42) - params = config.create_params(level_specs, connection_specs) - - # 2. Generate topology (CLC model) - gen = PowerGridGenerator(seed=42) - grid = gen.generate_grid( - degrees_by_level=params['degrees_by_level'], - diameters_by_level=params['diameters_by_level'], - transformer_degrees=params['transformer_degrees'], - ) - - # 3. Assign bus types, generation/load, dispatch, and line parameters - BusTypeAllocator(grid).allocate() - CapacityAllocator(grid).allocate() - LoadAllocator(grid).allocate() - GenerationDispatcher(grid).dispatch() - TransmissionLineAllocator(grid).allocate() - - # 4. Visualize - GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid") - -See the :doc:`examples/index` for Jupyter notebooks covering each step in detail. - - -Distribution Grid Synthesis ----------------------------- - -Quick Start -~~~~~~~~~~~ - -The high-level ``synthesize_distribution()`` function generates realistic radial MV/LV feeders in one call: - -.. code-block:: python - - from powergrid_synth import synthesize_distribution - - # Mode I — fit parameters from a reference distribution network - feeders = synthesize_distribution( - mode="reference", - reference_case="cigre_lv", - n_feeders=5, - n_nodes=20, - total_load_mw=0.5, - seed=42, - output_dir="output", - export_formats=["json"], - ) - - # Mode II — use default Table III parameters (no reference needed) - feeders = synthesize_distribution( - mode="default", - n_feeders=10, - n_nodes=30, - total_load_mw=0.8, - seed=7, - ) - -See :doc:`examples/DistributionSynth.nblink` and :doc:`examples/DistributionSynthFromRef.nblink` for detailed walkthroughs. - - -Supported Data Formats & Power-Flow Solvers --------------------------------------------- - -Synthetic grids live as **NetworkX graphs** internally and can be converted / exported via -``GridExporter`` and ``data_format_converter``. - -**Export formats** - -.. list-table:: - :widths: 15 30 55 - :header-rows: 1 - - * - Via - - Format - - Method - * - pandapower - - JSON, Excel, SQLite, Pickle - - ``to_json()``, ``to_excel()``, ``to_sqlite()``, ``to_pickle()`` - * - pypowsybl - - **CGMES, XIIDM, MATPOWER, PSS/E**, UCTE, AMPL, BIIDM, JIIDM - - ``to_cgmes()``, ``to_matpower()``, ``to_psse()``, ``to_pypowsybl(format=...)`` - -**Conversion chain**:: - - Export: NetworkX ↔ pandapower → pypowsybl → [CGMES / XIIDM / MATPOWER / PSS·E / …] - Import: [CGMES / XIIDM / MATPOWER / PSS·E / …] → pypowsybl → NetworkX (via load_grid / pypowsybl_to_nx) - -Converter functions: ``pandapower_to_nx``, ``nx_to_pandapower``, -``pandapower_to_pypowsybl``, ``pypowsybl_to_nx``, ``load_grid`` -(in ``data_format_converter.py``). - -**Power-flow solvers** - -.. list-table:: - :widths: 30 20 15 35 - :header-rows: 1 - - * - Solver - - Library - - Type - - Call - * - Newton-Raphson AC - - pandapower - - AC - - ``pp.runpp(net)`` - * - Linear DC - - pandapower - - DC - - ``pp.rundcpp(net)`` - * - AC load-flow - - pypowsybl - - AC - - ``pypowsybl.loadflow.run_ac(net)`` - * - DC load-flow - - pypowsybl - - DC - - ``pypowsybl.loadflow.run_dc(net)`` - * - Built-in DCPF - - powergrid_synth - - DC - - ``DCPowerFlow(graph).run()`` - - -.. toctree:: - :maxdepth: 2 - :titlesonly: - :hidden: - - Getting Started - -.. toctree:: - :maxdepth: 2 - :titlesonly: - :hidden: - - Examples - -.. toctree:: - :maxdepth: 2 - :titlesonly: - :hidden: - - Theory - -.. toctree:: - :maxdepth: 2 - :titlesonly: - :hidden: - - API Reference \ No newline at end of file diff --git a/docs/_build/html/_sources/reference/api_reference.md.txt b/docs/_build/html/_sources/reference/api_reference.md.txt deleted file mode 100644 index dcbc6f1..0000000 --- a/docs/_build/html/_sources/reference/api_reference.md.txt +++ /dev/null @@ -1,188 +0,0 @@ -# API Reference - -## Transmission Grid Synthesis - -### High-Level Function - -```{eval-rst} -.. autofunction:: powergrid_synth.synthesize -``` - -### Topology Generation - -```{eval-rst} -.. autoclass:: powergrid_synth.InputConfigurator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.PowerGridGenerator - :members: - :undoc-members: - :show-inheritance: -``` - -### Electrical Assignment - -```{eval-rst} -.. autoclass:: powergrid_synth.BusTypeAllocator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.CapacityAllocator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.LoadAllocator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.GenerationDispatcher - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.TransmissionLineAllocator - :members: - :undoc-members: - :show-inheritance: -``` - ---- - -## Distribution Grid Synthesis - -### High-Level Function - -```{eval-rst} -.. autofunction:: powergrid_synth.synthesize_distribution -``` - -### Core Classes - -```{eval-rst} -.. autoclass:: powergrid_synth.distribution.SchweetzerFeederGenerator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.distribution.FeederParams - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.distribution.DistributionSynthParams - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.distribution.DistributionInputModel - :members: - :undoc-members: - :show-inheritance: -``` - -### Analysis & Conversion - -```{eval-rst} -.. autofunction:: powergrid_synth.distribution.fit_params_from_feeders -``` - -```{eval-rst} -.. automodule:: powergrid_synth.distribution.distribution_converter - :members: - :undoc-members: -``` - ---- - -## Graph Classes - -```{eval-rst} -.. autoclass:: powergrid_synth.PowerGridGraph - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.TransmissionGrid - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.DistributionGrid - :members: - :undoc-members: - :show-inheritance: -``` - ---- - -## Analysis, Export & Visualisation - -```{eval-rst} -.. autoclass:: powergrid_synth.GraphComparator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.GridVisualizer - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.GridExporter - :members: - :undoc-members: - :show-inheritance: -``` - ---- - -## Format Converters - -```{eval-rst} -.. autofunction:: powergrid_synth.pandapower_to_nx -``` - -```{eval-rst} -.. autofunction:: powergrid_synth.nx_to_pandapower -``` - -```{eval-rst} -.. autofunction:: powergrid_synth.pandapower_to_pypowsybl -``` - -```{eval-rst} -.. autofunction:: powergrid_synth.pypowsybl_to_nx -``` - -```{eval-rst} -.. autofunction:: powergrid_synth.load_grid -``` diff --git a/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 8141580..0000000 --- a/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,123 +0,0 @@ -/* Compatability shim for jQuery and underscores.js. - * - * Copyright Sphinx contributors - * Released under the two clause BSD licence - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css deleted file mode 100644 index 4738b2e..0000000 --- a/docs/_build/html/_static/basic.css +++ /dev/null @@ -1,906 +0,0 @@ -/* - * Sphinx stylesheet -- basic theme. - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin-top: 10px; -} - -ul.search li { - padding: 5px 0; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css deleted file mode 100644 index 88ba55b..0000000 --- a/docs/_build/html/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff deleted file mode 100644 index 6cb6000..0000000 Binary files a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 deleted file mode 100644 index 7059e23..0000000 Binary files a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff deleted file mode 100644 index f815f63..0000000 Binary files a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 deleted file mode 100644 index f2c76e5..0000000 Binary files a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca..0000000 Binary files a/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845..0000000 --- a/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a..0000000 Binary files a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc6..0000000 Binary files a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff deleted file mode 100644 index 88ad05b..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 deleted file mode 100644 index c4e3d80..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff b/docs/_build/html/_static/css/fonts/lato-bold.woff deleted file mode 100644 index c6dff51..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff2 b/docs/_build/html/_static/css/fonts/lato-bold.woff2 deleted file mode 100644 index bb19504..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff deleted file mode 100644 index 76114bc..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 deleted file mode 100644 index 3404f37..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff b/docs/_build/html/_static/css/fonts/lato-normal.woff deleted file mode 100644 index ae1307f..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-normal.woff and /dev/null differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff2 b/docs/_build/html/_static/css/fonts/lato-normal.woff2 deleted file mode 100644 index 3bf9843..0000000 Binary files a/docs/_build/html/_static/css/fonts/lato-normal.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css deleted file mode 100644 index a88467c..0000000 --- a/docs/_build/html/_static/css/theme.css +++ /dev/null @@ -1,4 +0,0 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%;float:none;margin-left:0}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js deleted file mode 100644 index 807cdb1..0000000 --- a/docs/_build/html/_static/doctools.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Base JavaScript utilities for all Sphinx HTML documentation. - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})`, - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)), - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS - && !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) - return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js deleted file mode 100644 index 51cf7f5..0000000 --- a/docs/_build/html/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '0.1.1', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png deleted file mode 100644 index a858a41..0000000 Binary files a/docs/_build/html/_static/file.png and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.eot b/docs/_build/html/_static/fonts/Lato/lato-bold.eot deleted file mode 100644 index 3361183..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf deleted file mode 100644 index 29f691d..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff b/docs/_build/html/_static/fonts/Lato/lato-bold.woff deleted file mode 100644 index c6dff51..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 deleted file mode 100644 index bb19504..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot deleted file mode 100644 index 3d41549..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf deleted file mode 100644 index f402040..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff deleted file mode 100644 index 88ad05b..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 deleted file mode 100644 index c4e3d80..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.eot b/docs/_build/html/_static/fonts/Lato/lato-italic.eot deleted file mode 100644 index 3f82642..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf deleted file mode 100644 index b4bfc9b..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff b/docs/_build/html/_static/fonts/Lato/lato-italic.woff deleted file mode 100644 index 76114bc..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 deleted file mode 100644 index 3404f37..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.eot b/docs/_build/html/_static/fonts/Lato/lato-regular.eot deleted file mode 100644 index 11e3f2a..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf deleted file mode 100644 index 74decd9..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff b/docs/_build/html/_static/fonts/Lato/lato-regular.woff deleted file mode 100644 index ae1307f..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 deleted file mode 100644 index 3bf9843..0000000 Binary files a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot deleted file mode 100644 index 79dc8ef..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf deleted file mode 100644 index df5d1df..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff deleted file mode 100644 index 6cb6000..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 deleted file mode 100644 index 7059e23..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot deleted file mode 100644 index 2f7ca78..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf deleted file mode 100644 index eb52a79..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff deleted file mode 100644 index f815f63..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff and /dev/null differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 deleted file mode 100644 index f2c76e5..0000000 Binary files a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 and /dev/null differ diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js deleted file mode 100644 index c4c6022..0000000 --- a/docs/_build/html/_static/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t a.language.name.localeCompare(b.language.name)); - - const languagesHTML = ` -
-
Languages
- ${languages - .map( - (translation) => ` -
- ${translation.language.code} -
- `, - ) - .join("\n")} -
- `; - return languagesHTML; - } - - function renderVersions(config) { - if (!config.versions.active.length) { - return ""; - } - const versionsHTML = ` -
-
Versions
- ${config.versions.active - .map( - (version) => ` -
- ${version.slug} -
- `, - ) - .join("\n")} -
- `; - return versionsHTML; - } - - function renderDownloads(config) { - if (!Object.keys(config.versions.current.downloads).length) { - return ""; - } - const downloadsNameDisplay = { - pdf: "PDF", - epub: "Epub", - htmlzip: "HTML", - }; - - const downloadsHTML = ` -
-
Downloads
- ${Object.entries(config.versions.current.downloads) - .map( - ([name, url]) => ` -
- ${downloadsNameDisplay[name]} -
- `, - ) - .join("\n")} -
- `; - return downloadsHTML; - } - - document.addEventListener("readthedocs-addons-data-ready", function (event) { - const config = event.detail.data(); - - const flyout = ` -
- - Read the Docs - v: ${config.versions.current.slug} - - -
-
- ${renderLanguages(config)} - ${renderVersions(config)} - ${renderDownloads(config)} -
-
On Read the Docs
-
- Project Home -
-
- Builds -
-
- Downloads -
-
-
-
Search
-
-
- -
-
-
-
- - Hosted by Read the Docs - -
-
- `; - - // Inject the generated flyout into the body HTML element. - document.body.insertAdjacentHTML("beforeend", flyout); - - // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. - document - .querySelector("#flyout-search-form") - .addEventListener("focusin", () => { - const event = new CustomEvent("readthedocs-search-show"); - document.dispatchEvent(event); - }); - }) -} - -if (themeLanguageSelector || themeVersionSelector) { - function onSelectorSwitch(event) { - const option = event.target.selectedIndex; - const item = event.target.options[option]; - window.location.href = item.dataset.url; - } - - document.addEventListener("readthedocs-addons-data-ready", function (event) { - const config = event.detail.data(); - - const versionSwitch = document.querySelector( - "div.switch-menus > div.version-switch", - ); - if (themeVersionSelector) { - let versions = config.versions.active; - if (config.versions.current.hidden || config.versions.current.type === "external") { - versions.unshift(config.versions.current); - } - const versionSelect = ` - - `; - - versionSwitch.innerHTML = versionSelect; - versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); - } - - const languageSwitch = document.querySelector( - "div.switch-menus > div.language-switch", - ); - - if (themeLanguageSelector) { - if (config.projects.translations.length) { - // Add the current language to the options on the selector - let languages = config.projects.translations.concat( - config.projects.current, - ); - languages = languages.sort((a, b) => - a.language.name.localeCompare(b.language.name), - ); - - const languageSelect = ` - - `; - - languageSwitch.innerHTML = languageSelect; - languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); - } - else { - languageSwitch.remove(); - } - } - }); -} - -document.addEventListener("readthedocs-addons-data-ready", function (event) { - // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. - document - .querySelector("[role='search'] input") - .addEventListener("focusin", () => { - const event = new CustomEvent("readthedocs-search-show"); - document.dispatchEvent(event); - }); -}); \ No newline at end of file diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js deleted file mode 100644 index 5776786..0000000 --- a/docs/_build/html/_static/language_data.js +++ /dev/null @@ -1,13 +0,0 @@ -/* - * This script contains the language-specific data used by searchtools.js, - * namely the set of stopwords, stemmer, scorer and splitter. - */ - -const stopwords = new Set(["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]); -window.stopwords = stopwords; // Export to global scope - - -/* Non-minified versions are copied as separate JavaScript files, if available */ -BaseStemmer=function(){this.current="",this.cursor=0,this.limit=0,this.limit_backward=0,this.bra=0,this.ket=0,this.setCurrent=function(t){this.current=t,this.cursor=0,this.limit=this.current.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},this.getCurrent=function(){return this.current},this.copy_from=function(t){this.current=t.current,this.cursor=t.cursor,this.limit=t.limit,this.limit_backward=t.limit_backward,this.bra=t.bra,this.ket=t.ket},this.in_grouping=function(t,r,i){return!(this.cursor>=this.limit||i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i))||(this.cursor++,0))},this.go_in_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.in_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward||i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i))||(this.cursor--,0))},this.go_in_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(i>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.out_grouping=function(t,r,i){return!(this.cursor>=this.limit)&&(i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i)))&&(this.cursor++,!0)},this.go_out_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.out_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward)&&(i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i)))&&(this.cursor--,!0)},this.go_out_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(s<=i&&r<=s&&0!=(t[(s-=r)>>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.eq_s=function(t){return!(this.limit-this.cursor>>1),o=0,a=e=(l=t[r])[0].length){if(this.cursor=s+l[0].length,l.length<4)return l[2];var g=l[3](this);if(this.cursor=s+l[0].length,g)return l[2]}}while(0<=(r=l[1]));return 0},this.find_among_b=function(t){for(var r=0,i=t.length,s=this.cursor,h=this.limit_backward,e=0,n=0,c=!1;;){for(var u,o=r+(i-r>>1),a=0,l=e=(u=t[r])[0].length){if(this.cursor=s-u[0].length,u.length<4)return u[2];var g=u[3](this);if(this.cursor=s-u[0].length,g)return u[2]}}while(0<=(r=u[1]));return 0},this.replace_s=function(t,r,i){var s=i.length-(r-t);return this.current=this.current.slice(0,t)+i+this.current.slice(r),this.limit+=s,this.cursor>=r?this.cursor+=s:this.cursor>t&&(this.cursor=t),s},this.slice_check=function(){return!(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length)},this.slice_from=function(t){var r=!1;return this.slice_check()&&(this.replace_s(this.bra,this.ket,t),r=!0),r},this.slice_del=function(){return this.slice_from("")},this.insert=function(t,r,i){r=this.replace_s(t,r,i);t<=this.bra&&(this.bra+=r),t<=this.ket&&(this.ket+=r)},this.slice_to=function(){var t="";return t=this.slice_check()?this.current.slice(this.bra,this.ket):t},this.assign_to=function(){return this.current.slice(0,this.limit)}}; -var EnglishStemmer=function(){var a=new BaseStemmer,c=[["arsen",-1,-1],["commun",-1,-1],["emerg",-1,-1],["gener",-1,-1],["later",-1,-1],["organ",-1,-1],["past",-1,-1],["univers",-1,-1]],o=[["'",-1,1],["'s'",0,1],["'s",-1,1]],u=[["ied",-1,2],["s",-1,3],["ies",1,2],["sses",1,1],["ss",1,-1],["us",1,-1]],t=[["succ",-1,1],["proc",-1,1],["exc",-1,1]],l=[["even",-1,2],["cann",-1,2],["inn",-1,2],["earr",-1,2],["herr",-1,2],["out",-1,2],["y",-1,1]],n=[["",-1,-1],["ed",0,2],["eed",1,1],["ing",0,3],["edly",0,2],["eedly",4,1],["ingly",0,2]],f=[["",-1,3],["bb",0,2],["dd",0,2],["ff",0,2],["gg",0,2],["bl",0,1],["mm",0,2],["nn",0,2],["pp",0,2],["rr",0,2],["at",0,1],["tt",0,2],["iz",0,1]],_=[["anci",-1,3],["enci",-1,2],["ogi",-1,14],["li",-1,16],["bli",3,12],["abli",4,4],["alli",3,8],["fulli",3,9],["lessli",3,15],["ousli",3,10],["entli",3,5],["aliti",-1,8],["biliti",-1,12],["iviti",-1,11],["tional",-1,1],["ational",14,7],["alism",-1,8],["ation",-1,7],["ization",17,6],["izer",-1,6],["ator",-1,7],["iveness",-1,11],["fulness",-1,9],["ousness",-1,10],["ogist",-1,13]],m=[["icate",-1,4],["ative",-1,6],["alize",-1,3],["iciti",-1,4],["ical",-1,4],["tional",-1,1],["ational",5,2],["ful",-1,5],["ness",-1,5]],b=[["ic",-1,1],["ance",-1,1],["ence",-1,1],["able",-1,1],["ible",-1,1],["ate",-1,1],["ive",-1,1],["ize",-1,1],["iti",-1,1],["al",-1,1],["ism",-1,1],["ion",-1,2],["er",-1,1],["ous",-1,1],["ant",-1,1],["ent",-1,1],["ment",15,1],["ement",16,1]],k=[["e",-1,1],["l",-1,2]],g=[["andes",-1,-1],["atlas",-1,-1],["bias",-1,-1],["cosmos",-1,-1],["early",-1,5],["gently",-1,3],["howe",-1,-1],["idly",-1,2],["news",-1,-1],["only",-1,6],["singly",-1,7],["skies",-1,1],["sky",-1,-1],["ugly",-1,4]],d=[17,64],v=[17,65,16,1],i=[1,17,65,208,1],w=[55,141,2],p=!1,y=0,h=0;function q(){var r=a.limit-a.cursor;return!!(a.out_grouping_b(i,89,121)&&a.in_grouping_b(v,97,121)&&a.out_grouping_b(v,97,121)||(a.cursor=a.limit-r,a.out_grouping_b(v,97,121)&&a.in_grouping_b(v,97,121)&&!(a.cursor>a.limit_backward))||(a.cursor=a.limit-r,a.eq_s_b("past")))}function z(){return h<=a.cursor}function Y(){return y<=a.cursor}this.stem=function(){var r=a.cursor;if(!(()=>{var r;if(a.bra=a.cursor,0!=(r=a.find_among(g))&&(a.ket=a.cursor,!(a.cursora.limit)a.cursor=i;else{a.cursor=e,a.cursor=r,(()=>{p=!1;var r=a.cursor;if(a.bra=a.cursor,!a.eq_s("'")||(a.ket=a.cursor,a.slice_del())){a.cursor=r;r=a.cursor;if(a.bra=a.cursor,a.eq_s("y")){if(a.ket=a.cursor,!a.slice_from("Y"))return;p=!0}a.cursor=r;for(r=a.cursor;;){var i=a.cursor;r:{for(;;){var e=a.cursor;if(a.in_grouping(v,97,121)&&(a.bra=a.cursor,a.eq_s("y"))){a.ket=a.cursor,a.cursor=e;break}if(a.cursor=e,a.cursor>=a.limit)break r;a.cursor++}if(!a.slice_from("Y"))return;p=!0;continue}a.cursor=i;break}a.cursor=r}})(),h=a.limit,y=a.limit;i=a.cursor;r:{var s=a.cursor;if(0==a.find_among(c)){if(a.cursor=s,!a.go_out_grouping(v,97,121))break r;if(a.cursor++,!a.go_in_grouping(v,97,121))break r;a.cursor++}h=a.cursor,a.go_out_grouping(v,97,121)&&(a.cursor++,a.go_in_grouping(v,97,121))&&(a.cursor++,y=a.cursor)}a.cursor=i,a.limit_backward=a.cursor,a.cursor=a.limit;var e=a.limit-a.cursor,r=((()=>{var r=a.limit-a.cursor;if(a.ket=a.cursor,0==a.find_among_b(o))a.cursor=a.limit-r;else if(a.bra=a.cursor,!a.slice_del())return;if(a.ket=a.cursor,0!=(r=a.find_among_b(u)))switch(a.bra=a.cursor,r){case 1:if(a.slice_from("ss"))break;return;case 2:r:{var i=a.limit-a.cursor,e=a.cursor-2;if(!(e{a.ket=a.cursor,o=a.find_among_b(n),a.bra=a.cursor;r:{var r=a.limit-a.cursor;i:{switch(o){case 1:var i=a.limit-a.cursor;e:{var e=a.limit-a.cursor;if(0==a.find_among_b(t)||a.cursor>a.limit_backward){if(a.cursor=a.limit-e,!z())break e;if(!a.slice_from("ee"))return}}a.cursor=a.limit-i;break;case 2:break i;case 3:if(0==(o=a.find_among_b(l)))break i;switch(o){case 1:var s=a.limit-a.cursor;if(!a.out_grouping_b(v,97,121))break i;if(a.cursor>a.limit_backward)break i;if(a.cursor=a.limit-s,a.bra=a.cursor,a.slice_from("ie"))break;return;case 2:if(a.cursor>a.limit_backward)break i}}break r}a.cursor=a.limit-r;var c=a.limit-a.cursor;if(!a.go_out_grouping_b(v,97,121))return;if(a.cursor--,a.cursor=a.limit-c,!a.slice_del())return;a.ket=a.cursor,a.bra=a.cursor;var o,c=a.limit-a.cursor;switch(o=a.find_among_b(f)){case 1:return a.slice_from("e");case 2:var u=a.limit-a.cursor;if(a.in_grouping_b(d,97,111)&&!(a.cursor>a.limit_backward))return;a.cursor=a.limit-u;break;case 3:return a.cursor!=h||(u=a.limit-a.cursor,q()&&(a.cursor=a.limit-u,a.slice_from("e")))}if(a.cursor=a.limit-c,a.ket=a.cursor,a.cursor<=a.limit_backward)return;if(a.cursor--,a.bra=a.cursor,!a.slice_del())return}})(),a.cursor=a.limit-r,a.limit-a.cursor),r=(a.ket=a.cursor,e=a.limit-a.cursor,(a.eq_s_b("y")||(a.cursor=a.limit-e,a.eq_s_b("Y")))&&(a.bra=a.cursor,a.out_grouping_b(v,97,121))&&a.cursor>a.limit_backward&&a.slice_from("i"),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(_))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ence"))break;return;case 3:if(a.slice_from("ance"))break;return;case 4:if(a.slice_from("able"))break;return;case 5:if(a.slice_from("ent"))break;return;case 6:if(a.slice_from("ize"))break;return;case 7:if(a.slice_from("ate"))break;return;case 8:if(a.slice_from("al"))break;return;case 9:if(a.slice_from("ful"))break;return;case 10:if(a.slice_from("ous"))break;return;case 11:if(a.slice_from("ive"))break;return;case 12:if(a.slice_from("ble"))break;return;case 13:if(a.slice_from("og"))break;return;case 14:if(!a.eq_s_b("l"))return;if(a.slice_from("og"))break;return;case 15:if(a.slice_from("less"))break;return;case 16:if(!a.in_grouping_b(w,99,116))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.limit-a.cursor),i=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(m))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ate"))break;return;case 3:if(a.slice_from("al"))break;return;case 4:if(a.slice_from("ic"))break;return;case 5:if(a.slice_del())break;return;case 6:if(!Y())return;if(a.slice_del())break}})(),a.cursor=a.limit-e,a.limit-a.cursor),r=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(b))&&(a.bra=a.cursor,Y()))switch(r){case 1:if(a.slice_del())break;return;case 2:var i=a.limit-a.cursor;if(!a.eq_s_b("s")&&(a.cursor=a.limit-i,!a.eq_s_b("t")))return;if(a.slice_del())break}})(),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(k)))switch(a.bra=a.cursor,r){case 1:if(!Y()){if(!z())return;var i=a.limit-a.cursor;if(q())return;a.cursor=a.limit-i}if(a.slice_del())break;return;case 2:if(!Y())return;if(!a.eq_s_b("l"))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.cursor=a.limit_backward,a.cursor);(()=>{if(p)for(;;){var r=a.cursor;r:{for(;;){var i=a.cursor;if(a.bra=a.cursor,a.eq_s("Y")){a.ket=a.cursor,a.cursor=i;break}if(a.cursor=i,a.cursor>=a.limit)break r;a.cursor++}if(a.slice_from("y"))continue;return}a.cursor=r;break}})(),a.cursor=e}}return!0},this.stemWord=function(r){return a.setCurrent(r),this.stem(),a.getCurrent()}}; -window.Stemmer = EnglishStemmer; diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png deleted file mode 100644 index d96755f..0000000 Binary files a/docs/_build/html/_static/minus.png and /dev/null differ diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png deleted file mode 100644 index 7107cec..0000000 Binary files a/docs/_build/html/_static/plus.png and /dev/null differ diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css deleted file mode 100644 index 6f8b210..0000000 --- a/docs/_build/html/_static/pygments.css +++ /dev/null @@ -1,75 +0,0 @@ -pre { line-height: 125%; } -td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #F00 } /* Error */ -.highlight .k { color: #008000; font-weight: bold } /* Keyword */ -.highlight .o { color: #666 } /* Operator */ -.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #9C6500 } /* Comment.Preproc */ -.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -.highlight .gr { color: #E40000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #008400 } /* Generic.Inserted */ -.highlight .go { color: #717171 } /* Generic.Output */ -.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #04D } /* Generic.Traceback */ -.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #008000 } /* Keyword.Pseudo */ -.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #B00040 } /* Keyword.Type */ -.highlight .m { color: #666 } /* Literal.Number */ -.highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #687822 } /* Name.Attribute */ -.highlight .nb { color: #008000 } /* Name.Builtin */ -.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ -.highlight .no { color: #800 } /* Name.Constant */ -.highlight .nd { color: #A2F } /* Name.Decorator */ -.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #00F } /* Name.Function */ -.highlight .nl { color: #767600 } /* Name.Label */ -.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #19177C } /* Name.Variable */ -.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #BBB } /* Text.Whitespace */ -.highlight .mb { color: #666 } /* Literal.Number.Bin */ -.highlight .mf { color: #666 } /* Literal.Number.Float */ -.highlight .mh { color: #666 } /* Literal.Number.Hex */ -.highlight .mi { color: #666 } /* Literal.Number.Integer */ -.highlight .mo { color: #666 } /* Literal.Number.Oct */ -.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ -.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ -.highlight .sc { color: #BA2121 } /* Literal.String.Char */ -.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ -.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ -.highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ -.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ -.highlight .ss { color: #19177C } /* Literal.String.Symbol */ -.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #00F } /* Name.Function.Magic */ -.highlight .vc { color: #19177C } /* Name.Variable.Class */ -.highlight .vg { color: #19177C } /* Name.Variable.Global */ -.highlight .vi { color: #19177C } /* Name.Variable.Instance */ -.highlight .vm { color: #19177C } /* Name.Variable.Magic */ -.highlight .il { color: #666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js deleted file mode 100644 index e29b1c7..0000000 --- a/docs/_build/html/_static/searchtools.js +++ /dev/null @@ -1,693 +0,0 @@ -/* - * Sphinx JavaScript utilities for the full-text search. - */ -"use strict"; - -/** - * Simple result scoring code. - */ -if (typeof Scorer === "undefined") { - var Scorer = { - // Implement the following function to further tweak the score for each result - // The function takes a result array [docname, title, anchor, descr, score, filename] - // and returns the new score. - /* - score: result => { - const [docname, title, anchor, descr, score, filename, kind] = result - return score - }, - */ - - // query matches the full name of an object - objNameMatch: 11, - // or matches in the last dotted part of the object name - objPartialMatch: 6, - // Additive scores depending on the priority of the object - objPrio: { - 0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5, // used to be unimportantResults - }, - // Used when the priority is not in the mapping. - objPrioDefault: 0, - - // query found in title - title: 15, - partialTitle: 7, - // query found in terms - term: 5, - partialTerm: 2, - }; -} - -// Global search result kind enum, used by themes to style search results. -// prettier-ignore -class SearchResultKind { - static get index() { return "index"; } - static get object() { return "object"; } - static get text() { return "text"; } - static get title() { return "title"; } -} - -const _removeChildren = (element) => { - while (element && element.lastChild) element.removeChild(element.lastChild); -}; - -/** - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping - */ -const _escapeRegExp = (string) => - string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string - -const _escapeHTML = (text) => { - return text - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) - .replaceAll("'", "'"); -}; - -const _displayItem = (item, searchTerms, highlightTerms) => { - const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; - const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; - const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const contentRoot = document.documentElement.dataset.content_root; - - const [docName, title, anchor, descr, score, _filename, kind] = item; - - let listItem = document.createElement("li"); - // Add a class representing the item's type: - // can be used by a theme's CSS selector for styling - // See SearchResultKind for the class names. - listItem.classList.add(`kind-${kind}`); - let requestUrl; - let linkUrl; - if (docBuilder === "dirhtml") { - // dirhtml builder - let dirname = docName + "/"; - if (dirname.match(/\/index\/$/)) - dirname = dirname.substring(0, dirname.length - 6); - else if (dirname === "index/") dirname = ""; - requestUrl = contentRoot + dirname; - linkUrl = requestUrl; - } else { - // normal html builders - requestUrl = contentRoot + docName + docFileSuffix; - linkUrl = docName + docLinkSuffix; - } - let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + anchor; - linkEl.dataset.score = score; - linkEl.innerHTML = _escapeHTML(title); - if (descr) { - listItem.appendChild(document.createElement("span")).innerHTML = - ` (${_escapeHTML(descr)})`; - // highlight search terms in the description - if (SPHINX_HIGHLIGHT_ENABLED) - // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js - highlightTerms.forEach((term) => - _highlightText(listItem, term, "highlighted"), - ); - } else if (showSearchSummary) - fetch(requestUrl) - .then((responseData) => responseData.text()) - .then((data) => { - if (data) - listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, anchor), - ); - // highlight search terms in the summary - if (SPHINX_HIGHLIGHT_ENABLED) - // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js - highlightTerms.forEach((term) => - _highlightText(listItem, term, "highlighted"), - ); - }); - Search.output.appendChild(listItem); -}; -const _finishSearch = (resultCount) => { - Search.stopPulse(); - Search.title.innerText = _("Search Results"); - if (!resultCount) - Search.status.innerText = Documentation.gettext( - "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.", - ); - else - Search.status.innerText = Documentation.ngettext( - "Search finished, found one page matching the search query.", - "Search finished, found ${resultCount} pages matching the search query.", - resultCount, - ).replace("${resultCount}", resultCount); -}; -const _displayNextItem = ( - results, - resultCount, - searchTerms, - highlightTerms, -) => { - // results left, load the summary and display it - // this is intended to be dynamic (don't sub resultsCount) - if (results.length) { - _displayItem(results.pop(), searchTerms, highlightTerms); - setTimeout( - () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), - 5, - ); - } - // search finished, update title and status message - else _finishSearch(resultCount); -}; -// Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. -// Order the results by score (in opposite order of appearance, since the -// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. -const _orderResultsByScoreThenName = (a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; -}; - -/** - * Default splitQuery function. Can be overridden in ``sphinx.search`` with a - * custom function per language. - * - * The regular expression works by splitting the string on consecutive characters - * that are not Unicode letters, numbers, underscores, or emoji characters. - * This is the same as ``\W+`` in Python, preserving the surrogate pair area. - */ -if (typeof splitQuery === "undefined") { - var splitQuery = (query) => - query - .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) - .filter((term) => term); // remove remaining empty strings -} - -/** - * Search Module - */ -const Search = { - _index: null, - _queued_query: null, - _pulse_status: -1, - - htmlToText: (htmlString, anchor) => { - const htmlElement = new DOMParser().parseFromString( - htmlString, - "text/html", - ); - for (const removalQuery of [".headerlink", "script", "style"]) { - htmlElement.querySelectorAll(removalQuery).forEach((el) => { - el.remove(); - }); - } - if (anchor) { - const anchorContent = htmlElement.querySelector( - `[role="main"] ${anchor}`, - ); - if (anchorContent) return anchorContent.textContent; - - console.warn( - `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`, - ); - } - - // if anchor not specified or not found, fall back to main content - const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent) return docContent.textContent; - - console.warn( - "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template.", - ); - return ""; - }, - - init: () => { - const query = new URLSearchParams(window.location.search).get("q"); - document - .querySelectorAll('input[name="q"]') - .forEach((el) => (el.value = query)); - if (query) Search.performSearch(query); - }, - - loadIndex: (url) => - (document.body.appendChild(document.createElement("script")).src = url), - - setIndex: (index) => { - Search._index = index; - if (Search._queued_query !== null) { - const query = Search._queued_query; - Search._queued_query = null; - Search.query(query); - } - }, - - hasIndex: () => Search._index !== null, - - deferQuery: (query) => (Search._queued_query = query), - - stopPulse: () => (Search._pulse_status = -1), - - startPulse: () => { - if (Search._pulse_status >= 0) return; - - const pulse = () => { - Search._pulse_status = (Search._pulse_status + 1) % 4; - Search.dots.innerText = ".".repeat(Search._pulse_status); - if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); - }; - pulse(); - }, - - /** - * perform a search for something (or wait until index is loaded) - */ - performSearch: (query) => { - // create the required interface elements - const searchText = document.createElement("h2"); - searchText.textContent = _("Searching"); - const searchSummary = document.createElement("p"); - searchSummary.classList.add("search-summary"); - searchSummary.innerText = ""; - const searchList = document.createElement("ul"); - searchList.setAttribute("role", "list"); - searchList.classList.add("search"); - - const out = document.getElementById("search-results"); - Search.title = out.appendChild(searchText); - Search.dots = Search.title.appendChild(document.createElement("span")); - Search.status = out.appendChild(searchSummary); - Search.output = out.appendChild(searchList); - - const searchProgress = document.getElementById("search-progress"); - // Some themes don't use the search progress node - if (searchProgress) { - searchProgress.innerText = _("Preparing search..."); - } - Search.startPulse(); - - // index already loaded, the browser was quick! - if (Search.hasIndex()) Search.query(query); - else Search.deferQuery(query); - }, - - _parseQuery: (query) => { - // stem the search terms and add them to the correct list - const stemmer = new Stemmer(); - const searchTerms = new Set(); - const excludedTerms = new Set(); - const highlightTerms = new Set(); - const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); - splitQuery(query.trim()).forEach((queryTerm) => { - const queryTermLower = queryTerm.toLowerCase(); - - // maybe skip this "word" - // stopwords set is from language_data.js - if (stopwords.has(queryTermLower) || queryTerm.match(/^\d+$/)) return; - - // stem the word - let word = stemmer.stemWord(queryTermLower); - // select the correct list - if (word[0] === "-") excludedTerms.add(word.substr(1)); - else { - searchTerms.add(word); - highlightTerms.add(queryTermLower); - } - }); - - if (SPHINX_HIGHLIGHT_ENABLED) { - // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js - localStorage.setItem( - "sphinx_highlight_terms", - [...highlightTerms].join(" "), - ); - } - - // console.debug("SEARCH: searching for:"); - // console.info("required: ", [...searchTerms]); - // console.info("excluded: ", [...excludedTerms]); - - return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; - }, - - /** - * execute search (requires search index to be loaded) - */ - _performSearch: ( - query, - searchTerms, - excludedTerms, - highlightTerms, - objectTerms, - ) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - - // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename, kind]. - const normalResults = []; - const nonMainIndexResults = []; - - _removeChildren(document.getElementById("search-progress")); - - const queryLower = query.toLowerCase().trim(); - for (const [title, foundTitles] of Object.entries(allTitles)) { - if ( - title.toLowerCase().trim().includes(queryLower) - && queryLower.length >= title.length / 2 - ) { - for (const [file, id] of foundTitles) { - const score = Math.round( - (Scorer.title * queryLower.length) / title.length, - ); - const boost = titles[file] === title ? 1 : 0; // add a boost for document titles - normalResults.push([ - docNames[file], - titles[file] !== title ? `${titles[file]} > ${title}` : title, - id !== null ? "#" + id : "", - null, - score + boost, - filenames[file], - SearchResultKind.title, - ]); - } - } - } - - // search for explicit entries in index directives - for (const [entry, foundEntries] of Object.entries(indexEntries)) { - if (entry.includes(queryLower) && queryLower.length >= entry.length / 2) { - for (const [file, id, isMain] of foundEntries) { - const score = Math.round((100 * queryLower.length) / entry.length); - const result = [ - docNames[file], - titles[file], - id ? "#" + id : "", - null, - score, - filenames[file], - SearchResultKind.index, - ]; - if (isMain) { - normalResults.push(result); - } else { - nonMainIndexResults.push(result); - } - } - } - } - - // lookup as object - objectTerms.forEach((term) => - normalResults.push(...Search.performObjectSearch(term, objectTerms)), - ); - - // lookup as search terms in fulltext - normalResults.push( - ...Search.performTermsSearch(searchTerms, excludedTerms), - ); - - // let the scorer override scores with a custom scoring function - if (Scorer.score) { - normalResults.forEach((item) => (item[4] = Scorer.score(item))); - nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); - } - - // Sort each group of results by score and then alphabetically by name. - normalResults.sort(_orderResultsByScoreThenName); - nonMainIndexResults.sort(_orderResultsByScoreThenName); - - // Combine the result groups in (reverse) order. - // Non-main index entries are typically arbitrary cross-references, - // so display them after other results. - let results = [...nonMainIndexResults, ...normalResults]; - - // remove duplicate search results - // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept - let seen = new Set(); - results = results.reverse().reduce((acc, result) => { - let resultStr = result - .slice(0, 4) - .concat([result[5]]) - .map((v) => String(v)) - .join(","); - if (!seen.has(resultStr)) { - acc.push(result); - seen.add(resultStr); - } - return acc; - }, []); - - return results.reverse(); - }, - - query: (query) => { - const [ - searchQuery, - searchTerms, - excludedTerms, - highlightTerms, - objectTerms, - ] = Search._parseQuery(query); - const results = Search._performSearch( - searchQuery, - searchTerms, - excludedTerms, - highlightTerms, - objectTerms, - ); - - // for debugging - //Search.lastresults = results.slice(); // a copy - // console.info("search results:", Search.lastresults); - - // print the results - _displayNextItem(results, results.length, searchTerms, highlightTerms); - }, - - /** - * search for object names - */ - performObjectSearch: (object, objectTerms) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const objects = Search._index.objects; - const objNames = Search._index.objnames; - const titles = Search._index.titles; - - const results = []; - - const objectSearchCallback = (prefix, match) => { - const name = match[4]; - const fullname = (prefix ? prefix + "." : "") + name; - const fullnameLower = fullname.toLowerCase(); - if (fullnameLower.indexOf(object) < 0) return; - - let score = 0; - const parts = fullnameLower.split("."); - - // check for different match types: exact matches of full name or - // "last name" (i.e. last dotted part) - if (fullnameLower === object || parts.slice(-1)[0] === object) - score += Scorer.objNameMatch; - else if (parts.slice(-1)[0].indexOf(object) > -1) - score += Scorer.objPartialMatch; // matches in last name - - const objName = objNames[match[1]][2]; - const title = titles[match[0]]; - - // If more than one term searched for, we require other words to be - // found in the name/title/description - const otherTerms = new Set(objectTerms); - otherTerms.delete(object); - if (otherTerms.size > 0) { - const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); - if ( - [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) - ) - return; - } - - let anchor = match[3]; - if (anchor === "") anchor = fullname; - else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; - - const descr = objName + _(", in ") + title; - - // add custom score for some objects according to scorer - if (Scorer.objPrio.hasOwnProperty(match[2])) - score += Scorer.objPrio[match[2]]; - else score += Scorer.objPrioDefault; - - results.push([ - docNames[match[0]], - fullname, - "#" + anchor, - descr, - score, - filenames[match[0]], - SearchResultKind.object, - ]); - }; - Object.keys(objects).forEach((prefix) => - objects[prefix].forEach((array) => objectSearchCallback(prefix, array)), - ); - return results; - }, - - /** - * search for full-text terms in the index - */ - performTermsSearch: (searchTerms, excludedTerms) => { - // prepare search - const terms = Search._index.terms; - const titleTerms = Search._index.titleterms; - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - - const scoreMap = new Map(); - const fileMap = new Map(); - - // perform the search on the required terms - searchTerms.forEach((word) => { - const files = []; - // find documents, if any, containing the query word in their text/title term indices - // use Object.hasOwnProperty to avoid mismatching against prototype properties - const arr = [ - { - files: terms.hasOwnProperty(word) ? terms[word] : undefined, - score: Scorer.term, - }, - { - files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, - score: Scorer.title, - }, - ]; - // add support for partial matches - if (word.length > 2) { - const escapedWord = _escapeRegExp(word); - if (!terms.hasOwnProperty(word)) { - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord)) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - } - if (!titleTerms.hasOwnProperty(word)) { - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord)) - arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); - }); - } - } - - // no match but word was a required one - if (arr.every((record) => record.files === undefined)) return; - - // found search word in contents - arr.forEach((record) => { - if (record.files === undefined) return; - - let recordFiles = record.files; - if (recordFiles.length === undefined) recordFiles = [recordFiles]; - files.push(...recordFiles); - - // set score for the word in each file - recordFiles.forEach((file) => { - if (!scoreMap.has(file)) scoreMap.set(file, new Map()); - const fileScores = scoreMap.get(file); - fileScores.set(word, record.score); - }); - }); - - // create the mapping - files.forEach((file) => { - if (!fileMap.has(file)) fileMap.set(file, [word]); - else if (fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - }); - }); - - // now check if the files don't contain excluded terms - const results = []; - for (const [file, wordList] of fileMap) { - // check if all requirements are matched - - // as search terms with length < 3 are discarded - const filteredTermCount = [...searchTerms].filter( - (term) => term.length > 2, - ).length; - if ( - wordList.length !== searchTerms.size - && wordList.length !== filteredTermCount - ) - continue; - - // ensure that none of the excluded terms is in the search result - if ( - [...excludedTerms].some( - (term) => - terms[term] === file - || titleTerms[term] === file - || (terms[term] || []).includes(file) - || (titleTerms[term] || []).includes(file), - ) - ) - break; - - // select one (max) score for the file. - const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w))); - // add result to the result list - results.push([ - docNames[file], - titles[file], - "", - null, - score, - filenames[file], - SearchResultKind.text, - ]); - } - return results; - }, - - /** - * helper function to return a node containing the - * search summary for a given text. keywords is a list - * of stemmed words. - */ - makeSearchSummary: (htmlText, keywords, anchor) => { - const text = Search.htmlToText(htmlText, anchor); - if (text === "") return null; - - const textLower = text.toLowerCase(); - const actualStartPosition = [...keywords] - .map((k) => textLower.indexOf(k.toLowerCase())) - .filter((i) => i > -1) - .slice(-1)[0]; - const startWithContext = Math.max(actualStartPosition - 120, 0); - - const top = startWithContext === 0 ? "" : "..."; - const tail = startWithContext + 240 < text.length ? "..." : ""; - - let summary = document.createElement("p"); - summary.classList.add("context"); - summary.textContent = - top + text.substr(startWithContext, 240).trim() + tail; - - return summary; - }, -}; - -_ready(Search.init); diff --git a/docs/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js deleted file mode 100644 index a74e103..0000000 --- a/docs/_build/html/_static/sphinx_highlight.js +++ /dev/null @@ -1,159 +0,0 @@ -/* Highlighting utilities for Sphinx HTML documentation. */ -"use strict"; - -const SPHINX_HIGHLIGHT_ENABLED = true; - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 - && !parent.classList.contains(className) - && !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - const rest = document.createTextNode(val.substr(pos + text.length)); - parent.insertBefore(span, parent.insertBefore(rest, node.nextSibling)); - node.nodeValue = val.substr(0, pos); - /* There may be more occurrences of search term in this node. So call this - * function recursively on the remaining fragment. - */ - _highlight(rest, addItems, text, className); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect", - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target), - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const SphinxHighlight = { - /** - * highlight the search words provided in localstorage in the text - */ - highlightSearchWords: () => { - if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight - - // get and clear terms from localstorage - const url = new URL(window.location); - const highlight = - localStorage.getItem("sphinx_highlight_terms") - || url.searchParams.get("highlight") - || ""; - localStorage.removeItem("sphinx_highlight_terms"); - // Update history only if '?highlight' is present; otherwise it - // clears text fragments (not set in window.location by the browser) - if (url.searchParams.has("highlight")) { - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - } - - // get individual terms from highlight string - const terms = highlight - .toLowerCase() - .split(/\s+/) - .filter((x) => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '", - ), - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - localStorage.removeItem("sphinx_highlight_terms"); - }, - - initEscapeListener: () => { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) - return; - // bail with special keys - if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) - return; - if ( - DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - && event.key === "Escape" - ) { - SphinxHighlight.hideSearchWords(); - event.preventDefault(); - } - }); - }, -}; - -_ready(() => { - /* Do not call highlightSearchWords() when we are on the search page. - * It will highlight words from the *previous* search query. - */ - if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); - SphinxHighlight.initEscapeListener(); -}); diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html deleted file mode 100644 index 11afc13..0000000 --- a/docs/_build/html/genindex.html +++ /dev/null @@ -1,2334 +0,0 @@ - - - - - - - - Index — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- - -

Index

- -
- _ - | A - | B - | C - | D - | E - | F - | G - | H - | I - | K - | L - | M - | N - | O - | P - | R - | S - | T - | V - -
-

_

- - - -
- -

A

- - - -
- -

B

- - -
- -

C

- - - -
- -

D

- - - -
- -

E

- - - -
- -

F

- - - -
- -

G

- - - -
- -

H

- - - -
- -

I

- - - -
- -

K

- - -
- -

L

- - - -
- -

M

- - - -
- -

N

- - - -
- -

O

- - - -
- -

P

- - - -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

V

- - - -
- - - -
-
-
- -
- -
-

© Copyright 2025-2026, PowerGridSynth Developers.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html deleted file mode 100644 index c45a872..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - - PowerGridSynth — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

PowerGridSynth

-

PowerGridSynth is an open-source Python package for generating realistic synthetic power grids at both the transmission and distribution level.

-
    -
  • Transmission grids are synthesized using a Chung-Lu-Chain (CLC) graph model that reproduces prescribed degree distributions and diameters across multiple voltage levels, then layers on bus-type assignment, generation/load capacity allocation (active and reactive power), generation dispatch, and transmission-line impedance/capacity assignment drawn from empirical statistics of real grids (NYISO, WECC).

  • -
  • Distribution feeders are synthesized using the algorithm of Schweitzer et al. (2017), producing radial MV/LV tree graphs with realistic cable types, lengths, and load/generation profiles.

  • -
-

Synthesised grids can be exported to 12+ industry-standard formats via pandapower and pypowsybl and validated with DC and AC power-flow solvers from both libraries.

-

The goal of the project is to provide synthetic yet realistic power grids for grid modeling, simulation and analysis, with the ultimate goal of building Foundation Models for power grids. It is part of LF Energy, a Linux Foundation focused on the energy sector. This project is supported by AI-EFFECT (Artificial Intelligence Experimentation Facility For the Energy Sector).

-
-

Transmission Grid Synthesis

-
-

Synthesis Pipeline

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Step

Module

Method

1

Topology generation

CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model

2

Bus-type assignment

Entropy-based Artificial Immune System (AIS) optimisation reproducing empirical 2-D joint distribution of bus types and node degrees

3

Generation capacity

Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table

4

Load allocation

Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model

5

Generation dispatch

Three-category partitioning (uncommitted / partially committed / fully committed) with 2-D bin matching and iterative balancing

6

Transmission lines

LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment via 2-D table

-
-
-

Quick Start

-

The high-level synthesize() function runs the entire CLC transmission pipeline in one call:

-
from powergrid_synth import synthesize
-
-# Mode I — clone an existing grid's statistical profile
-grid = synthesize(
-    mode="reference",
-    reference_case="case118",
-    seed=42,
-    export_formats=["json", "cgmes", "matpower"],
-)
-
-# Mode II — fully synthetic from user-specified parameters
-grid = synthesize(
-    mode="synthetic",
-    level_specs=[
-        {"n": 50,  "avg_k": 3.5, "diam": 10, "dist_type": "dgln"},
-        {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"},
-        {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"},
-    ],
-    connection_specs={
-        (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15},
-        (1, 2): {"type": "k-stars", "c": 0.15,  "gamma": 4.15},
-    },
-    seed=42,
-    export_formats=["json", "matpower"],
-)
-
-
-

See examples/Synthesize.nblink for a full walkthrough.

-
-
-

Step-by-Step Usage

-

For fine-grained control over individual pipeline stages:

-
from powergrid_synth import (
-    InputConfigurator, PowerGridGenerator, BusTypeAllocator,
-    CapacityAllocator, LoadAllocator, GenerationDispatcher,
-    TransmissionLineAllocator, GridVisualizer,
-)
-
-# 1. Configure voltage levels and inter-level connections
-level_specs = [
-    {'n': 50,  'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'},
-    {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'},
-    {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'},
-]
-connection_specs = {
-    (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15},
-    (1, 2): {'type': 'k-stars', 'c': 0.15,  'gamma': 4.15},
-}
-
-config = InputConfigurator(seed=42)
-params = config.create_params(level_specs, connection_specs)
-
-# 2. Generate topology (CLC model)
-gen = PowerGridGenerator(seed=42)
-grid = gen.generate_grid(
-    degrees_by_level=params['degrees_by_level'],
-    diameters_by_level=params['diameters_by_level'],
-    transformer_degrees=params['transformer_degrees'],
-)
-
-# 3. Assign bus types, generation/load, dispatch, and line parameters
-BusTypeAllocator(grid).allocate()
-CapacityAllocator(grid).allocate()
-LoadAllocator(grid).allocate()
-GenerationDispatcher(grid).dispatch()
-TransmissionLineAllocator(grid).allocate()
-
-# 4. Visualize
-GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid")
-
-
-

See the Examples for Jupyter notebooks covering each step in detail.

-
-
-
-

Distribution Grid Synthesis

-
-

Quick Start

-

The high-level synthesize_distribution() function generates realistic radial MV/LV feeders in one call:

-
from powergrid_synth import synthesize_distribution
-
-# Mode I — fit parameters from a reference distribution network
-feeders = synthesize_distribution(
-    mode="reference",
-    reference_case="cigre_lv",
-    n_feeders=5,
-    n_nodes=20,
-    total_load_mw=0.5,
-    seed=42,
-    output_dir="output",
-    export_formats=["json"],
-)
-
-# Mode II — use default Table III parameters (no reference needed)
-feeders = synthesize_distribution(
-    mode="default",
-    n_feeders=10,
-    n_nodes=30,
-    total_load_mw=0.8,
-    seed=7,
-)
-
-
-

See examples/DistributionSynth.nblink and examples/DistributionSynthFromRef.nblink for detailed walkthroughs.

-
-
-
-

Supported Data Formats & Power-Flow Solvers

-

Synthetic grids live as NetworkX graphs internally and can be converted / exported via -GridExporter and data_format_converter.

-

Export formats

- ----- - - - - - - - - - - - - - - - - -

Via

Format

Method

pandapower

JSON, Excel, SQLite, Pickle

to_json(), to_excel(), to_sqlite(), to_pickle()

pypowsybl

CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL, BIIDM, JIIDM

to_cgmes(), to_matpower(), to_psse(), to_pypowsybl(format=...)

-

Conversion chain:

-
Export:  NetworkX  ↔  pandapower  →  pypowsybl  →  [CGMES / XIIDM / MATPOWER / PSS·E / …]
-Import:  [CGMES / XIIDM / MATPOWER / PSS·E / …]  →  pypowsybl  →  NetworkX  (via load_grid / pypowsybl_to_nx)
-
-
-

Converter functions: pandapower_to_nx, nx_to_pandapower, -pandapower_to_pypowsybl, pypowsybl_to_nx, load_grid -(in data_format_converter.py).

-

Power-flow solvers

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Solver

Library

Type

Call

Newton-Raphson AC

pandapower

AC

pp.runpp(net)

Linear DC

pandapower

DC

pp.rundcpp(net)

AC load-flow

pypowsybl

AC

pypowsybl.loadflow.run_ac(net)

DC load-flow

pypowsybl

DC

pypowsybl.loadflow.run_dc(net)

Built-in DCPF

powergrid_synth

DC

DCPowerFlow(graph).run()

-
-
-
-
-
-
-
-
-
-
- - -
-
-
- -
- -
-

© Copyright 2025-2026, PowerGridSynth Developers.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv deleted file mode 100644 index 10ad569..0000000 Binary files a/docs/_build/html/objects.inv and /dev/null differ diff --git a/docs/_build/html/reference/api_reference.html b/docs/_build/html/reference/api_reference.html deleted file mode 100644 index 24029be..0000000 --- a/docs/_build/html/reference/api_reference.html +++ /dev/null @@ -1,1957 +0,0 @@ - - - - - - - - - API Reference — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

API Reference

-
-

Transmission Grid Synthesis

-
-

High-Level Function

-
-
-powergrid_synth.synthesize(*, mode, reference_case=None, reference_net=None, reference_file=None, level_specs=None, connection_specs=None, seed=None, keep_lcc=True, entropy_model=0, bus_type_ratio=None, ref_sys_id=1, loading_level='H', refine_topology=False, base_kv_map=None, output_dir='output', output_name='synthetic_grid', export_formats=('json',))[source]
-

Run the full CLC synthesis pipeline and export the result.

-
-
Parameters:
-
    -
  • mode ("reference" or "synthetic") –

    Selects the operation mode.

    -
      -
    • "reference" — extract topology parameters from an existing -pandapower network (Mode I).

    • -
    • "synthetic" — generate topology from user-provided level / -connection specs (Mode II).

    • -
    -

  • -
  • reference_case (str, optional) – Name of a built-in network. Supports both pandapower case names -(e.g. "case118") and pypowsybl IEEE names (e.g. -"ieee14", "ieee118"). Ignored if reference_net or -reference_file is given.

  • -
  • reference_net (pandapowerNet or pypowsybl.network.Network, optional) – A pre-loaded network object (pandapower or pypowsybl). Takes -precedence over reference_case and reference_file.

  • -
  • reference_file (str, optional) – Path to a grid file in any pypowsybl-supported format (CGMES, -XIIDM, MATPOWER, IEEE-CDF, PSS/E, UCTE, etc.). Takes -precedence over reference_case.

  • -
  • level_specs (list of dict, optional) – Voltage-level specifications for Mode II. Each dict must have -keys "n" (int), "avg_k" (float), "diam" (int), and -"dist_type" ("dgln" | "dpl" | "poisson"). -Optionally "max_k" (int).

  • -
  • connection_specs (dict, optional) – Transformer connection specs for Mode II. Maps -(level_i, level_j) tuples to dicts with "type" -("k-stars" | "simple") and parameters "c", "gamma".

  • -
  • seed (int, optional) – Random seed for reproducibility.

  • -
  • keep_lcc (bool) – If True (default), keep only the largest connected component -after topology generation.

  • -
  • entropy_model (int) – Bus-type entropy model — 0 (standard) or 1 (weighted).

  • -
  • bus_type_ratio (list of float, optional) – Target [Gen%, Load%, Conn%] ratios. If None, default -ratios based on network size are used.

  • -
  • ref_sys_id (int) – Reference system for statistical tables (0–3).

  • -
  • loading_level (str) – Load level — "D" (deterministic), "L" (light), -"M" (medium), "H" (heavy, default).

  • -
  • refine_topology (bool) – If True, the transmission allocator may add/remove edges to -improve DCPF convergence.

  • -
  • base_kv_map (dict, optional) – Custom {level_index: kV} mapping. If None and -mode="reference", the mapping is extracted from the reference -grid.

  • -
  • output_dir (str) – Directory for exported files (created if needed).

  • -
  • output_name (str) – Base filename (without extension) for exported files.

  • -
  • export_formats (sequence of str) – One or more format names to export. Supported: -"json", "excel", "sqlite", "pickle", -"xiidm", "cgmes", "matpower", "psse".

  • -
-
-
Returns:
-

The fully parameterised synthetic grid (a -PowerGridGraph).

-
-
Return type:
-

nx.Graph

-
-
Raises:
-

ValueError – If mode is not "reference" or "synthetic", or if - required arguments for the chosen mode are missing.

-
-
-
- -
-
-

Topology Generation

-
-
-class powergrid_synth.InputConfigurator(seed=None)[source]
-

Bases: object

-

Generate detailed input sequences for PowerGridGenerator from -high-level parameters.

-

This is “operation mode II”, where the user specifies only the number of -nodes, average degree, diameter, and distribution type for each voltage -level, rather than providing explicit degree sequences. The configurator -uses DegreeDistributionOptimizer to fit distribution parameters -and then samples degree sequences.

-

See Section 6 of Aksoy et al. (2018) for the synthetic input -generation guidelines.

-
-
Parameters:
-

seed (int or None, optional) – Random seed for reproducibility. Default is None.

-
-
-
-
-create_params(levels, inter_connections)[source]
-

Generate the full parameter set for PowerGridGenerator.generate_grid().

-
-
Parameters:
-
    -
  • levels (list of dict) –

    One dict per voltage level with keys:

    -
      -
    • 'n' (int): number of nodes.

    • -
    • 'avg_k' (float): target average degree.

    • -
    • 'diam' (int): target diameter.

    • -
    • 'dist_type' (str): 'dgln', 'dpl', or 'poisson'.

    • -
    • 'max_k' (int, optional): maximum degree (default: -min(n - 1, 50)). For 'dpl' the paper suggests -\(d_{\max} \approx 1.517\,n^{1/4}\); for 'dgln' -\(\bar{d} \approx 2.425 \pm 0.185\) is consistent across -subgraphs (Section 6.1 of Aksoy et al., 2018).

    • -
    -

  • -
  • inter_connections (dict) –

    Mapping (i, j) -> config for transformer connections. -Config is either:

    -
      -
    • {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15}

    • -
    • {'type': 'simple', 'p_i_j': float, 'p_j_i': float}

    • -
    -

  • -
-
-
Returns:
-

Keys 'degrees_by_level', 'diameters_by_level', and -'transformer_degrees', ready to be unpacked into -PowerGridGenerator.generate_grid().

-
-
Return type:
-

dict

-
-
-
- -
- -
-
-class powergrid_synth.PowerGridGenerator(seed=None)[source]
-

Bases: object

-

Generative model for an entire power grid graph on k voltage levels.

-

Implements Algorithm 4 (CLCStars) from Aksoy et al. (2018). -Phase 1 generates each same-voltage subgraph via the CLC model, -and Phase 2 inserts transformer edges via the random-star model.

-
-
Parameters:
-

seed (int or None, optional) – Random seed for reproducibility. Default is None.

-
-
-
-
-generate_grid(degrees_by_level, diameters_by_level, transformer_degrees, keep_lcc=False)[source]
-

Generate a multi-level power grid graph (CLCStars, Algorithm 4).

-

Runs Phase 1 (CLC for each voltage level) and Phase 2 (random-star -transformer edges for each pair of levels), then combines results.

-
-
Parameters:
-
    -
  • degrees_by_level (list of list of int) – Desired degree sequences \(\mathbf{d}^{X_1},\dots,\mathbf{d}^{X_k}\), -one per voltage level.

  • -
  • diameters_by_level (list of int) – Desired diameters \(\delta^{X_1},\dots,\delta^{X_k}\), -one per voltage level.

  • -
  • transformer_degrees (dict) – Mapping (i, j) -> (t_i_j, t_j_i) where t_i_j is the -transformer degree list for level-i nodes toward level j, -and t_j_i is the reverse.

  • -
  • keep_lcc (bool, optional) – If True, return only the largest connected component with -contiguous node IDs. Default is False.

  • -
-
-
Returns:
-

The generated grid graph with voltage_level node attributes -and type ('line' or 'transformer') edge attributes.

-
-
Return type:
-

PowerGridGraph

-
-
-
- -
- -
-
-

Electrical Assignment

-
-
-class powergrid_synth.BusTypeAllocator(graph, entropy_model=0, bus_type_ratio=None)[source]
-

Bases: object

-

Assigns bus types (Generator, Load, Connection) to a raw power grid -topology using an Artificial Immune System (AIS) optimization algorithm.

-

The method, from Elyas and Wang (2016), exploits the observed non-trivial -correlations between bus types and topology metrics (node degree, clustering -coefficient) in realistic grids. A bus type entropy measure quantifies -these correlations, and a target entropy \(W^*\) is derived from a -scaling property fitted to real-world systems. The AIS then searches for -an assignment whose entropy matches \(W^*\).

-

The pipeline is:

-
    -
  1. Determine target bus type ratios \((r_G, r_L, r_C)\) from network -size.

  2. -
  3. Estimate \(W^*\) via Monte Carlo sampling of random assignments -and the scaling relation \(W^* = \mu + \sigma \cdot d(N)\).

  4. -
  5. Run AIS optimization (clonal selection, hypermutation, receptor editing) -to find an assignment \(\mathbb{T}\) such that -\(|W(\mathbb{T}) - W^*| < \epsilon\).

  6. -
-

Two entropy definitions are supported:

-
    -
  • Model 0 (\(W_0\)): standard entropy of bus/link type ratios. -\(\mu\) is stable across network sizes.

  • -
  • Model 1 (\(W_1\)): generalized entropy weighted by \(N\) -and \(M\). \(\mu\) grows with network size, giving better -discrimination in large grids.

  • -
-
-
Parameters:
-
    -
  • graph (nx.Graph) – NetworkX graph representing the grid topology (nodes and edges only; -no bus type attributes required yet).

  • -
  • entropy_model (int) – Selects the entropy definition: 0 for \(W_0\), 1 for \(W_1\).

  • -
  • bus_type_ratio (list of float or None) – Optional target ratios [Gen, Load, Conn]. Values are normalized -to sum to 1. If None, default ratios are chosen based on N.

  • -
-
-
-

References

- -
-
-TYPE_CONN = 3
-
- -
-
-TYPE_GEN = 1
-
- -
-
-TYPE_LOAD = 2
-
- -
-
-allocate(max_iter=100, population_size=20)[source]
-

Run the AIS optimization to find a bus type assignment.

-

Implements the Clonal Selection Principle:

-
    -
  1. Monte Carlo estimation of \(W^*\) and convergence -threshold \(\epsilon\) (see _estimate_w_star()).

  2. -
  3. Initialize a population of K random assignments.

  4. -
  5. Iterate until max_iter or best_error < epsilon:

    -
      -
    1. Evaluate fitness \(|W^* - W(\mathbb{T})|\) for each -individual.

    2. -
    3. Clonal selection — top-ranked individuals produce more -clones: \(N_c = \text{round}(\beta \cdot s / r)\) where -r is the rank.

    4. -
    5. Hypermutation — clones are mutated with intensity -proportional to their parent’s rank (worse → more mutations).

    6. -
    7. Receptor editing — inject 10% fresh random solutions to -maintain diversity and avoid local optima.

    8. -
    9. Selection — combine elite, mutated clones, and fresh -solutions; keep the top K.

    10. -
    -
  6. -
  7. Return the best assignment found.

  8. -
-
-
Parameters:
-
    -
  • max_iter (int, optional) – Maximum number of AIS iterations (default 100).

  • -
  • population_size (int, optional) – Number of individuals surviving each generation (default 20).

  • -
-
-
Returns:
-

Mapping from node ID to bus type label -('Gen', 'Load', or 'Conn').

-
-
Return type:
-

dict[int, str]

-
-
-
- -
-
-plot_entropy_pdf(figsize=(10, 6))[source]
-

Plot the empirical PDF of entropy samples from the Monte Carlo -estimation, with a fitted normal distribution overlay.

-

Must be called after allocate() or _estimate_w_star() -so that self.w_samples is populated.

-
-
Parameters:
-

figsize (tuple of int, optional) – Figure size (width, height) in inches.

-
-
-
- -
- -
-
-class powergrid_synth.CapacityAllocator(graph, ref_sys_id=1)[source]
-

Bases: object

-

Assigns generation capacities (PgMax) to generator buses in the grid.

-

Implements the three-stage methodology from Elyas et al. (2017):

-
    -
  1. Total generation: Compute the aggregate generation capacity from a -scaling law fitted to realistic grids: -log Pg_tot(N) = -0.21 * log^2(N) + 2.06 * log(N) + 0.66.

  2. -
  3. Individual capacities: Sample N_g individual capacities from an -exponential distribution (with ~1% super-large outliers to capture the -observed heavy tail).

  4. -
  5. Correlated assignment: Assign capacities to generator buses using a -14x14 empirical 2D probability table (Tab_2D_Pgmax) that encodes -the joint distribution of normalized capacity and normalized nodal -degree. This preserves the observed Pearson correlation -rho(P_bar, k_bar) in [0.25, 0.5] between capacity and degree.

  6. -
-

Reference systems with pre-computed Tab_2D_Pgmax tables are available -for NYISO-2935 (id=1), WECC-16944 (id=2), and a third system (id=3). -A heuristic diagonal-bias table (id=0) is provided as a fallback.

-
-
Parameters:
-
    -
  • graph (nx.Graph) – NetworkX graph with 'bus_type' node attributes already set -(by BusTypeAllocator).

  • -
  • ref_sys_id (int) – Reference system for statistical tables (0=heuristic, 1=NYISO-2935, -2=WECC-16944, 3=additional reference).

  • -
-
-
-

References

- -
-
-allocate(tab_2d=None)[source]
-

Run the full generation-capacity allocation pipeline.

-

Executes the three-stage methodology from Elyas et al. (2017):

-
    -
  1. Compute total generation capacity from the scaling law: -Pg_tot = 10^(-0.21 * log10(N)^2 + 2.06 * log10(N) + 0.66).

  2. -
  3. Sample individual capacities, normalize them and the generator -nodal degrees by their respective maxima so that both lie in -[0, 1]: P_bar = P / max(P), k_bar = k / max(k).

  4. -
  5. Assign normalized capacities to generator buses via 2D binning -using Tab_2D_Pgmax.

  6. -
  7. Denormalize: Pg_max = P_bar * max(P).

  8. -
-
-
Parameters:
-

tab_2d (np.ndarray or None, optional) – Custom 14x14 probability matrix. If None, the default table -for the selected ref_sys_id is used.

-
-
Returns:
-

Mapping from generator node ID to its assigned capacity -Pg_max (MW).

-
-
Return type:
-

dict[int, float]

-
-
-
- -
- -
-
-class powergrid_synth.LoadAllocator(graph, ref_sys_id=1)[source]
-

Bases: object

-

Assigns active power loads (PL) to load buses in the grid.

-

Implements the load-setting methodology from Elyas et al. (2017), which -mirrors the generation-capacity approach in CapacityAllocator:

-
    -
  1. Total load: Compute an aggregate load target, either from a -deterministic scaling formula or as a fraction (light / medium / heavy) -of the total installed generation capacity.

  2. -
  3. Individual loads: Sample N_l individual loads from an exponential -distribution (with ~1% super-large outliers).

  4. -
  5. Correlated assignment: Assign loads to load buses using a 14x14 -empirical 2D probability table (Tab_2D_load) that encodes the -joint distribution of normalized load demand and normalized nodal -degree.

  6. -
-

Reference systems with pre-computed Tab_2D_load tables are available -for NYISO-2935 (id=1), WECC-16944 (id=2), and a third system (id=3). -A heuristic diagonal-bias table (id=0) is provided as a fallback.

-
-
Parameters:
-
    -
  • graph (nx.Graph) – NetworkX graph with 'bus_type' and (for non-deterministic loading -levels) 'pg_max' node attributes already set.

  • -
  • ref_sys_id (int) – Reference system for statistical tables (0=heuristic, 1=NYISO-2935, -2=WECC-16944, 3=additional reference).

  • -
-
-
-

References

- -
-
-allocate(loading_level='H')[source]
-

Run the full load-allocation pipeline.

-

Executes the three-stage methodology (analogous to -CapacityAllocator.allocate()):

-
    -
  1. Compute total system load from loading_level strategy.

  2. -
  3. Sample individual loads, normalize them and the load-bus nodal -degrees by their respective maxima: -P_bar = P / max(P), k_bar = k / max(k).

  4. -
  5. Assign normalized loads to load buses via 2D binning using -Tab_2D_load.

  6. -
  7. Denormalize: PL = P_bar * max(P).

  8. -
-
-
Parameters:
-

loading_level (str, optional) –

Loading strategy (default 'H'):

-
    -
  • 'D' — deterministic scaling formula.

  • -
  • 'L' — light (30–40% of generation capacity).

  • -
  • 'M' — medium (50–60% of generation capacity).

  • -
  • 'H' — heavy (70–80% of generation capacity).

  • -
-

-
-
Returns:
-

Mapping from load node ID to its assigned active power load (MW).

-
-
Return type:
-

dict[int, float]

-
-
-
- -
-
-allocate_reactive(active_loads, pf_min=0.85, pf_max=0.97)[source]
-

Derive reactive power loads from active loads using power factors.

-

For each load bus, a power factor is sampled uniformly from -[pf_min, pf_max] (lagging) and the reactive load is computed as -ql = pl * tan(arccos(pf)).

-

Theory reference: -https://www.phasetophase.nl/book/book_2_9.html#_9.5.2

-
-
Parameters:
-
    -
  • active_loads (dict[int, float]) – Mapping from load node ID to active power load (MW), as returned -by allocate().

  • -
  • pf_min (float, optional) – Minimum power factor (default 0.85).

  • -
  • pf_max (float, optional) – Maximum power factor (default 0.97).

  • -
-
-
Returns:
-

Mapping from load node ID to reactive power load (Mvar).

-
-
Return type:
-

dict[int, float]

-
-
-
- -
- -
-
-class powergrid_synth.GenerationDispatcher(graph, ref_sys_id=1)[source]
-

Bases: object

-

Assign active-power dispatch to each generator bus.

-

The algorithm follows Sadeghian et al. (2018) (Section III):

-
    -
  1. Uncommitted units (10–20 %): \(\alpha = 0\), selected via -targets drawn from Uniform[0, 0.6].

  2. -
  3. Partially committed units (40–50 %): selected via exponential -distribution on capacity; dispatch factors assigned through a -2-D bin-matching table Tab_2D_Pg (\(14 \times 10\)).

  4. -
  5. Fully committed units (remainder): \(\alpha = 1\).

  6. -
  7. Balancing loop: iteratively adjusts dispatch to match total -load within 1 % tolerance.

  8. -
-
-
Parameters:
-
    -
  • graph (networkx.Graph) – Power grid graph. Generator nodes must have 'bus_type' == 'Gen' -and 'pg_max' (MW) attributes. Load nodes must have 'pl' (MW).

  • -
  • ref_sys_id (int, optional) – Reference system for statistical tables (1 = NYISO-2935, -2 = WECC-16994, 3 = additional reference). Default is 1.

  • -
-
-
-
-
-alpha_mod
-

Loading-level flag from the reference system. When 0 all alphas -are Uniform[0, 1]; otherwise 0.5 % receive negative dispatch -(e.g., pumped-storage hydro).

-
-
Type:
-

int

-
-
-
- -
-
-mu_committed
-

Exponential-distribution parameter for committed-unit capacities.

-
-
Type:
-

float

-
-
-
- -
-
-tab_2d_pg
-

2-D empirical PMF table (14 capacity bins × 10 alpha bins).

-
-
Type:
-

numpy.ndarray

-
-
-
- -
-
-dispatch()[source]
-

Run the full generation dispatch pipeline.

-

Implements the algorithm of Sadeghian et al. (2018):

-
    -
  1. Collect generator buses and normalise capacities by -\(P^{\max}_{g_{\max}}\).

  2. -
  3. Partition generators into uncommitted -(\(\alpha = 0\)), partially committed -(\(0 < \alpha < 1\)), and fully committed -(\(\alpha = 1\)).

  4. -
  5. Assign dispatch factors to partially committed units via -the 2-D bin-matching table Tab_2D_Pg.

  6. -
  7. Iteratively balance total generation against total load -(1 % tolerance, up to 50 iterations) by scaling committed -\(\alpha\) values and toggling uncommitted / full-load -units on or off.

  8. -
  9. Convert normalised dispatch back to MW: -\(P_{g_i} = \alpha_i \cdot \bar{P}_{g_i}^{\max} \cdot P^{\max}_{g_{\max}}\).

  10. -
-
-
Returns:
-

Mapping of generator bus ID to dispatched active power (MW).

-
-
Return type:
-

dict

-
-
-
- -
- -
-
-class powergrid_synth.TransmissionLineAllocator(graph, ref_sys_id=1)[source]
-

Bases: object

-

Allocate impedance and capacity limits to transmission lines.

-

The algorithm follows Sadeghian et al. (2018) and the SynGrid -MATLAB toolbox (sg_line.m, sg_flow_lim.m):

-
    -
  1. Impedance generation — magnitudes \(Z\) from -LogNormal(\(\mu\), \(\sigma\)), angles \(\varphi\) -from a Lévy stable distribution -\(S(\alpha_s, \beta_s, \gamma_s, \delta_s)\). Then -\(X = Z \sin\varphi\), \(R = Z \cos\varphi\).

  2. -
  3. DCPF-based swapping — sort impedances ascending and flows -descending, then randomly swap ~20–30 % of assignments to -introduce variance while preserving the negative correlation -between impedance and flow.

  4. -
  5. (Optional) Topology refinement — iteratively add -low-impedance lines between max angle-difference bus pairs -and remove weak high-\(X\) lines until the angle spread -is below a size-dependent threshold.

  6. -
  7. Capacity assignment — gauge ratios -\(\beta_l = F_l / F_l^{\max}\) from -Exponential(\(\mu_\beta\)) with overload injection; -assigned via 2-D table Tab_2D_FlBeta. -Capacity limits: \(F_l^{\max} = F_l / \beta_l\).

  8. -
-
-
Parameters:
-
    -
  • graph (networkx.Graph) – Power grid graph with nodal generation/load attributes.

  • -
  • ref_sys_id (int, optional) – Reference system (1 = NYISO-2935, 2 = WECC-16994). Default 1.

  • -
-
-
-
-
-stab_params
-

Lévy stable parameters \([\alpha_s, \beta_s, \gamma_s, \delta_s]\).

-
-
Type:
-

list of float

-
-
-
- -
-
-tab_fl_beta
-

2-D empirical PMF table for flow–beta assignment.

-
-
Type:
-

numpy.ndarray

-
-
-
- -
-
-mu_beta
-

Mean of the exponential distribution for \(\beta\).

-
-
Type:
-

float

-
-
-
- -
-
-overload_b
-

Fraction of lines assigned overload (\(\beta > 1\)).

-
-
Type:
-

float

-
-
-
- -
-
-allocate(refine_topology=False)[source]
-

Run the full transmission-line allocation pipeline.

-

Executes the seven-step procedure:

-
    -
  1. Draw impedance magnitudes -\(Z \sim \text{LogNormal}(\mu, \sigma)\), clipped to -[0.001, 0.5] p.u.

  2. -
  3. Generate angles \(\varphi\) (Lévy stable), compute -\(X = Z\sin\varphi\), \(R = Z\cos\varphi\).

  4. -
  5. Iterative DCPF swapping: sort \(Z\) ascending / flows -descending, randomly swap ~20–30 % of assignments.

  6. -
  7. (Optional) Topology refinement via _refine_topology().

  8. -
  9. Final DCPF to obtain converged flows.

  10. -
  11. Generate and assign gauge ratios (\(\beta\)) via -_generate_beta() and _assign_betas().

  12. -
  13. Set capacity limits: -\(F_l^{\max} = F_l / \beta_l\) with a minimum-capacity -fallback (5 + 100 · rand MW when \(\le 2\)).

  14. -
-
-
Parameters:
-

refine_topology (bool, optional) – If True, run topology refinement after step 3. Default -is False.

-
-
Returns:
-

Mapping (u, v) edge tuple to capacity limit (MW).

-
-
Return type:
-

dict

-
-
-
- -
- -
-
-
-
-

Distribution Grid Synthesis

-
-

High-Level Function

-
-
-powergrid_synth.synthesize_distribution(*, mode, reference_case=None, reference_net=None, reference_file=None, params=None, n_feeders=1, n_nodes=20, total_load_mw=0.5, total_gen_mw=0.0, v_nom_kv=10.0, assign_cable_types=True, assign_cable_lengths=True, seed=None, output_dir=None, output_name='synthetic_feeder', export_formats=('json',))[source]
-

Run the full Schweitzer distribution synthesis pipeline.

-
-
Parameters:
-
    -
  • mode ("reference" or "default") –

    Selects the operation mode.

    -
      -
    • "reference" — fit synthesis parameters from an existing -distribution network (pandapower, pypowsybl, or file), then -generate synthetic feeders with the fitted parameters.

    • -
    • "default" — use default Table III parameters (or a -user-supplied DistributionSynthParams).

    • -
    -

  • -
  • reference_case (str, optional) – Short name of a built-in distribution network. Currently -supported: "cigre_lv", "cigre_mv", or any pandapower -factory function name. Ignored when reference_net or -reference_file is given.

  • -
  • reference_net (pandapowerNet or pypowsybl.network.Network, optional) – A pre-loaded network object. Takes precedence over -reference_case and reference_file.

  • -
  • reference_file (str, optional) – Path to a grid file in any pypowsybl-supported format.

  • -
  • params (DistributionSynthParams, optional) – Custom parameters for mode="default". If None, the -built-in defaults from Schweitzer Table III are used.

  • -
  • n_feeders (int) – Number of synthetic feeders to generate (default 1).

  • -
  • n_nodes (int) – Number of nodes per feeder (default 20).

  • -
  • total_load_mw (float) – Total load in MW per feeder (default 0.5).

  • -
  • total_gen_mw (float) – Total generation in MW per feeder (default 0.0).

  • -
  • v_nom_kv (float) – Nominal voltage in kV (default 10.0).

  • -
  • assign_cable_types (bool) – Run Step 4 — cable type assignment (default True).

  • -
  • assign_cable_lengths (bool) – Run Step 5 — cable length / impedance assignment (default True).

  • -
  • seed (int, optional) – Random seed for reproducibility.

  • -
  • output_dir (str, optional) – If given, export feeders to this directory.

  • -
  • output_name (str) – Base filename (without extension) for exported files.

  • -
  • export_formats (sequence of str) – Export formats when output_dir is set. Supported: -"json", "excel", "sqlite", "pickle".

  • -
-
-
Returns:
-

Generated synthetic feeders as annotated NetworkX graphs.

-
-
Return type:
-

list[nx.Graph]

-
-
Raises:
-

ValueError – If mode is invalid or required arguments are missing.

-
-
-
- -
-
-

Core Classes

-
-
-class powergrid_synth.distribution.SchweetzerFeederGenerator(params=None, seed=None)[source]
-

Bases: object

-

Generate a single MV radial distribution feeder.

-
-
Parameters:
-
    -
  • params (DistributionSynthParams, optional) – All distribution parameters. Defaults to Table III values.

  • -
  • seed (int or None, optional) – Random seed for reproducibility.

  • -
-
-
-
-
-generate_feeder(n_nodes, total_load_mw, total_gen_mw=0.0, v_nom_kv=10.0, assign_cable_types=True, assign_cable_lengths=True)[source]
-

Generate a complete MV distribution feeder.

-
-
Parameters:
-
    -
  • n_nodes (int) – Total number of nodes in the feeder (including source and root).

  • -
  • total_load_mw (float) – Total real-power load (MW) to be distributed across load buses.

  • -
  • total_gen_mw (float, optional) – Total real-power generation/injection (MW). Default 0.

  • -
  • v_nom_kv (float, optional) – Nominal MV voltage in kV. Default 10.

  • -
  • assign_cable_types (bool, optional) – Whether to run Step 4 (cable type assignment). Default True.

  • -
  • assign_cable_lengths (bool, optional) – Whether to run Step 5 (cable length and impedance assignment). -Default True.

  • -
-
-
Returns:
-

Annotated graph with node attributes (h, P_mw, Q_mvar, -pf, node_type) and, when enabled, edge attributes -(cable_type, length_km, r_ohm, x_ohm, -max_i_ka, I_est_ka).

-
-
Return type:
-

nx.Graph

-
-
-
- -
- -
-
-class powergrid_synth.distribution.DistributionSynthParams(hop_dist=<factory>, pf_cdf=<factory>, degree_dist=<factory>, degree_clip=<factory>, intermediate_frac=<factory>, intermediate_hop=<factory>, injection_frac=<factory>, injection_hop=<factory>, injection_deviation=<factory>, load_deviation=<factory>, cable_library=<factory>, current_ratio=<factory>, current_threshold=<factory>, cable_length=<factory>, length_clip=<factory>)[source]
-

Bases: object

-

All parameters for the Schweitzer distribution feeder generator.

-

Default values are taken from Table III and the text of -Schweitzer et al. (2017).

-
-
Parameters:
-
-
-
-
-
-cable_length: ModifiedCauchyParams
-
- -
-
-cable_library: List[CableLibraryEntry]
-
- -
-
-current_ratio: ExponentialParams
-
- -
-
-current_threshold: CurrentThreshold
-
- -
-
-degree_clip: PowerLawClip
-
- -
-
-degree_dist: MixtureGammaParams
-
- -
-
-hop_dist: NegBinomParams
-
- -
-
-injection_deviation: NormalParams
-
- -
-
-injection_frac: BetaParams
-
- -
-
-injection_hop: MixtureNormalParams
-
- -
-
-intermediate_frac: BetaParams
-
- -
-
-intermediate_hop: MixturePoissonParams
-
- -
-
-length_clip: ExponentialClip
-
- -
-
-load_deviation: TLocationScaleParams
-
- -
-
-pf_cdf: List[tuple]
-
- -
- -
-
-class powergrid_synth.distribution.DistributionInputModel(bw_method=None, seed=None)[source]
-

Bases: object

-

3-D KDE input model for feeder size and loading.

-

The model is fitted on reference feeders and then sampled to produce -realistic (n_nodes, total_load, total_gen) triples.

-
-
Parameters:
-
    -
  • bw_method (str or float, optional) – Bandwidth method passed to scipy.stats.gaussian_kde.

  • -
  • seed (int or None, optional) – Random seed for reproducibility.

  • -
-
-
-
-
-fit(feeders)[source]
-

Fit the KDE from a collection of reference feeder graphs.

-

Each graph must have node attributes P_mw (positive for load, -negative for generation).

-
-
Parameters:
-

feeders (sequence of nx.Graph) – Reference feeder graphs.

-
-
Return type:
-

self

-
-
-
- -
-
-fit_from_arrays(n_nodes, total_load, total_gen)[source]
-

Fit directly from arrays (no graph objects needed).

-
-
Parameters:
-
    -
  • n_nodes (array-like of int)

  • -
  • total_load (array-like of float)

  • -
  • total_gen (array-like of float)

  • -
-
-
Return type:
-

self

-
-
-
- -
-
-pdf(n_nodes, total_load, total_gen)[source]
-

Evaluate the KDE density at a given point.

-
-
Parameters:
-
    -
  • n_nodes (float) – Coordinates in the 3-D input space.

  • -
  • total_load (float) – Coordinates in the 3-D input space.

  • -
  • total_gen (float) – Coordinates in the 3-D input space.

  • -
-
-
Returns:
-

Estimated probability density.

-
-
Return type:
-

float

-
-
-
- -
-
-sample(n_samples=1)[source]
-

Draw samples from the fitted input model.

-
-
Parameters:
-

n_samples (int) – Number of samples to draw.

-
-
Return type:
-

list of FeederInputSample

-
-
-
- -
- -
-
-

Analysis & Conversion

-
-
-powergrid_synth.distribution.fit_params_from_feeders(feeders)[source]
-

Fit all Schweitzer parameters from a collection of reference feeders.

-
-
Parameters:
-

feeders (sequence of nx.Graph) – Reference distribution feeder graphs, each annotated with -h, P_mw, node_type, length_km attributes.

-
-
Returns:
-

Fitted parameter set ready for SchweetzerFeederGenerator.

-
-
Return type:
-

DistributionSynthParams

-
-
-
- -

Conversion utilities for building Schweitzer-format feeder graphs -from pandapower and pypowsybl reference networks.

-
-
-powergrid_synth.distribution.distribution_converter.feeder_summary(feeders)[source]
-

Return a summary dict for each feeder graph.

-
-
Parameters:
-

feeders (sequence of nx.Graph) – Feeder graphs produced by pandapower_to_feeders().

-
-
Returns:
-

One dict per feeder with keys n_nodes, n_edges, -max_hop, is_tree, total_load_mw, total_gen_mw, -node_types.

-
-
Return type:
-

list[dict]

-
-
-
- -
-
-powergrid_synth.distribution.distribution_converter.pandapower_to_feeders(net)[source]
-

Convert a pandapower network to a list of Schweitzer-format feeder graphs.

-

Each connected component with at least three nodes is returned as a -separate graph annotated with the attributes expected by -fit_params_from_feeders() and -SchweetzerFeederGenerator:

-
    -
  • Node attributes: h (hop distance from root), P_mw -(positive = load, negative = generation), node_type -('load' | 'injection' | 'intermediate'), pf -(power factor).

  • -
  • Edge attributes: length_km (cable length in km).

  • -
-

The function handles lines, transformers, and closed bus–bus switches -so that the full connectivity of the pandapower network is captured.

-
-
Parameters:
-

net (pandapowerNet) – A pandapower network object.

-
-
Returns:
-

One feeder graph per connected component (≥ 3 nodes).

-
-
Return type:
-

list[nx.Graph]

-
-
-
- -
-
-powergrid_synth.distribution.distribution_converter.pypowsybl_to_feeders(network)[source]
-

Convert a pypowsybl Network to a list of Schweitzer-format feeder graphs.

-

This is the pypowsybl counterpart of pandapower_to_feeders(). -It extracts buses, lines, two-winding transformers, loads, and -generators from the pypowsybl Network and builds annotated feeder -graphs suitable for fit_params_from_feeders() -and SchweetzerFeederGenerator.

-
-
Parameters:
-

network (pypowsybl.network.Network) – A pypowsybl Network object (loaded from CGMES, XIIDM, MATPOWER, etc.).

-
-
Returns:
-

One feeder graph per connected component (≥ 3 nodes), with the -same node/edge attributes as pandapower_to_feeders().

-
-
Return type:
-

list[nx.Graph]

-
-
-
- -
-
-
-
-

Graph Classes

-
-
-class powergrid_synth.PowerGridGraph(*args, backend=None, **kwargs)[source]
-

Bases: Graph

-

Custom NetworkX Graph for Power Grids. -Extends nx.Graph to support subgraph extraction by voltage level.

-
-
-level(voltage_level)[source]
-

Returns a subgraph view containing only nodes at the specified voltage level.

-
-
Parameters:
-

voltage_level (int) – The voltage level index (e.g., 0, 1).

-
-
Returns:
-

A subgraph view of the grid.

-
-
Return type:
-

nx.Graph

-
-
-
- -
- -
-
-class powergrid_synth.TransmissionGrid(*args, backend=None, **kwargs)[source]
-

Bases: PowerGridGraph

-

Graph representation of a transmission-level power grid.

-

Inherits from PowerGridGraph and adds convenience methods -specific to meshed, multi-voltage-level transmission networks.

-
-
-property n_levels: int
-

Number of distinct voltage levels.

-
-
Return type:
-

int

-
-
-
- -
-
-property voltage_levels: list[int]
-

Sorted list of distinct voltage levels present in the grid.

-
-
Return type:
-

list[int]

-
-
-
- -
- -
-
-class powergrid_synth.DistributionGrid(*args, backend=None, **kwargs)[source]
-

Bases: PowerGridGraph

-

Graph representation of a radial distribution feeder.

-

Inherits from PowerGridGraph and adds convenience properties -for radial-tree distribution grids annotated with hop distances, -node types, and cable parameters (Schweitzer et al. 2017 format).

-
-
-classmethod from_nx(G)[source]
-

Create a DistributionGrid from any NetworkX graph.

-

All node, edge, and graph attributes are copied.

-
-
Parameters:
-

G (Graph)

-
-
Return type:
-

DistributionGrid

-
-
-
- -
-
-property is_radial: bool
-

True if the graph is a connected tree.

-
-
Return type:
-

bool

-
-
-
- -
-
-property max_hop: int
-

Maximum hop distance in the feeder.

-
-
Return type:
-

int

-
-
-
- -
-
-nodes_at_hop(h)[source]
-

Return list of nodes at the given hop distance.

-
-
Parameters:
-

h (int)

-
-
Return type:
-

list

-
-
-
- -
-
-nodes_by_type(node_type)[source]
-

Return list of nodes with the given node_type attribute.

-
-
Parameters:
-

node_type (str) – One of 'load', 'injection', or 'intermediate'.

-
-
Return type:
-

list

-
-
-
- -
-
-property root
-

Return the root node (hop distance 0).

-
- -
-
-property total_gen_mw: float
-

Total real-power generation (MW) across all injection nodes.

-
-
Return type:
-

float

-
-
-
- -
-
-property total_load_mw: float
-

Total real-power load (MW) across all load nodes.

-
-
Return type:
-

float

-
-
-
- -
- -
-
-
-

Analysis, Export & Visualisation

-
-
-class powergrid_synth.GraphComparator(synth_graph, ref_graph, synth_label='Synthetic', ref_label='Reference (Real)')[source]
-

Bases: object

-

Compares a synthetic power grid against a reference (real-world) graph. -Provides tabular metric comparisons and visual distribution overlaps, -both globally and per voltage level.

-
-
Parameters:
-
    -
  • synth_graph (Graph)

  • -
  • ref_graph (Graph)

  • -
  • synth_label (str)

  • -
  • ref_label (str)

  • -
-
-
-
-
-compare_degree_distributions(show_pvalue=False)[source]
-

Computes Kolmogorov-Smirnov (KS) and Relative Hausdorff (RH) statistics -between the degree distributions of the synthetic and reference graphs, -per voltage level. Prints and returns the results table.

-
-
Parameters:
-

show_pvalue (bool) – If True, include the KS p-value column. Default False.

-
-
Returns:
-

pd.DataFrame with columns Level, KS Statistic, RH Distance -(and KS p-value if show_pvalue is True).

-
-
Return type:
-

DataFrame

-
-
-
- -
-
-plot_all_levels_comparison(log_scale=True)[source]
-

Plots degree comparison for all common voltage levels in a single figure.

-
-
Parameters:
-

log_scale (bool)

-
-
-
- -
-
-plot_degree_comparison(synth_graph=None, ref_graph=None, ax=None, log_scale=True, fig_size=(8, 5), show_lines=False, title='Degree Distribution Comparison')[source]
-

Plots overlaid degree distributions.

-
-
Parameters:
-
    -
  • synth_graph (Graph | None) – Custom synthetic graph (or None for self.synth_graph).

  • -
  • ref_graph (Graph | None) – Custom reference graph (or None for self.ref_graph).

  • -
  • ax (Axes | None) – Matplotlib axis to plot on. If None, creates new figure.

  • -
  • log_scale (bool) – Whether to use log-log scale (default True).

  • -
  • title (str) – Title for the plot.

  • -
  • fig_size (Tuple)

  • -
  • show_lines (bool)

  • -
-
-
-
- -
-
-plot_level_topology_comparison(figsize=(15, 10))[source]
-

Plots side-by-side bar comparisons for topology metrics per voltage level: -Nodes, Edges, Diameter, Avg Path Length, Avg Clustering.

-
-
Parameters:
-

figsize (Tuple[int, int])

-
-
-
- -
-
-print_level_metrics()[source]
-

Iterates through voltage levels found in both graphs and prints metrics. -Does NOT plot.

-
- -
-
-print_metric_comparison(synth_graph=None, ref_graph=None, title='GRAPH COMPARISON REPORT')[source]
-

Prints a side-by-side table of topological metrics.

-
-
Parameters:
-
    -
  • synth_graph (Graph | None)

  • -
  • ref_graph (Graph | None)

  • -
  • title (str)

  • -
-
-
-
- -
-
-run_full_comparison(log_scale=True)[source]
-

Runs global comparison followed by per-level comparison.

-
-
Parameters:
-

log_scale (bool)

-
-
-
- -
- -
-
-class powergrid_synth.GridVisualizer[source]
-

Bases: object

-

Visualization module for synthetic power grids. -Allows plotting the grid with different layouts including Yifan Hu, Kamada-Kawai, and Voltage Layered.

-
-
-plot_bus_types(graph, layout='kamada_kawai', title='Bus Type Visualization', show_impedance=False, figsize=(12, 10))[source]
-

Visualizes the grid coloring nodes by their Bus Type (Static). Option to show impedance on edges.

-
-
Parameters:
-
    -
  • graph (Graph)

  • -
  • layout (str)

  • -
  • title (str)

  • -
  • show_impedance (bool)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_grid(graph, layout='kamada_kawai', title='Grid', show_labels=False, show_bus_types=False, show_impedance=False, figsize=(12, 10))[source]
-

Static plot function for grid topology. -Options allow overlaying bus types or impedance features.

-
-
Parameters:
-
    -
  • graph (Graph)

  • -
  • layout (str)

  • -
  • title (str)

  • -
  • show_labels (bool)

  • -
  • show_bus_types (bool)

  • -
  • show_impedance (bool)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_impedance(grid, layout='kamada_kawai', title='Transmission Line Impedance', figsize=(12, 10))[source]
-

Plots the grid with edges colored by their impedance magnitude (Z). -Blue = Low Impedance (Strong), Red = High Impedance (Weak).

-
-
Parameters:
-
    -
  • grid (Graph)

  • -
  • layout (str)

  • -
  • title (str)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_interactive(graph, title='Interactive Grid', figsize=(14, 10))[source]
-

Opens an interactive window for the full grid.

-
-
Parameters:
-
    -
  • graph (Graph)

  • -
  • title (str)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_interactive_bus_types(graph, title='Interactive Bus Type Visualization', figsize=(14, 10))[source]
-

Opens an interactive window for Bus Type Visualization with layout selection.

-
-
Parameters:
-
    -
  • graph (Graph)

  • -
  • title (str)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_interactive_voltage_level(graph, level, title=None, figsize=(12, 10))[source]
-

Opens an interactive window for a specific voltage level.

-
-
Parameters:
-
    -
  • graph (Graph)

  • -
  • level (int)

  • -
  • title (str | None)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_load_gen_bubbles(grid, layout='kamada_kawai', title='Generation vs Load', show_impedance=False, figsize=(12, 10))[source]
-

Bubble plot showing generation and load magnitudes. -Generators are blue squares, Loads are red circles. -Size is proportional to capacity/load. -Optionally plots impedance on edges.

-
-
Parameters:
-
    -
  • grid (Graph)

  • -
  • layout (str)

  • -
  • title (str)

  • -
  • show_impedance (bool)

  • -
  • figsize (Tuple[int, int])

  • -
-
-
-
- -
-
-plot_subgraphs(grid, layout='kamada_kawai', title='Subgraphs by Voltage Level', show_impedance=False, figsize=(15, 5))[source]
-

Plots subgraphs for each voltage level side-by-side (max 3 per row).

-
-
Parameters:
-
    -
  • grid (nx.Graph) – The main power grid graph.

  • -
  • layout (str) – Layout algorithm to use.

  • -
  • title (str) – Main title for the figure.

  • -
  • show_impedance (bool) – Whether to color edges by impedance.

  • -
  • figsize (Tuple[int, int]) – Base size for the figure (width, height for one row). -Height will scale with the number of rows.

  • -
-
-
-
- -
- -
-
-class powergrid_synth.GridExporter(graph, base_mva=100.0, base_kv_map=None)[source]
-

Bases: object

-

Exports the generated synthetic grid to standard file formats via -pandapower and pypowsybl built-in functions.

-
-
Parameters:
-
    -
  • graph (Graph) – The synthetic power grid as a NetworkX Graph.

  • -
  • base_mva (float) – System base apparent power in MVA.

  • -
  • base_kv_map (dict | None) – Dictionary mapping voltage level indices to kV values -(e.g., {0: 380.0, 1: 110.0, 2: 20.0}). If None, -a default mapping is used.

  • -
-
-
-

Example:

-
exporter = GridExporter(grid, base_mva=100.0,
-                        base_kv_map={0: 380.0, 1: 110.0})
-exporter.to_json("output/grid.json")
-exporter.to_excel("output/grid.xlsx")
-exporter.to_pypowsybl("output/grid", format="CGMES")
-
-
-
-
-to_cgmes(filepath, parameters=None)[source]
-

Export to CGMES (Common Grid Model Exchange Standard) via pypowsybl.

-
-
Parameters:
-
    -
  • filepath (str) – Destination directory path.

  • -
  • parameters (dict | None) – Optional CGMES-specific parameters.

  • -
-
-
Return type:
-

None

-
-
-
- -
-
-to_excel(filepath, include_results=True)[source]
-

Export the grid to a pandapower Excel file.

-
-
Parameters:
-
    -
  • filepath (str) – Destination file path (e.g. "output/grid.xlsx").

  • -
  • include_results (bool) – Whether to include power flow results if available.

  • -
-
-
Return type:
-

None

-
-
-
- -
-
-to_json(filepath)[source]
-

Export the grid to a pandapower JSON file.

-
-
Parameters:
-

filepath (str) – Destination file path (e.g. "output/grid.json").

-
-
Return type:
-

None

-
-
-
- -
-
-to_matpower(filepath)[source]
-

Export to MATPOWER format via pypowsybl.

-
-
Parameters:
-

filepath (str) – Destination path (e.g. "output/grid").

-
-
Return type:
-

None

-
-
-
- -
-
-to_pickle(filepath)[source]
-

Export the grid to a pandapower pickle file.

-
-
Parameters:
-

filepath (str) – Destination file path (e.g. "output/grid.p").

-
-
Return type:
-

None

-
-
-
- -
-
-to_psse(filepath)[source]
-

Export to PSS/E format via pypowsybl.

-
-
Parameters:
-

filepath (str) – Destination path.

-
-
Return type:
-

None

-
-
-
- -
-
-to_pypowsybl(filepath, format='XIIDM', parameters=None)[source]
-

Export the grid using pypowsybl’s built-in save.

-

Supported formats: CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL, -BIIDM, JIIDM.

-
-
Parameters:
-
    -
  • filepath (str) – Destination path (file or directory depending on format).

  • -
  • format (str) – One of the pypowsybl export format strings.

  • -
  • parameters (dict | None) – Optional format-specific parameters.

  • -
-
-
Return type:
-

None

-
-
-
- -
-
-to_sqlite(filepath, include_results=False)[source]
-

Export the grid to a pandapower SQLite database.

-
-
Parameters:
-
    -
  • filepath (str) – Destination file path (e.g. "output/grid.sqlite").

  • -
  • include_results (bool) – Whether to include power flow results.

  • -
-
-
Return type:
-

None

-
-
-
- -
- -
-
-
-

Format Converters

-
-
-powergrid_synth.pandapower_to_nx(net)[source]
-

Converts a pandapowerNet object into a NetworkX graph compatible with the synthesizer. -Extracts buses, lines, transformers, loads, and generators.

-
-
Parameters:
-

net (Any)

-
-
Return type:
-

Graph

-
-
-
- -
-
-powergrid_synth.nx_to_pandapower(graph, base_mva=100.0, base_kv_map=None)[source]
-

Converts a synthetic NetworkX graph into a pandapowerNet object. -Uses native Pandapower creation functions to ensure memory safety for the solver.

-
-
Parameters:
-
    -
  • graph (Graph) – The synthetic power grid (NetworkX Graph) containing electrical properties.

  • -
  • base_mva (float) – System base MVA for per-unit calculations.

  • -
  • base_kv_map (dict) – Dictionary mapping voltage level indices (0, 1, 2) to actual kV (e.g., {0: 380.0, 1: 110.0}).

  • -
-
-
Return type:
-

Any

-
-
-
- -
-
-powergrid_synth.pandapower_to_pypowsybl(net)[source]
-

Converts a pandapowerNet object into a Pypowsybl Network object.

-
-
Parameters:
-

net (Any)

-
-
Return type:
-

Any

-
-
-
- -
-
-powergrid_synth.pypowsybl_to_nx(network)[source]
-

Convert a pypowsybl Network into a NetworkX graph.

-

Extracts buses, lines, two-winding transformers, loads, and generators. -Each node gets voltage_level (int, 0 = highest kV), vn_kv, and -bus_type ('Gen' / 'Load' / 'Conn'). Lines carry -type='line' with impedance attributes; transformers carry -type='transformer' with capacity.

-

The function also stores base_kv_map in G.graph mapping level -indices to nominal voltages.

-
-
Parameters:
-

network (pypowsybl.network.Network) – A pypowsybl Network object (loaded from CGMES, XIIDM, MATPOWER, etc.).

-
-
Returns:
-

NetworkX graph compatible with the synthesizer pipeline.

-
-
Return type:
-

nx.Graph

-
-
-
- -
-
-powergrid_synth.load_grid(filepath, format=None)[source]
-

Load a power grid from a file in any pypowsybl-supported format.

-

Supported formats include CGMES, XIIDM, MATPOWER, IEEE-CDF, PSS/E, -UCTE, BIIDM, JIIDM, and POWER-FACTORY. The format is auto-detected -from the file extension when format is None.

-
-
Parameters:
-
    -
  • filepath (str) – Path to the grid data file.

  • -
  • format (str, optional) – Explicit format string (e.g. 'CGMES', 'MATPOWER'). If -None the format is inferred by pypowsybl from the file.

  • -
-
-
Returns:
-

NetworkX graph compatible with the synthesizer pipeline (same -structure as pypowsybl_to_nx()).

-
-
Return type:
-

nx.Graph

-
-
-
- -
-
- - -
-
-
- -
- -
-

© Copyright 2025-2026, PowerGridSynth Developers.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html deleted file mode 100644 index c7473c1..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - Search — PowerGridSynth 0.1.1 documentation - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • - -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
-
- -
- -
-

© Copyright 2025-2026, PowerGridSynth Developers.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js deleted file mode 100644 index 7fa0adb..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"alltitles":{"1 Distribution-specific method (Schweitzer)":[[52,"1-Distribution-specific-method-(Schweitzer)"]],"1. Generate a Single Feeder with Default Parameters (Table III)":[[53,"1.-Generate-a-Single-Feeder-with-Default-Parameters-(Table-III)"]],"1. Load Reference Distribution Grid (CIGRE LV)":[[54,"1.-Load-Reference-Distribution-Grid-(CIGRE-LV)"]],"1. Loading Reference Distribution Grids via pypowsybl":[[55,"1.-Loading-Reference-Distribution-Grids-via-pypowsybl"]],"1. Loading the IEEE-118 Reference Grid":[[61,"1.-Loading-the-IEEE-118-Reference-Grid"]],"1.1. CGMES Round-Trip":[[55,"1.1.-CGMES-Round-Trip"]],"1.1. Converting pypowsybl \u2192 NetworkX":[[61,"1.1.-Converting-pypowsybl-\u2192-NetworkX"]],"1.2. Loading from CGMES file":[[61,"1.2.-Loading-from-CGMES-file"]],"10. Custom Parameters":[[53,"10.-Custom-Parameters"]],"10. Side-by-Side Visualization":[[54,"10.-Side-by-Side-Visualization"]],"2 Transmission-specific method (CLC)":[[52,"2-Transmission-specific-method-(CLC)"]],"2-D empirical PMF":[[73,"d-empirical-pmf"]],"2. Convert Reference Grid to Schweitzer Format":[[54,"2.-Convert-Reference-Grid-to-Schweitzer-Format"]],"2. Converting to Schweitzer-Format Feeders":[[55,"2.-Converting-to-Schweitzer-Format-Feeders"]],"2. Transmission Synthesis (Mode I \u2014 Reference-Based)":[[61,"2.-Transmission-Synthesis-(Mode-I-\u2014-Reference-Based)"]],"2. Validate Tree Structure":[[53,"2.-Validate-Tree-Structure"]],"3 Side-by-side structural comparison":[[52,"3-Side-by-side-structural-comparison"]],"3. Analysis & Comparison":[[61,"3.-Analysis-&-Comparison"]],"3. Emergent Properties":[[53,"3.-Emergent-Properties"]],"3. Fit Schweitzer Parameters from Reference Feeders":[[54,"3.-Fit-Schweitzer-Parameters-from-Reference-Feeders"]],"3. Fitting Synthesis Parameters from Reference Feeders":[[55,"3.-Fitting-Synthesis-Parameters-from-Reference-Feeders"]],"4 Hop-distance analysis":[[52,"4-Hop-distance-analysis"]],"4. Export to Multiple Formats":[[61,"4.-Export-to-Multiple-Formats"]],"4. Generate Synthetic Feeders Using Fitted Parameters":[[54,"4.-Generate-Synthetic-Feeders-Using-Fitted-Parameters"]],"4. Generating Synthetic Feeders":[[55,"4.-Generating-Synthetic-Feeders"]],"4. Visualize Feeder Topology":[[53,"4.-Visualize-Feeder-Topology"]],"5 Ensemble comparison":[[52,"5-Ensemble-comparison"]],"5. Compare Reference vs. Synthetic Feeder Properties":[[54,"5.-Compare-Reference-vs.-Synthetic-Feeder-Properties"]],"5. Comparison & Validation":[[55,"5.-Comparison-&-Validation"]],"5. Power-Flow Validation":[[61,"5.-Power-Flow-Validation"]],"5. Statistical Distributions of the Generated Feeder":[[53,"5.-Statistical-Distributions-of-the-Generated-Feeder"]],"6. Generate an Ensemble and Compare":[[53,"6.-Generate-an-Ensemble-and-Compare"]],"6. Visualization":[[55,"6.-Visualization"]],"6. Visualize Reference and Synthetic Feeders":[[54,"6.-Visualize-Reference-and-Synthetic-Feeders"]],"7 Comparison against a real reference grid":[[52,"7-Comparison-against-a-real-reference-grid"]],"7. Ensemble Generation & Aggregate Comparison":[[55,"7.-Ensemble-Generation-&-Aggregate-Comparison"]],"7. KL-Divergence Comparison Between Two Feeders":[[53,"7.-KL-Divergence-Comparison-Between-Two-Feeders"]],"7. Statistical Distribution Comparison":[[54,"7.-Statistical-Distribution-Comparison"]],"7.1 Reference: CIGRE LV (44 nodes, radial)":[[52,"7.1-Reference:-CIGRE-LV-(44-nodes,-radial)"]],"7.2 Reference: Kerber Dorfnetz (116 nodes, radial)":[[52,"7.2-Reference:-Kerber-Dorfnetz-(116-nodes,-radial)"]],"8 Observations":[[52,"8-Observations"]],"8. 3D KDE Input Model":[[53,"8.-3D-KDE-Input-Model"]],"8. Generate an Ensemble and Aggregate Comparison":[[54,"8.-Generate-an-Ensemble-and-Aggregate-Comparison"]],"8. Power-Flow Validation":[[55,"8.-Power-Flow-Validation"]],"9. Fit Parameters from Synthetic Ensemble (Round-Trip)":[[53,"9.-Fit-Parameters-from-Synthetic-Ensemble-(Round-Trip)"]],"9. KL-Divergence: Ensemble vs. Reference":[[54,"9.-KL-Divergence:-Ensemble-vs.-Reference"]],"AIS Optimization Loop":[[69,"ais-optimization-loop"]],"API Reference":[[1,null],[68,null]],"Algorithm":[[11,"algorithm"],[70,"algorithm"]],"Algorithm for Generation Capacity Assignment":[[74,"algorithm-for-generation-capacity-assignment"]],"Algorithm for generation dispatch":[[73,"algorithm-for-generation-dispatch"]],"Algorithm for transmission capacity assignment":[[73,"algorithm-for-transmission-capacity-assignment"]],"Algorithm inputs and evaluation":[[72,"algorithm-inputs-and-evaluation"]],"Analysis":[[58,"Analysis"]],"Analysis & Comparisons":[[57,"Analysis-&-Comparisons"]],"Analysis & Conversion":[[68,"analysis-conversion"]],"Analysis, Export & Visualisation":[[0,"analysis-export-visualisation"],[68,"analysis-export-visualisation"]],"Analyze the generated topology":[[62,"Analyze-the-generated-topology"]],"Artificial Immune System (AIS) for Bus Type Allocation":[[69,null]],"Automated generation of synthetic MV distribution feeders":[[72,null]],"Basics":[[51,"Basics"],[56,"Basics"],[62,"Basics"]],"Bibliography":[[50,null]],"Branch impedance generation":[[73,"branch-impedance-generation"]],"Building Documentation":[[0,"building-documentation"]],"Bus Type Assignment":[[51,"Bus-Type-Assignment"]],"Bus Type Assignment based on Bus Type Entropy":[[70,null]],"Bus Type Assignment in a Synthetic Grid":[[51,null]],"Bus type assignment":[[57,"Bus-type-assignment"],[58,"Bus-type-assignment"]],"Bus type entropy":[[70,"bus-type-entropy"]],"CLC for Distribution Topology Generation":[[52,null]],"CLC topology generation":[[62,"CLC-topology-generation"]],"Chung-Lu-Chain grid topology generation":[[76,null]],"Clipping distributions":[[72,"clipping-distributions"]],"Combined CLCStars model (Algorithm 4)":[[76,"combined-clcstars-model-algorithm-4"]],"Compare other topology metrics per voltage level":[[57,"Compare-other-topology-metrics-per-voltage-level"]],"Compare some metric Globally":[[57,"Compare-some-metric-Globally"]],"Compare the histograms of node degrees for each voltage level":[[57,"Compare-the-histograms-of-node-degrees-for-each-voltage-level"]],"Compatible with PowSyBl":[[57,"Compatible-with-PowSyBl"],[58,"Compatible-with-PowSyBl"]],"Compatible with pandapower":[[57,"Compatible-with-pandapower"],[58,"Compatible-with-pandapower"]],"Convert to pandapower network":[[58,"Convert-to-pandapower-network"]],"Core Classes":[[68,"core-classes"]],"Correlation between capacity and dispatch":[[73,"correlation-between-capacity-and-dispatch"]],"Correlation between gauge ratio and flow":[[73,"correlation-between-gauge-ratio-and-flow"]],"DC power flow solver":[[73,"dc-power-flow-solver"]],"DCPF-based impedance swapping":[[73,"dcpf-based-impedance-swapping"]],"Define an input configurator":[[62,"Define-an-input-configurator"]],"Degree distribution comparison statistics":[[76,"degree-distribution-comparison-statistics"]],"Distribution":[[63,null]],"Distribution Feeder Synthesis from a Reference Grid":[[54,null]],"Distribution Feeder Synthesis from pypowsybl-Supported Formats":[[55,null]],"Distribution Feeder Synthesis \u2014 Schweitzer et al. (2017)":[[53,null]],"Distribution Grid Synthesis":[[0,"distribution-grid-synthesis"],[64,"distribution-grid-synthesis"],[67,"distribution-grid-synthesis"],[68,"distribution-grid-synthesis"],[71,null]],"Distribution of committed units":[[73,"distribution-of-committed-units"]],"Downstream power distribution":[[72,"downstream-power-distribution"]],"Electrical Assignment":[[68,"electrical-assignment"]],"Emergent validation distributions":[[72,"emergent-validation-distributions"]],"Example: medium loading with custom bus-type ratios":[[60,"Example:-medium-loading-with-custom-bus-type-ratios"]],"Examples":[[64,null],[65,null]],"Exponential distribution of gauge ratio":[[73,"exponential-distribution-of-gauge-ratio"]],"Export Formats":[[0,"export-formats"]],"Extract Topology Characteristics from Graph":[[57,"Extract-Topology-Characteristics-from-Graph"],[58,"Extract-Topology-Characteristics-from-Graph"]],"Feeder definition and analysis":[[72,"feeder-definition-and-analysis"]],"Final Output":[[69,"final-output"]],"Findings":[[70,"findings"]],"For a syntheric power grid topology, bus type assignment steps:":[[70,null]],"Format Converters":[[68,"format-converters"]],"From PyPI":[[0,"from-pypi"]],"From source (development mode)":[[0,"from-source-development-mode"]],"Generality and future directions":[[72,"generality-and-future-directions"]],"Generate a synthetic grid":[[57,"Generate-a-synthetic-grid"],[58,"Generate-a-synthetic-grid"]],"Generate the grid topology":[[62,"Generate-the-grid-topology"]],"Generation Capacities":[[56,"Generation-Capacities"]],"Generation Capacities and Load Settings":[[56,null]],"Generation Dispatch and Transmission Capacity Assignment":[[73,null]],"Generation capacities and load settings":[[57,"Generation-capacities-and-load-settings"],[58,"Generation-capacities-and-load-settings"]],"Getting Started":[[0,null]],"Graph Classes":[[68,"graph-classes"]],"Grid Topology Generation":[[62,null]],"High-Level Function":[[68,"high-level-function"],[68,"id1"]],"High-Level Synthesis with synthesize()":[[60,null]],"IEEE grids for testing":[[57,null]],"Impedance magnitude (LogNormal)":[[73,"impedance-magnitude-lognormal"]],"Initialization":[[69,"initialization"]],"Inputs for the degree distributions and transformer connection distributions":[[62,"Inputs-for-the-degree-distributions-and-transformer-connection-distributions"]],"Inspect the synthetic grid":[[60,"Inspect-the-synthetic-grid"]],"Installation":[[0,"installation"]],"Interactive grid visualizer from PowSyBl":[[57,"Interactive-grid-visualizer-from-PowSyBl"]],"Intermediate nodes":[[72,"intermediate-nodes"]],"Line angle via L\u00e9vy stable distribution":[[73,"line-angle-via-levy-stable-distribution"]],"Load Settings":[[56,"Load-Settings"]],"Load an IEEE grid using pandapower":[[57,"Load-an-IEEE-grid-using-pandapower"]],"Load the PEGASE 9241 grid using pandapower":[[58,"Load-the-PEGASE-9241-grid-using-pandapower"]],"Load the data from source file":[[59,"Load-the-data-from-source-file"]],"Maximum cable length clipping":[[72,"maximum-cable-length-clipping"]],"Maximum degree clipping":[[72,"maximum-degree-clipping"]],"Maximum nominal current clipping":[[72,"maximum-nominal-current-clipping"]],"Mode I \u2014 Reference-Based Synthesis":[[60,"Mode-I-\u2014-Reference-Based-Synthesis"]],"Mode II \u2014 Fully Synthetic":[[60,"Mode-II-\u2014-Fully-Synthetic"]],"Module Contents":[[2,"module-contents"],[3,"module-contents"],[4,"module-contents"],[5,"module-contents"],[6,"module-contents"],[7,"module-contents"],[8,"module-contents"],[9,"module-contents"],[10,"module-contents"],[12,"module-contents"],[13,"module-contents"],[14,"module-contents"],[15,"module-contents"],[16,"module-contents"],[17,"module-contents"],[18,"module-contents"],[19,"module-contents"],[20,"module-contents"],[22,"module-contents"],[23,"module-contents"],[24,"module-contents"],[25,"module-contents"],[26,"module-contents"],[27,"module-contents"],[28,"module-contents"],[29,"module-contents"],[30,"module-contents"],[32,"module-contents"],[33,"module-contents"],[34,"module-contents"],[35,"module-contents"],[36,"module-contents"],[37,"module-contents"],[38,"module-contents"],[39,"module-contents"],[40,"module-contents"],[41,"module-contents"],[42,"module-contents"],[44,"module-contents"],[45,"module-contents"],[46,"module-contents"],[47,"module-contents"],[48,"module-contents"],[49,"module-contents"]],"Modules":[[0,"modules"],[0,"id3"]],"Normalized capacity and dispatch factor":[[73,"normalized-capacity-and-dispatch-factor"]],"Notation":[[72,"notation"]],"Note: IEEE-118 differences between pypowsybl and pandapower":[[61,"Note:-IEEE-118-differences-between-pypowsybl-and-pandapower"]],"Notes":[[70,null]],"Observations":[[70,null]],"One-Line Synthesis":[[55,"One-Line-Synthesis"]],"Overview":[[72,"overview"]],"PEGASE 9241 large-scale test":[[58,null]],"Package Contents":[[11,"package-contents"],[21,"package-contents"],[31,"package-contents"],[43,"package-contents"]],"Per-unit voltage drop distribution":[[72,"per-unit-voltage-drop-distribution"]],"Phase 1: The Chung-Lu Chain (CLC) model":[[76,"phase-1-the-chung-lu-chain-clc-model"]],"Phase 2: Transformer edges via random star generation":[[76,"phase-2-transformer-edges-via-random-star-generation"]],"Plot the global node degree distribution for two grids":[[57,"Plot-the-global-node-degree-distribution-for-two-grids"]],"Positive load (consumption) nodes":[[72,"positive-load-consumption-nodes"]],"Power grid as network-of-networks":[[76,"power-grid-as-network-of-networks"]],"Power injection (generation) nodes":[[72,"power-injection-generation-nodes"]],"Power system modeling":[[74,"power-system-modeling"]],"Power-Flow Solvers":[[0,"power-flow-solvers"]],"Power-Flow Validation":[[60,"Power-Flow-Validation"]],"PowerGridGenerator":[[57,"PowerGridGenerator"],[58,"PowerGridGenerator"]],"PowerGridSynth":[[67,null]],"Preliminaries":[[76,"preliminaries"]],"Prescribed vs synthetic degree distribution":[[62,"Prescribed-vs-synthetic-degree-distribution"]],"Procedure: CableLength":[[72,null]],"Procedure: CableType":[[72,null]],"Procedure: ConnectNodes":[[72,null]],"Procedure: GenerateNodes":[[72,null]],"Procedure: Intermediate":[[72,null]],"Procedure: PositiveLoad":[[72,null]],"Procedure: PowerInjection":[[72,null]],"Pseudo-algorithm":[[76,"pseudo-algorithm"]],"Quick Start":[[0,"quick-start"],[0,"id1"],[67,"quick-start"],[67,"id1"]],"RTE 7000 test":[[59,null]],"Reactive Power Load Allocation":[[74,"reactive-power-load-allocation"]],"Reference grid comparison (\u00a77)":[[52,"Reference-grid-comparison-(\u00a77)"]],"Run AC using pypowsybl":[[59,"Run-AC-using-pypowsybl"]],"Run some power flows using pandapower or powsybl":[[59,"Run-some-power-flows-using-pandapower-or-powsybl"]],"Save the network area diagram using PowSyBl":[[57,"Save-the-network-area-diagram-using-PowSyBl"]],"Scaling property":[[73,"scaling-property"]],"Shared Infrastructure":[[0,"shared-infrastructure"]],"Software implementation":[[72,"software-implementation"]],"Some prior work":[[76,"some-prior-work"]],"Stage 1: Uncommitted units (\\alpha = 0)":[[73,"stage-1-uncommitted-units-alpha-0"]],"Stage 2: Committed units (0 < \\alpha < 1)":[[73,"stage-2-committed-units-0-alpha-1"]],"Stage 3: Fully committed units (\\alpha = 1)":[[73,"stage-3-fully-committed-units-alpha-1"]],"Stage 4: Balancing":[[73,"stage-4-balancing"]],"Statistical analysis":[[70,"statistical-analysis"]],"Statistical results":[[70,null]],"Statistics of Generation setting":[[74,"statistics-of-generation-setting"]],"Statistics of Load setting":[[74,"statistics-of-load-setting"]],"Statistics of generation dispatch":[[73,"statistics-of-generation-dispatch"]],"Step 1: Node generation":[[72,"step-1-node-generation"]],"Step 2: Feeder connection":[[72,"step-2-feeder-connection"]],"Step 3: Node properties (load and generation)":[[72,"step-3-node-properties-load-and-generation"]],"Step 4: Cable type assignment":[[72,"step-4-cable-type-assignment"]],"Step 5: Cable length assignment":[[72,"step-5-cable-length-assignment"]],"Step-by-Step Usage":[[0,"step-by-step-usage"],[67,"step-by-step-usage"]],"Submodules":[[11,"submodules"],[21,"submodules"],[31,"submodules"],[43,"submodules"]],"Summary":[[55,"Summary"],[61,"Summary"]],"Summary of statistical distributions":[[72,"summary-of-statistical-distributions"]],"Supported Data Formats & Power-Flow Solvers":[[67,"supported-data-formats-power-flow-solvers"]],"Supported Export Formats":[[60,"Supported-Export-Formats"]],"Supported data export formats":[[57,"Supported-data-export-formats"],[58,"Supported-data-export-formats"]],"Synthesis Pipeline":[[0,"synthesis-pipeline"],[0,"id2"],[67,"synthesis-pipeline"]],"Synthesization":[[59,"Synthesization"]],"Synthetic Generation and Load Settings":[[74,null]],"Synthetic generation of topology generation inputs":[[76,"synthetic-generation-of-topology-generation-inputs"]],"Synthetic raw topology generation":[[51,"Synthetic-raw-topology-generation"]],"Synthetic raw topology generation & Bus Type Assignment":[[56,"Synthetic-raw-topology-generation-&-Bus-Type-Assignment"]],"Synthetic-only comparison (\u00a71\u20136)":[[52,"Synthetic-only-comparison-(\u00a71\u20136)"]],"System model":[[73,"system-model"]],"Target Entropy Estimation (W^*)":[[69,"target-entropy-estimation-w"]],"Testing":[[0,"testing"]],"The scaling property":[[70,"the-scaling-property"]],"Theory":[[75,null]],"Three categories of generators":[[73,"three-categories-of-generators"]],"Todo":[[48,"id1"]],"Topology Generation":[[68,"topology-generation"]],"Topology refinement (optional)":[[73,"topology-refinement-optional"]],"Transmission":[[66,null]],"Transmission Grid Synthesis":[[0,"transmission-grid-synthesis"],[64,"transmission-grid-synthesis"],[67,"transmission-grid-synthesis"],[68,"transmission-grid-synthesis"],[77,null]],"Transmission Grid Synthesis from pypowsybl-Supported Formats":[[61,null]],"Transmission capacity statistics and assignment":[[73,"transmission-capacity-statistics-and-assignment"]],"Tuning Optional Parameters":[[60,"Tuning-Optional-Parameters"]],"Two operation modes":[[62,"Two-operation-modes"]],"Underlying pandapower built-in export (JSON example)":[[57,"Underlying-pandapower-built-in-export-(JSON-example)"]],"Underlying pypowsybl built-in export formats":[[57,"Underlying-pypowsybl-built-in-export-formats"]],"Using a custom pandapower network":[[60,"Using-a-custom-pandapower-network"]],"Validation metrics":[[76,"validation-metrics"]],"Verification methodology: KL-Divergence":[[72,"verification-methodology-kl-divergence"]],"Visualizations":[[57,"Visualizations"]],"Visualize the generated grid":[[62,"Visualize-the-generated-grid"]],"What is a Chung-Lu model?":[[76,"what-is-a-chung-lu-model"]],"What is a bus type assignment?":[[70,"what-is-a-bus-type-assignment"]],"Why do we want an entropy notion?":[[70,null]],"powergrid_synth":[[31,null]],"powergrid_synth.analysis":[[2,null]],"powergrid_synth.bus_type_allocator":[[3,null]],"powergrid_synth.capacity_allocator":[[4,null]],"powergrid_synth.comparison":[[5,null]],"powergrid_synth.core":[[11,null]],"powergrid_synth.core.analysis":[[6,null]],"powergrid_synth.core.comparison":[[7,null]],"powergrid_synth.core.exporter":[[8,null]],"powergrid_synth.core.grid_graph":[[9,null]],"powergrid_synth.core.hierarchical_analysis":[[10,null]],"powergrid_synth.core.input_extractor":[[12,null]],"powergrid_synth.core.visualization":[[13,null]],"powergrid_synth.deg_dist_optimizer":[[14,null]],"powergrid_synth.distribution":[[21,null]],"powergrid_synth.distribution.distribution_analysis":[[15,null]],"powergrid_synth.distribution.distribution_converter":[[16,null]],"powergrid_synth.distribution.distribution_input_model":[[17,null]],"powergrid_synth.distribution.distribution_params":[[18,null]],"powergrid_synth.distribution.distribution_synthesis":[[19,null]],"powergrid_synth.distribution.distribution_validation":[[20,null]],"powergrid_synth.distribution.synthesize":[[22,null]],"powergrid_synth.distribution_lines":[[23,null]],"powergrid_synth.distribution_topology":[[24,null]],"powergrid_synth.edge_creation":[[25,null]],"powergrid_synth.exporter":[[26,null]],"powergrid_synth.generation_dispatcher":[[27,null]],"powergrid_synth.generator":[[28,null]],"powergrid_synth.grid_graph":[[29,null]],"powergrid_synth.hierarchical_analysis":[[30,null]],"powergrid_synth.input_configurator":[[32,null]],"powergrid_synth.input_extractor":[[33,null]],"powergrid_synth.preprocessing":[[34,null]],"powergrid_synth.synthesize":[[35,null]],"powergrid_synth.transformer_edges":[[36,null]],"powergrid_synth.transmission":[[43,null]],"powergrid_synth.transmission.bus_type_allocator":[[37,null]],"powergrid_synth.transmission.capacity_allocator":[[38,null]],"powergrid_synth.transmission.deg_dist_optimizer":[[39,null]],"powergrid_synth.transmission.edge_creation":[[40,null]],"powergrid_synth.transmission.generation_dispatcher":[[41,null]],"powergrid_synth.transmission.generator":[[42,null]],"powergrid_synth.transmission.input_configurator":[[44,null]],"powergrid_synth.transmission.preprocessing":[[45,null]],"powergrid_synth.transmission.synthesize":[[46,null]],"powergrid_synth.transmission.transformer_edges":[[47,null]],"powergrid_synth.transmission.transmission":[[48,null]],"powergrid_synth.visualization":[[49,null]]},"docnames":["README","autoapi/index","autoapi/powergrid_synth/analysis/index","autoapi/powergrid_synth/bus_type_allocator/index","autoapi/powergrid_synth/capacity_allocator/index","autoapi/powergrid_synth/comparison/index","autoapi/powergrid_synth/core/analysis/index","autoapi/powergrid_synth/core/comparison/index","autoapi/powergrid_synth/core/exporter/index","autoapi/powergrid_synth/core/grid_graph/index","autoapi/powergrid_synth/core/hierarchical_analysis/index","autoapi/powergrid_synth/core/index","autoapi/powergrid_synth/core/input_extractor/index","autoapi/powergrid_synth/core/visualization/index","autoapi/powergrid_synth/deg_dist_optimizer/index","autoapi/powergrid_synth/distribution/distribution_analysis/index","autoapi/powergrid_synth/distribution/distribution_converter/index","autoapi/powergrid_synth/distribution/distribution_input_model/index","autoapi/powergrid_synth/distribution/distribution_params/index","autoapi/powergrid_synth/distribution/distribution_synthesis/index","autoapi/powergrid_synth/distribution/distribution_validation/index","autoapi/powergrid_synth/distribution/index","autoapi/powergrid_synth/distribution/synthesize/index","autoapi/powergrid_synth/distribution_lines/index","autoapi/powergrid_synth/distribution_topology/index","autoapi/powergrid_synth/edge_creation/index","autoapi/powergrid_synth/exporter/index","autoapi/powergrid_synth/generation_dispatcher/index","autoapi/powergrid_synth/generator/index","autoapi/powergrid_synth/grid_graph/index","autoapi/powergrid_synth/hierarchical_analysis/index","autoapi/powergrid_synth/index","autoapi/powergrid_synth/input_configurator/index","autoapi/powergrid_synth/input_extractor/index","autoapi/powergrid_synth/preprocessing/index","autoapi/powergrid_synth/synthesize/index","autoapi/powergrid_synth/transformer_edges/index","autoapi/powergrid_synth/transmission/bus_type_allocator/index","autoapi/powergrid_synth/transmission/capacity_allocator/index","autoapi/powergrid_synth/transmission/deg_dist_optimizer/index","autoapi/powergrid_synth/transmission/edge_creation/index","autoapi/powergrid_synth/transmission/generation_dispatcher/index","autoapi/powergrid_synth/transmission/generator/index","autoapi/powergrid_synth/transmission/index","autoapi/powergrid_synth/transmission/input_configurator/index","autoapi/powergrid_synth/transmission/preprocessing/index","autoapi/powergrid_synth/transmission/synthesize/index","autoapi/powergrid_synth/transmission/transformer_edges/index","autoapi/powergrid_synth/transmission/transmission/index","autoapi/powergrid_synth/visualization/index","bibliography","examples/BusTypeAssignment","examples/CLC4Distribution","examples/DistributionSynth","examples/DistributionSynthFromRef","examples/DistributionSynthPypowsybl","examples/GenLoadSettings","examples/IEEETest","examples/Pegase9241Test","examples/RTE7000Test","examples/Synthesize","examples/SynthesizePypowsybl","examples/TopologyGeneration","examples/distribution","examples/index","examples/intro","examples/transmission","index","reference/api_reference","theory/ais_bus_type_assignment","theory/bus_type_assignment","theory/distribution","theory/distribution_feeder_generation","theory/gen_dispatch_transmission","theory/generation_load_settings","theory/index","theory/topology_generation","theory/transmission"],"envversion":{"nbsphinx":4,"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,"sphinxcontrib.bibtex":9},"filenames":["README.md","autoapi/index.rst","autoapi/powergrid_synth/analysis/index.rst","autoapi/powergrid_synth/bus_type_allocator/index.rst","autoapi/powergrid_synth/capacity_allocator/index.rst","autoapi/powergrid_synth/comparison/index.rst","autoapi/powergrid_synth/core/analysis/index.rst","autoapi/powergrid_synth/core/comparison/index.rst","autoapi/powergrid_synth/core/exporter/index.rst","autoapi/powergrid_synth/core/grid_graph/index.rst","autoapi/powergrid_synth/core/hierarchical_analysis/index.rst","autoapi/powergrid_synth/core/index.rst","autoapi/powergrid_synth/core/input_extractor/index.rst","autoapi/powergrid_synth/core/visualization/index.rst","autoapi/powergrid_synth/deg_dist_optimizer/index.rst","autoapi/powergrid_synth/distribution/distribution_analysis/index.rst","autoapi/powergrid_synth/distribution/distribution_converter/index.rst","autoapi/powergrid_synth/distribution/distribution_input_model/index.rst","autoapi/powergrid_synth/distribution/distribution_params/index.rst","autoapi/powergrid_synth/distribution/distribution_synthesis/index.rst","autoapi/powergrid_synth/distribution/distribution_validation/index.rst","autoapi/powergrid_synth/distribution/index.rst","autoapi/powergrid_synth/distribution/synthesize/index.rst","autoapi/powergrid_synth/distribution_lines/index.rst","autoapi/powergrid_synth/distribution_topology/index.rst","autoapi/powergrid_synth/edge_creation/index.rst","autoapi/powergrid_synth/exporter/index.rst","autoapi/powergrid_synth/generation_dispatcher/index.rst","autoapi/powergrid_synth/generator/index.rst","autoapi/powergrid_synth/grid_graph/index.rst","autoapi/powergrid_synth/hierarchical_analysis/index.rst","autoapi/powergrid_synth/index.rst","autoapi/powergrid_synth/input_configurator/index.rst","autoapi/powergrid_synth/input_extractor/index.rst","autoapi/powergrid_synth/preprocessing/index.rst","autoapi/powergrid_synth/synthesize/index.rst","autoapi/powergrid_synth/transformer_edges/index.rst","autoapi/powergrid_synth/transmission/bus_type_allocator/index.rst","autoapi/powergrid_synth/transmission/capacity_allocator/index.rst","autoapi/powergrid_synth/transmission/deg_dist_optimizer/index.rst","autoapi/powergrid_synth/transmission/edge_creation/index.rst","autoapi/powergrid_synth/transmission/generation_dispatcher/index.rst","autoapi/powergrid_synth/transmission/generator/index.rst","autoapi/powergrid_synth/transmission/index.rst","autoapi/powergrid_synth/transmission/input_configurator/index.rst","autoapi/powergrid_synth/transmission/preprocessing/index.rst","autoapi/powergrid_synth/transmission/synthesize/index.rst","autoapi/powergrid_synth/transmission/transformer_edges/index.rst","autoapi/powergrid_synth/transmission/transmission/index.rst","autoapi/powergrid_synth/visualization/index.rst","bibliography.rst","examples/BusTypeAssignment.nblink","examples/CLC4Distribution.nblink","examples/DistributionSynth.nblink","examples/DistributionSynthFromRef.nblink","examples/DistributionSynthPypowsybl.nblink","examples/GenLoadSettings.nblink","examples/IEEETest.nblink","examples/Pegase9241Test.nblink","examples/RTE7000Test.nblink","examples/Synthesize.nblink","examples/SynthesizePypowsybl.nblink","examples/TopologyGeneration.nblink","examples/distribution.rst","examples/index.rst","examples/intro.rst","examples/transmission.rst","index.rst","reference/api_reference.md","theory/ais_bus_type_assignment.rst","theory/bus_type_assignment.rst","theory/distribution.rst","theory/distribution_feeder_generation.rst","theory/gen_dispatch_transmission.rst","theory/generation_load_settings.rst","theory/index.rst","theory/topology_generation.rst","theory/transmission.rst"],"indexentries":{"_assign_alphas() (powergrid_synth.generation_dispatcher.generationdispatcher method)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher._assign_alphas",false]],"_assign_alphas() (powergrid_synth.generationdispatcher method)":[[31,"powergrid_synth.GenerationDispatcher._assign_alphas",false]],"_assign_alphas() (powergrid_synth.transmission.generation_dispatcher.generationdispatcher method)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher._assign_alphas",false]],"_assign_alphas() (powergrid_synth.transmission.generationdispatcher method)":[[43,"powergrid_synth.transmission.GenerationDispatcher._assign_alphas",false]],"_assign_betas() (powergrid_synth.transmission.transmission.transmissionlineallocator method)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator._assign_betas",false]],"_assign_betas() (powergrid_synth.transmission.transmissionlineallocator method)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator._assign_betas",false]],"_assign_betas() (powergrid_synth.transmissionlineallocator method)":[[31,"powergrid_synth.TransmissionLineAllocator._assign_betas",false]],"_assign_cable_lengths() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_cable_lengths",false]],"_assign_cable_lengths() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_cable_lengths",false]],"_assign_cable_types() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_cable_types",false]],"_assign_cable_types() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_cable_types",false]],"_assign_injection() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_injection",false]],"_assign_injection() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_injection",false]],"_assign_intermediate() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_intermediate",false]],"_assign_intermediate() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_intermediate",false]],"_assign_load() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_load",false]],"_assign_load() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_load",false]],"_assign_node_properties() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._assign_node_properties",false]],"_assign_node_properties() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._assign_node_properties",false]],"_assignment_logic() (powergrid_synth.capacity_allocator.capacityallocator method)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator._assignment_logic",false]],"_assignment_logic() (powergrid_synth.capacityallocator method)":[[31,"powergrid_synth.CapacityAllocator._assignment_logic",false]],"_assignment_logic() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator._assignment_logic",false]],"_assignment_logic() (powergrid_synth.transmission.capacity_allocator.capacityallocator method)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator._assignment_logic",false]],"_assignment_logic() (powergrid_synth.transmission.capacityallocator method)":[[43,"powergrid_synth.transmission.CapacityAllocator._assignment_logic",false]],"_assignment_logic() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator._assignment_logic",false]],"_cable_lengths() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._cable_lengths",false]],"_calculate_bus_ratios() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._calculate_bus_ratios",false]],"_calculate_bus_ratios() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._calculate_bus_ratios",false]],"_calculate_bus_ratios() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._calculate_bus_ratios",false]],"_calculate_bus_ratios() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._calculate_bus_ratios",false]],"_calculate_entropy_score() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._calculate_entropy_score",false]],"_calculate_entropy_score() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._calculate_entropy_score",false]],"_calculate_entropy_score() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._calculate_entropy_score",false]],"_calculate_entropy_score() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._calculate_entropy_score",false]],"_calculate_link_ratios() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._calculate_link_ratios",false]],"_calculate_link_ratios() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._calculate_link_ratios",false]],"_calculate_link_ratios() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._calculate_link_ratios",false]],"_calculate_link_ratios() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._calculate_link_ratios",false]],"_calculate_total_load() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator._calculate_total_load",false]],"_calculate_total_load() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator._calculate_total_load",false]],"_compute_downstream_power() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._compute_downstream_power",false]],"_compute_downstream_power() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._compute_downstream_power",false]],"_connect_nodes() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._connect_nodes",false]],"_connect_nodes() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._connect_nodes",false]],"_create_interactive_window() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._create_interactive_window",false]],"_create_interactive_window() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._create_interactive_window",false]],"_create_interactive_window() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._create_interactive_window",false]],"_create_interactive_window() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._create_interactive_window",false]],"_degrees() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._degrees",false]],"_dgln_pdf() (powergrid_synth.deg_dist_optimizer.degreedistributionoptimizer method)":[[14,"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer._dgln_pdf",false]],"_dgln_pdf() (powergrid_synth.transmission.deg_dist_optimizer.degreedistributionoptimizer method)":[[39,"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer._dgln_pdf",false]],"_dpl_pdf() (powergrid_synth.deg_dist_optimizer.degreedistributionoptimizer method)":[[14,"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer._dpl_pdf",false]],"_dpl_pdf() (powergrid_synth.transmission.deg_dist_optimizer.degreedistributionoptimizer method)":[[39,"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer._dpl_pdf",false]],"_draw_bus_types_on_ax() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._draw_bus_types_on_ax",false]],"_draw_bus_types_on_ax() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._draw_bus_types_on_ax",false]],"_draw_bus_types_on_ax() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._draw_bus_types_on_ax",false]],"_draw_bus_types_on_ax() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._draw_bus_types_on_ax",false]],"_draw_edges_impedance() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._draw_edges_impedance",false]],"_draw_edges_impedance() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._draw_edges_impedance",false]],"_draw_edges_impedance() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._draw_edges_impedance",false]],"_draw_edges_impedance() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._draw_edges_impedance",false]],"_draw_graph_on_ax() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._draw_graph_on_ax",false]],"_draw_graph_on_ax() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._draw_graph_on_ax",false]],"_draw_graph_on_ax() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._draw_graph_on_ax",false]],"_draw_graph_on_ax() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._draw_graph_on_ax",false]],"_estimate_w_star() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._estimate_w_star",false]],"_estimate_w_star() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._estimate_w_star",false]],"_estimate_w_star() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._estimate_w_star",false]],"_estimate_w_star() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._estimate_w_star",false]],"_export_feeders() (in module powergrid_synth.distribution.synthesize)":[[22,"powergrid_synth.distribution.synthesize._export_feeders",false]],"_fill_hop_gaps() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._fill_hop_gaps",false]],"_fill_hop_gaps() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._fill_hop_gaps",false]],"_find_tree_root() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._find_tree_root",false]],"_find_tree_root() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._find_tree_root",false]],"_find_tree_root() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._find_tree_root",false]],"_find_tree_root() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._find_tree_root",false]],"_fit_kde() (powergrid_synth.distribution.distribution_input_model.distributioninputmodel method)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel._fit_kde",false]],"_fit_kde() (powergrid_synth.distribution.distributioninputmodel method)":[[21,"powergrid_synth.distribution.DistributionInputModel._fit_kde",false]],"_generate_alphas() (powergrid_synth.generation_dispatcher.generationdispatcher method)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher._generate_alphas",false]],"_generate_alphas() (powergrid_synth.generationdispatcher method)":[[31,"powergrid_synth.GenerationDispatcher._generate_alphas",false]],"_generate_alphas() (powergrid_synth.transmission.generation_dispatcher.generationdispatcher method)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher._generate_alphas",false]],"_generate_alphas() (powergrid_synth.transmission.generationdispatcher method)":[[43,"powergrid_synth.transmission.GenerationDispatcher._generate_alphas",false]],"_generate_beta() (powergrid_synth.transmission.transmission.transmissionlineallocator method)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator._generate_beta",false]],"_generate_beta() (powergrid_synth.transmission.transmissionlineallocator method)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator._generate_beta",false]],"_generate_beta() (powergrid_synth.transmissionlineallocator method)":[[31,"powergrid_synth.TransmissionLineAllocator._generate_beta",false]],"_generate_heuristic_tab_2d() (powergrid_synth.capacity_allocator.capacityallocator method)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator._generate_heuristic_tab_2d",false]],"_generate_heuristic_tab_2d() (powergrid_synth.capacityallocator method)":[[31,"powergrid_synth.CapacityAllocator._generate_heuristic_tab_2d",false]],"_generate_heuristic_tab_2d() (powergrid_synth.transmission.capacity_allocator.capacityallocator method)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator._generate_heuristic_tab_2d",false]],"_generate_heuristic_tab_2d() (powergrid_synth.transmission.capacityallocator method)":[[43,"powergrid_synth.transmission.CapacityAllocator._generate_heuristic_tab_2d",false]],"_generate_nodes() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._generate_nodes",false]],"_generate_nodes() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._generate_nodes",false]],"_generate_optimized_degrees() (powergrid_synth.input_configurator.inputconfigurator method)":[[32,"powergrid_synth.input_configurator.InputConfigurator._generate_optimized_degrees",false]],"_generate_optimized_degrees() (powergrid_synth.inputconfigurator method)":[[31,"powergrid_synth.InputConfigurator._generate_optimized_degrees",false]],"_generate_optimized_degrees() (powergrid_synth.transmission.input_configurator.inputconfigurator method)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator._generate_optimized_degrees",false]],"_generate_optimized_degrees() (powergrid_synth.transmission.inputconfigurator method)":[[43,"powergrid_synth.transmission.InputConfigurator._generate_optimized_degrees",false]],"_generate_phi() (powergrid_synth.transmission.transmission.transmissionlineallocator method)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator._generate_phi",false]],"_generate_phi() (powergrid_synth.transmission.transmissionlineallocator method)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator._generate_phi",false]],"_generate_phi() (powergrid_synth.transmissionlineallocator method)":[[31,"powergrid_synth.TransmissionLineAllocator._generate_phi",false]],"_generate_poisson_degrees() (powergrid_synth.input_configurator.inputconfigurator method)":[[32,"powergrid_synth.input_configurator.InputConfigurator._generate_poisson_degrees",false]],"_generate_poisson_degrees() (powergrid_synth.inputconfigurator method)":[[31,"powergrid_synth.InputConfigurator._generate_poisson_degrees",false]],"_generate_poisson_degrees() (powergrid_synth.transmission.input_configurator.inputconfigurator method)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator._generate_poisson_degrees",false]],"_generate_poisson_degrees() (powergrid_synth.transmission.inputconfigurator method)":[[43,"powergrid_synth.transmission.InputConfigurator._generate_poisson_degrees",false]],"_generate_random_assignment() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._generate_random_assignment",false]],"_generate_random_assignment() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._generate_random_assignment",false]],"_generate_random_assignment() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._generate_random_assignment",false]],"_generate_random_assignment() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._generate_random_assignment",false]],"_generate_random_tree() (in module powergrid_synth.distribution_topology)":[[24,"powergrid_synth.distribution_topology._generate_random_tree",false]],"_generate_subgraphs() (powergrid_synth.generator.powergridgenerator method)":[[28,"powergrid_synth.generator.PowerGridGenerator._generate_subgraphs",false]],"_generate_subgraphs() (powergrid_synth.powergridgenerator method)":[[31,"powergrid_synth.PowerGridGenerator._generate_subgraphs",false]],"_generate_subgraphs() (powergrid_synth.transmission.generator.powergridgenerator method)":[[42,"powergrid_synth.transmission.generator.PowerGridGenerator._generate_subgraphs",false]],"_generate_subgraphs() (powergrid_synth.transmission.powergridgenerator method)":[[43,"powergrid_synth.transmission.PowerGridGenerator._generate_subgraphs",false]],"_generate_transformer_connections() (powergrid_synth.generator.powergridgenerator method)":[[28,"powergrid_synth.generator.PowerGridGenerator._generate_transformer_connections",false]],"_generate_transformer_connections() (powergrid_synth.powergridgenerator method)":[[31,"powergrid_synth.PowerGridGenerator._generate_transformer_connections",false]],"_generate_transformer_connections() (powergrid_synth.transmission.generator.powergridgenerator method)":[[42,"powergrid_synth.transmission.generator.PowerGridGenerator._generate_transformer_connections",false]],"_generate_transformer_connections() (powergrid_synth.transmission.powergridgenerator method)":[[43,"powergrid_synth.transmission.PowerGridGenerator._generate_transformer_connections",false]],"_generate_transformer_simple() (powergrid_synth.input_configurator.inputconfigurator method)":[[32,"powergrid_synth.input_configurator.InputConfigurator._generate_transformer_simple",false]],"_generate_transformer_simple() (powergrid_synth.inputconfigurator method)":[[31,"powergrid_synth.InputConfigurator._generate_transformer_simple",false]],"_generate_transformer_simple() (powergrid_synth.transmission.input_configurator.inputconfigurator method)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator._generate_transformer_simple",false]],"_generate_transformer_simple() (powergrid_synth.transmission.inputconfigurator method)":[[43,"powergrid_synth.transmission.InputConfigurator._generate_transformer_simple",false]],"_generate_transformer_stars() (powergrid_synth.input_configurator.inputconfigurator method)":[[32,"powergrid_synth.input_configurator.InputConfigurator._generate_transformer_stars",false]],"_generate_transformer_stars() (powergrid_synth.inputconfigurator method)":[[31,"powergrid_synth.InputConfigurator._generate_transformer_stars",false]],"_generate_transformer_stars() (powergrid_synth.transmission.input_configurator.inputconfigurator method)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator._generate_transformer_stars",false]],"_generate_transformer_stars() (powergrid_synth.transmission.inputconfigurator method)":[[43,"powergrid_synth.transmission.InputConfigurator._generate_transformer_stars",false]],"_generate_tree_from_degree_sequence() (in module powergrid_synth.distribution_topology)":[[24,"powergrid_synth.distribution_topology._generate_tree_from_degree_sequence",false]],"_get_comparison_data() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator._get_comparison_data",false]],"_get_comparison_data() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator._get_comparison_data",false]],"_get_comparison_data() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator._get_comparison_data",false]],"_get_comparison_data() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator._get_comparison_data",false]],"_get_d_parameter() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._get_d_parameter",false]],"_get_d_parameter() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._get_d_parameter",false]],"_get_d_parameter() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._get_d_parameter",false]],"_get_d_parameter() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._get_d_parameter",false]],"_get_default_tab_2d() (powergrid_synth.capacity_allocator.capacityallocator method)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator._get_default_tab_2d",false]],"_get_default_tab_2d() (powergrid_synth.capacityallocator method)":[[31,"powergrid_synth.CapacityAllocator._get_default_tab_2d",false]],"_get_default_tab_2d() (powergrid_synth.transmission.capacity_allocator.capacityallocator method)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator._get_default_tab_2d",false]],"_get_default_tab_2d() (powergrid_synth.transmission.capacityallocator method)":[[43,"powergrid_synth.transmission.CapacityAllocator._get_default_tab_2d",false]],"_get_layered_layout() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._get_layered_layout",false]],"_get_layered_layout() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._get_layered_layout",false]],"_get_layered_layout() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._get_layered_layout",false]],"_get_layered_layout() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._get_layered_layout",false]],"_get_node_colors() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._get_node_colors",false]],"_get_node_colors() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._get_node_colors",false]],"_get_node_colors() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._get_node_colors",false]],"_get_node_colors() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._get_node_colors",false]],"_get_pandapower_dist_case() (in module powergrid_synth.distribution.synthesize)":[[22,"powergrid_synth.distribution.synthesize._get_pandapower_dist_case",false]],"_get_pandapower_net() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter._get_pandapower_net",false]],"_get_pandapower_net() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter._get_pandapower_net",false]],"_get_pypowsybl_builtins() (in module powergrid_synth.transmission.synthesize)":[[46,"powergrid_synth.transmission.synthesize._get_pypowsybl_builtins",false]],"_get_pypowsybl_net() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter._get_pypowsybl_net",false]],"_get_pypowsybl_net() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter._get_pypowsybl_net",false]],"_get_ratios() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._get_ratios",false]],"_get_ratios() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._get_ratios",false]],"_get_ratios() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._get_ratios",false]],"_get_ratios() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._get_ratios",false]],"_get_tab_2d_load() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator._get_tab_2d_load",false]],"_get_tab_2d_load() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator._get_tab_2d_load",false]],"_hierarchical_tree_layout() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._hierarchical_tree_layout",false]],"_hierarchical_tree_layout() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._hierarchical_tree_layout",false]],"_hierarchical_tree_layout() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._hierarchical_tree_layout",false]],"_hierarchical_tree_layout() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._hierarchical_tree_layout",false]],"_hop_distances() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._hop_distances",false]],"_initial_generation_distribution() (powergrid_synth.capacity_allocator.capacityallocator method)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator._initial_generation_distribution",false]],"_initial_generation_distribution() (powergrid_synth.capacityallocator method)":[[31,"powergrid_synth.CapacityAllocator._initial_generation_distribution",false]],"_initial_generation_distribution() (powergrid_synth.transmission.capacity_allocator.capacityallocator method)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator._initial_generation_distribution",false]],"_initial_generation_distribution() (powergrid_synth.transmission.capacityallocator method)":[[43,"powergrid_synth.transmission.CapacityAllocator._initial_generation_distribution",false]],"_initial_load_distribution() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator._initial_load_distribution",false]],"_initial_load_distribution() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator._initial_load_distribution",false]],"_injection_fractions() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._injection_fractions",false]],"_intermediate_fractions() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._intermediate_fractions",false]],"_is_pypowsybl_network() (in module powergrid_synth.distribution.synthesize)":[[22,"powergrid_synth.distribution.synthesize._is_pypowsybl_network",false]],"_is_pypowsybl_network() (in module powergrid_synth.transmission.synthesize)":[[46,"powergrid_synth.transmission.synthesize._is_pypowsybl_network",false]],"_load_deviations() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis._load_deviations",false]],"_load_reference() (in module powergrid_synth.transmission.synthesize)":[[46,"powergrid_synth.transmission.synthesize._load_reference",false]],"_load_reference_feeders() (in module powergrid_synth.distribution.synthesize)":[[22,"powergrid_synth.distribution.synthesize._load_reference_feeders",false]],"_normalize_ratio() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator._normalize_ratio",false]],"_normalize_ratio() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator._normalize_ratio",false]],"_normalize_ratio() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator._normalize_ratio",false]],"_normalize_ratio() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator._normalize_ratio",false]],"_objective_func() (powergrid_synth.deg_dist_optimizer.degreedistributionoptimizer method)":[[14,"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer._objective_func",false]],"_objective_func() (powergrid_synth.transmission.deg_dist_optimizer.degreedistributionoptimizer method)":[[39,"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer._objective_func",false]],"_pick_cable_by_capacity() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator._pick_cable_by_capacity",false]],"_pick_cable_by_capacity() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator._pick_cable_by_capacity",false]],"_radial_tree_layout() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._radial_tree_layout",false]],"_radial_tree_layout() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._radial_tree_layout",false]],"_radial_tree_layout() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._radial_tree_layout",false]],"_radial_tree_layout() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._radial_tree_layout",false]],"_refine_topology() (powergrid_synth.transmission.transmission.transmissionlineallocator method)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator._refine_topology",false]],"_refine_topology() (powergrid_synth.transmission.transmissionlineallocator method)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator._refine_topology",false]],"_refine_topology() (powergrid_synth.transmissionlineallocator method)":[[31,"powergrid_synth.TransmissionLineAllocator._refine_topology",false]],"_select_committed() (powergrid_synth.generation_dispatcher.generationdispatcher method)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher._select_committed",false]],"_select_committed() (powergrid_synth.generationdispatcher method)":[[31,"powergrid_synth.GenerationDispatcher._select_committed",false]],"_select_committed() (powergrid_synth.transmission.generation_dispatcher.generationdispatcher method)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher._select_committed",false]],"_select_committed() (powergrid_synth.transmission.generationdispatcher method)":[[43,"powergrid_synth.transmission.GenerationDispatcher._select_committed",false]],"_select_uncommitted() (powergrid_synth.generation_dispatcher.generationdispatcher method)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher._select_uncommitted",false]],"_select_uncommitted() (powergrid_synth.generationdispatcher method)":[[31,"powergrid_synth.GenerationDispatcher._select_uncommitted",false]],"_select_uncommitted() (powergrid_synth.transmission.generation_dispatcher.generationdispatcher method)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher._select_uncommitted",false]],"_select_uncommitted() (powergrid_synth.transmission.generationdispatcher method)":[[43,"powergrid_synth.transmission.GenerationDispatcher._select_uncommitted",false]],"_yifan_hu_layout() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer._yifan_hu_layout",false]],"_yifan_hu_layout() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer._yifan_hu_layout",false]],"_yifan_hu_layout() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer._yifan_hu_layout",false]],"_yifan_hu_layout() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer._yifan_hu_layout",false]],"allocate() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator.allocate",false]],"allocate() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator.allocate",false],[68,"powergrid_synth.BusTypeAllocator.allocate",false]],"allocate() (powergrid_synth.capacity_allocator.capacityallocator method)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator.allocate",false]],"allocate() (powergrid_synth.capacityallocator method)":[[31,"powergrid_synth.CapacityAllocator.allocate",false],[68,"powergrid_synth.CapacityAllocator.allocate",false]],"allocate() (powergrid_synth.distribution_lines.distributionlineallocator method)":[[23,"powergrid_synth.distribution_lines.DistributionLineAllocator.allocate",false]],"allocate() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator.allocate",false],[68,"powergrid_synth.LoadAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.capacity_allocator.capacityallocator method)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.capacityallocator method)":[[43,"powergrid_synth.transmission.CapacityAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.transmission.transmissionlineallocator method)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator.allocate",false]],"allocate() (powergrid_synth.transmission.transmissionlineallocator method)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator.allocate",false]],"allocate() (powergrid_synth.transmissionlineallocator method)":[[31,"powergrid_synth.TransmissionLineAllocator.allocate",false],[68,"powergrid_synth.TransmissionLineAllocator.allocate",false]],"allocate_reactive() (powergrid_synth.loadallocator method)":[[31,"powergrid_synth.LoadAllocator.allocate_reactive",false],[68,"powergrid_synth.LoadAllocator.allocate_reactive",false]],"allocate_reactive() (powergrid_synth.transmission.loadallocator method)":[[43,"powergrid_synth.transmission.LoadAllocator.allocate_reactive",false]],"alpha_mod (powergrid_synth.generation_dispatcher.generationdispatcher attribute)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher.alpha_mod",false]],"alpha_mod (powergrid_synth.generationdispatcher attribute)":[[31,"powergrid_synth.GenerationDispatcher.alpha_mod",false],[68,"powergrid_synth.GenerationDispatcher.alpha_mod",false]],"alpha_mod (powergrid_synth.transmission.generation_dispatcher.generationdispatcher attribute)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher.alpha_mod",false]],"alpha_mod (powergrid_synth.transmission.generationdispatcher attribute)":[[43,"powergrid_synth.transmission.GenerationDispatcher.alpha_mod",false]],"analyze() (powergrid_synth.analysis.gridanalyzer method)":[[2,"powergrid_synth.analysis.GridAnalyzer.analyze",false]],"analyze() (powergrid_synth.core.analysis.gridanalyzer method)":[[6,"powergrid_synth.core.analysis.GridAnalyzer.analyze",false]],"analyze() (powergrid_synth.core.gridanalyzer method)":[[11,"powergrid_synth.core.GridAnalyzer.analyze",false]],"assign_boxes() (powergrid_synth.preprocessing.preprocessor method)":[[34,"powergrid_synth.preprocessing.Preprocessor.assign_boxes",false]],"assign_boxes() (powergrid_synth.transmission.preprocessing.preprocessor method)":[[45,"powergrid_synth.transmission.preprocessing.Preprocessor.assign_boxes",false]],"betaparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.BetaParams",false]],"betaparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.BetaParams",false]],"bustypeallocator (class in powergrid_synth)":[[31,"powergrid_synth.BusTypeAllocator",false],[68,"powergrid_synth.BusTypeAllocator",false]],"bustypeallocator (class in powergrid_synth.bus_type_allocator)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator",false]],"bustypeallocator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.BusTypeAllocator",false]],"bustypeallocator (class in powergrid_synth.transmission.bus_type_allocator)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator",false]],"cable_length (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.cable_length",false]],"cable_library (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.cable_library",false]],"cablelibraryentry (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.CableLibraryEntry",false]],"cablelibraryentry (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.CableLibraryEntry",false]],"capacityallocator (class in powergrid_synth)":[[31,"powergrid_synth.CapacityAllocator",false],[68,"powergrid_synth.CapacityAllocator",false]],"capacityallocator (class in powergrid_synth.capacity_allocator)":[[4,"powergrid_synth.capacity_allocator.CapacityAllocator",false]],"capacityallocator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.CapacityAllocator",false]],"capacityallocator (class in powergrid_synth.transmission.capacity_allocator)":[[38,"powergrid_synth.transmission.capacity_allocator.CapacityAllocator",false]],"compare_degree_distributions() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.compare_degree_distributions",false]],"compare_degree_distributions() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.compare_degree_distributions",false]],"compare_degree_distributions() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.compare_degree_distributions",false]],"compare_degree_distributions() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.compare_degree_distributions",false],[68,"powergrid_synth.GraphComparator.compare_degree_distributions",false]],"compare_feeders() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.compare_feeders",false]],"compare_feeders() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.compare_feeders",false]],"compute_emergent_properties() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.compute_emergent_properties",false]],"compute_emergent_properties() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.compute_emergent_properties",false]],"create_params() (powergrid_synth.input_configurator.inputconfigurator method)":[[32,"powergrid_synth.input_configurator.InputConfigurator.create_params",false]],"create_params() (powergrid_synth.inputconfigurator method)":[[31,"powergrid_synth.InputConfigurator.create_params",false],[68,"powergrid_synth.InputConfigurator.create_params",false]],"create_params() (powergrid_synth.transmission.input_configurator.inputconfigurator method)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator.create_params",false]],"create_params() (powergrid_synth.transmission.inputconfigurator method)":[[43,"powergrid_synth.transmission.InputConfigurator.create_params",false]],"current_ratio (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.current_ratio",false]],"current_threshold (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.current_threshold",false]],"currentthreshold (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.CurrentThreshold",false]],"currentthreshold (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.CurrentThreshold",false]],"dcpowerflow (class in powergrid_synth.core)":[[11,"powergrid_synth.core.DCPowerFlow",false]],"degree_clip (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.degree_clip",false]],"degree_dist (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.degree_dist",false]],"degreedistributionoptimizer (class in powergrid_synth.deg_dist_optimizer)":[[14,"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer",false]],"degreedistributionoptimizer (class in powergrid_synth.transmission.deg_dist_optimizer)":[[39,"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer",false]],"dispatch() (powergrid_synth.generation_dispatcher.generationdispatcher method)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher.dispatch",false]],"dispatch() (powergrid_synth.generationdispatcher method)":[[31,"powergrid_synth.GenerationDispatcher.dispatch",false],[68,"powergrid_synth.GenerationDispatcher.dispatch",false]],"dispatch() (powergrid_synth.transmission.generation_dispatcher.generationdispatcher method)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher.dispatch",false]],"dispatch() (powergrid_synth.transmission.generationdispatcher method)":[[43,"powergrid_synth.transmission.GenerationDispatcher.dispatch",false]],"distributiongrid (class in powergrid_synth)":[[31,"powergrid_synth.DistributionGrid",false],[68,"powergrid_synth.DistributionGrid",false]],"distributiongrid (class in powergrid_synth.core)":[[11,"powergrid_synth.core.DistributionGrid",false]],"distributiongrid (class in powergrid_synth.core.grid_graph)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid",false]],"distributiongridgenerator (class in powergrid_synth.distribution_topology)":[[24,"powergrid_synth.distribution_topology.DistributionGridGenerator",false]],"distributioninputmodel (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.DistributionInputModel",false],[68,"powergrid_synth.distribution.DistributionInputModel",false]],"distributioninputmodel (class in powergrid_synth.distribution.distribution_input_model)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel",false]],"distributionlineallocator (class in powergrid_synth.distribution_lines)":[[23,"powergrid_synth.distribution_lines.DistributionLineAllocator",false]],"distributionsynthparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.DistributionSynthParams",false],[68,"powergrid_synth.distribution.DistributionSynthParams",false]],"distributionsynthparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.DistributionSynthParams",false]],"edgecreator (class in powergrid_synth.edge_creation)":[[25,"powergrid_synth.edge_creation.EdgeCreator",false]],"edgecreator (class in powergrid_synth.transmission.edge_creation)":[[40,"powergrid_synth.transmission.edge_creation.EdgeCreator",false]],"exponentialclip (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.ExponentialClip",false]],"exponentialclip (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.ExponentialClip",false]],"exponentialparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.ExponentialParams",false]],"exponentialparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.ExponentialParams",false]],"extract_cable_length_distribution() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.extract_cable_length_distribution",false]],"extract_degree_distribution() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.extract_degree_distribution",false]],"extract_distribution_params() (in module powergrid_synth.distribution_topology)":[[24,"powergrid_synth.distribution_topology.extract_distribution_params",false]],"extract_hop_distribution() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.extract_hop_distribution",false]],"extract_load_per_node() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.extract_load_per_node",false]],"extract_topology_params_from_graph() (in module powergrid_synth)":[[31,"powergrid_synth.extract_topology_params_from_graph",false]],"extract_topology_params_from_graph() (in module powergrid_synth.core)":[[11,"powergrid_synth.core.extract_topology_params_from_graph",false]],"extract_topology_params_from_graph() (in module powergrid_synth.core.input_extractor)":[[12,"powergrid_synth.core.input_extractor.extract_topology_params_from_graph",false]],"extract_topology_params_from_graph() (in module powergrid_synth.input_extractor)":[[33,"powergrid_synth.input_extractor.extract_topology_params_from_graph",false]],"feeder_summary() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.feeder_summary",false]],"feeder_summary() (in module powergrid_synth.distribution.distribution_converter)":[[16,"powergrid_synth.distribution.distribution_converter.feeder_summary",false],[68,"powergrid_synth.distribution.distribution_converter.feeder_summary",false]],"feederinputsample (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.FeederInputSample",false]],"feederinputsample (class in powergrid_synth.distribution.distribution_input_model)":[[17,"powergrid_synth.distribution.distribution_input_model.FeederInputSample",false]],"fit() (powergrid_synth.distribution.distribution_input_model.distributioninputmodel method)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel.fit",false]],"fit() (powergrid_synth.distribution.distributioninputmodel method)":[[21,"powergrid_synth.distribution.DistributionInputModel.fit",false],[68,"powergrid_synth.distribution.DistributionInputModel.fit",false]],"fit_beta() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_beta",false]],"fit_exponential_clip() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_exponential_clip",false]],"fit_from_arrays() (powergrid_synth.distribution.distribution_input_model.distributioninputmodel method)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel.fit_from_arrays",false]],"fit_from_arrays() (powergrid_synth.distribution.distributioninputmodel method)":[[21,"powergrid_synth.distribution.DistributionInputModel.fit_from_arrays",false],[68,"powergrid_synth.distribution.DistributionInputModel.fit_from_arrays",false]],"fit_mixture_gamma() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_mixture_gamma",false]],"fit_modified_cauchy() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_modified_cauchy",false]],"fit_neg_binomial() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_neg_binomial",false]],"fit_params_from_feeders() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.fit_params_from_feeders",false],[68,"powergrid_synth.distribution.fit_params_from_feeders",false]],"fit_params_from_feeders() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_params_from_feeders",false]],"fit_power_law_clip() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_power_law_clip",false]],"fit_t_location_scale() (in module powergrid_synth.distribution.distribution_analysis)":[[15,"powergrid_synth.distribution.distribution_analysis.fit_t_location_scale",false]],"from_nx() (powergrid_synth.core.distributiongrid class method)":[[11,"powergrid_synth.core.DistributionGrid.from_nx",false]],"from_nx() (powergrid_synth.core.grid_graph.distributiongrid class method)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.from_nx",false]],"from_nx() (powergrid_synth.distributiongrid class method)":[[31,"powergrid_synth.DistributionGrid.from_nx",false],[68,"powergrid_synth.DistributionGrid.from_nx",false]],"generate_edges() (powergrid_synth.edge_creation.edgecreator method)":[[25,"powergrid_synth.edge_creation.EdgeCreator.generate_edges",false]],"generate_edges() (powergrid_synth.transmission.edge_creation.edgecreator method)":[[40,"powergrid_synth.transmission.edge_creation.EdgeCreator.generate_edges",false]],"generate_feeder() (powergrid_synth.distribution.distribution_synthesis.schweetzerfeedergenerator method)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator.generate_feeder",false]],"generate_feeder() (powergrid_synth.distribution.schweetzerfeedergenerator method)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator.generate_feeder",false],[68,"powergrid_synth.distribution.SchweetzerFeederGenerator.generate_feeder",false]],"generate_from_params() (powergrid_synth.distribution_topology.distributiongridgenerator method)":[[24,"powergrid_synth.distribution_topology.DistributionGridGenerator.generate_from_params",false]],"generate_from_specs() (powergrid_synth.distribution_topology.distributiongridgenerator method)":[[24,"powergrid_synth.distribution_topology.DistributionGridGenerator.generate_from_specs",false]],"generate_grid() (powergrid_synth.generator.powergridgenerator method)":[[28,"powergrid_synth.generator.PowerGridGenerator.generate_grid",false]],"generate_grid() (powergrid_synth.powergridgenerator method)":[[31,"powergrid_synth.PowerGridGenerator.generate_grid",false],[68,"powergrid_synth.PowerGridGenerator.generate_grid",false]],"generate_grid() (powergrid_synth.transmission.generator.powergridgenerator method)":[[42,"powergrid_synth.transmission.generator.PowerGridGenerator.generate_grid",false]],"generate_grid() (powergrid_synth.transmission.powergridgenerator method)":[[43,"powergrid_synth.transmission.PowerGridGenerator.generate_grid",false]],"generate_transformer_edges() (powergrid_synth.transformer_edges.transformerconnector method)":[[36,"powergrid_synth.transformer_edges.TransformerConnector.generate_transformer_edges",false]],"generate_transformer_edges() (powergrid_synth.transmission.transformer_edges.transformerconnector method)":[[47,"powergrid_synth.transmission.transformer_edges.TransformerConnector.generate_transformer_edges",false]],"generationdispatcher (class in powergrid_synth)":[[31,"powergrid_synth.GenerationDispatcher",false],[68,"powergrid_synth.GenerationDispatcher",false]],"generationdispatcher (class in powergrid_synth.generation_dispatcher)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher",false]],"generationdispatcher (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.GenerationDispatcher",false]],"generationdispatcher (class in powergrid_synth.transmission.generation_dispatcher)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher",false]],"get_basic_stats() (powergrid_synth.analysis.gridanalyzer method)":[[2,"powergrid_synth.analysis.GridAnalyzer.get_basic_stats",false]],"get_basic_stats() (powergrid_synth.core.analysis.gridanalyzer method)":[[6,"powergrid_synth.core.analysis.GridAnalyzer.get_basic_stats",false]],"get_basic_stats() (powergrid_synth.core.gridanalyzer method)":[[11,"powergrid_synth.core.GridAnalyzer.get_basic_stats",false]],"get_clustering_metrics() (powergrid_synth.analysis.gridanalyzer method)":[[2,"powergrid_synth.analysis.GridAnalyzer.get_clustering_metrics",false]],"get_clustering_metrics() (powergrid_synth.core.analysis.gridanalyzer method)":[[6,"powergrid_synth.core.analysis.GridAnalyzer.get_clustering_metrics",false]],"get_clustering_metrics() (powergrid_synth.core.gridanalyzer method)":[[11,"powergrid_synth.core.GridAnalyzer.get_clustering_metrics",false]],"get_path_metrics() (powergrid_synth.analysis.gridanalyzer method)":[[2,"powergrid_synth.analysis.GridAnalyzer.get_path_metrics",false]],"get_path_metrics() (powergrid_synth.core.analysis.gridanalyzer method)":[[6,"powergrid_synth.core.analysis.GridAnalyzer.get_path_metrics",false]],"get_path_metrics() (powergrid_synth.core.gridanalyzer method)":[[11,"powergrid_synth.core.GridAnalyzer.get_path_metrics",false]],"get_reference_stats() (in module powergrid_synth)":[[31,"powergrid_synth.get_reference_stats",false]],"get_reference_stats() (in module powergrid_synth.core)":[[11,"powergrid_synth.core.get_reference_stats",false]],"graphcomparator (class in powergrid_synth)":[[31,"powergrid_synth.GraphComparator",false],[68,"powergrid_synth.GraphComparator",false]],"graphcomparator (class in powergrid_synth.comparison)":[[5,"powergrid_synth.comparison.GraphComparator",false]],"graphcomparator (class in powergrid_synth.core)":[[11,"powergrid_synth.core.GraphComparator",false]],"graphcomparator (class in powergrid_synth.core.comparison)":[[7,"powergrid_synth.core.comparison.GraphComparator",false]],"gridanalyzer (class in powergrid_synth.analysis)":[[2,"powergrid_synth.analysis.GridAnalyzer",false]],"gridanalyzer (class in powergrid_synth.core)":[[11,"powergrid_synth.core.GridAnalyzer",false]],"gridanalyzer (class in powergrid_synth.core.analysis)":[[6,"powergrid_synth.core.analysis.GridAnalyzer",false]],"gridexporter (class in powergrid_synth)":[[68,"powergrid_synth.GridExporter",false]],"gridexporter (class in powergrid_synth.core.exporter)":[[8,"powergrid_synth.core.exporter.GridExporter",false]],"gridexporter (class in powergrid_synth.exporter)":[[26,"powergrid_synth.exporter.GridExporter",false]],"gridvisualizer (class in powergrid_synth)":[[31,"powergrid_synth.GridVisualizer",false],[68,"powergrid_synth.GridVisualizer",false]],"gridvisualizer (class in powergrid_synth.core)":[[11,"powergrid_synth.core.GridVisualizer",false]],"gridvisualizer (class in powergrid_synth.core.visualization)":[[13,"powergrid_synth.core.visualization.GridVisualizer",false]],"gridvisualizer (class in powergrid_synth.visualization)":[[49,"powergrid_synth.visualization.GridVisualizer",false]],"hierarchicalanalyzer (class in powergrid_synth)":[[31,"powergrid_synth.HierarchicalAnalyzer",false]],"hierarchicalanalyzer (class in powergrid_synth.core)":[[11,"powergrid_synth.core.HierarchicalAnalyzer",false]],"hierarchicalanalyzer (class in powergrid_synth.core.hierarchical_analysis)":[[10,"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer",false]],"hierarchicalanalyzer (class in powergrid_synth.hierarchical_analysis)":[[30,"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer",false]],"hop_dist (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.hop_dist",false]],"injection_deviation (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.injection_deviation",false]],"injection_frac (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.injection_frac",false]],"injection_hop (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.injection_hop",false]],"inputconfigurator (class in powergrid_synth)":[[31,"powergrid_synth.InputConfigurator",false],[68,"powergrid_synth.InputConfigurator",false]],"inputconfigurator (class in powergrid_synth.input_configurator)":[[32,"powergrid_synth.input_configurator.InputConfigurator",false]],"inputconfigurator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.InputConfigurator",false]],"inputconfigurator (class in powergrid_synth.transmission.input_configurator)":[[44,"powergrid_synth.transmission.input_configurator.InputConfigurator",false]],"intermediate_frac (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.intermediate_frac",false]],"intermediate_hop (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.intermediate_hop",false]],"is_radial (powergrid_synth.core.distributiongrid property)":[[11,"powergrid_synth.core.DistributionGrid.is_radial",false]],"is_radial (powergrid_synth.core.grid_graph.distributiongrid property)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.is_radial",false]],"is_radial (powergrid_synth.distributiongrid property)":[[31,"powergrid_synth.DistributionGrid.is_radial",false],[68,"powergrid_synth.DistributionGrid.is_radial",false]],"kl_divergence_discrete() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.kl_divergence_discrete",false]],"kl_divergence_discrete() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.kl_divergence_discrete",false]],"length_clip (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.length_clip",false]],"level() (powergrid_synth.core.grid_graph.powergridgraph method)":[[9,"powergrid_synth.core.grid_graph.PowerGridGraph.level",false]],"level() (powergrid_synth.core.powergridgraph method)":[[11,"powergrid_synth.core.PowerGridGraph.level",false]],"level() (powergrid_synth.grid_graph.powergridgraph method)":[[29,"powergrid_synth.grid_graph.PowerGridGraph.level",false]],"level() (powergrid_synth.powergridgraph method)":[[31,"powergrid_synth.PowerGridGraph.level",false],[68,"powergrid_synth.PowerGridGraph.level",false]],"load_deviation (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.load_deviation",false]],"load_grid() (in module powergrid_synth)":[[68,"powergrid_synth.load_grid",false]],"loadallocator (class in powergrid_synth)":[[31,"powergrid_synth.LoadAllocator",false],[68,"powergrid_synth.LoadAllocator",false]],"loadallocator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.LoadAllocator",false]],"matplotlibdropdown (class in powergrid_synth.core.visualization)":[[13,"powergrid_synth.core.visualization.MatplotlibDropdown",false]],"matplotlibdropdown (class in powergrid_synth.visualization)":[[49,"powergrid_synth.visualization.MatplotlibDropdown",false]],"max_hop (powergrid_synth.core.distributiongrid property)":[[11,"powergrid_synth.core.DistributionGrid.max_hop",false]],"max_hop (powergrid_synth.core.grid_graph.distributiongrid property)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.max_hop",false]],"max_hop (powergrid_synth.distributiongrid property)":[[31,"powergrid_synth.DistributionGrid.max_hop",false],[68,"powergrid_synth.DistributionGrid.max_hop",false]],"mixturegammaparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.MixtureGammaParams",false]],"mixturegammaparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.MixtureGammaParams",false]],"mixturenormalparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.MixtureNormalParams",false]],"mixturenormalparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.MixtureNormalParams",false]],"mixturepoissonparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.MixturePoissonParams",false]],"mixturepoissonparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.MixturePoissonParams",false]],"modifiedcauchyparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.ModifiedCauchyParams",false]],"modifiedcauchyparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.ModifiedCauchyParams",false]],"module":[[2,"module-powergrid_synth.analysis",false],[3,"module-powergrid_synth.bus_type_allocator",false],[4,"module-powergrid_synth.capacity_allocator",false],[5,"module-powergrid_synth.comparison",false],[6,"module-powergrid_synth.core.analysis",false],[7,"module-powergrid_synth.core.comparison",false],[8,"module-powergrid_synth.core.exporter",false],[9,"module-powergrid_synth.core.grid_graph",false],[10,"module-powergrid_synth.core.hierarchical_analysis",false],[11,"module-powergrid_synth.core",false],[12,"module-powergrid_synth.core.input_extractor",false],[13,"module-powergrid_synth.core.visualization",false],[14,"module-powergrid_synth.deg_dist_optimizer",false],[15,"module-powergrid_synth.distribution.distribution_analysis",false],[16,"module-powergrid_synth.distribution.distribution_converter",false],[17,"module-powergrid_synth.distribution.distribution_input_model",false],[18,"module-powergrid_synth.distribution.distribution_params",false],[19,"module-powergrid_synth.distribution.distribution_synthesis",false],[20,"module-powergrid_synth.distribution.distribution_validation",false],[21,"module-powergrid_synth.distribution",false],[22,"module-powergrid_synth.distribution.synthesize",false],[23,"module-powergrid_synth.distribution_lines",false],[24,"module-powergrid_synth.distribution_topology",false],[25,"module-powergrid_synth.edge_creation",false],[26,"module-powergrid_synth.exporter",false],[27,"module-powergrid_synth.generation_dispatcher",false],[28,"module-powergrid_synth.generator",false],[29,"module-powergrid_synth.grid_graph",false],[30,"module-powergrid_synth.hierarchical_analysis",false],[31,"module-powergrid_synth",false],[32,"module-powergrid_synth.input_configurator",false],[33,"module-powergrid_synth.input_extractor",false],[34,"module-powergrid_synth.preprocessing",false],[35,"module-powergrid_synth.synthesize",false],[36,"module-powergrid_synth.transformer_edges",false],[37,"module-powergrid_synth.transmission.bus_type_allocator",false],[38,"module-powergrid_synth.transmission.capacity_allocator",false],[39,"module-powergrid_synth.transmission.deg_dist_optimizer",false],[40,"module-powergrid_synth.transmission.edge_creation",false],[41,"module-powergrid_synth.transmission.generation_dispatcher",false],[42,"module-powergrid_synth.transmission.generator",false],[43,"module-powergrid_synth.transmission",false],[44,"module-powergrid_synth.transmission.input_configurator",false],[45,"module-powergrid_synth.transmission.preprocessing",false],[46,"module-powergrid_synth.transmission.synthesize",false],[47,"module-powergrid_synth.transmission.transformer_edges",false],[48,"module-powergrid_synth.transmission.transmission",false],[49,"module-powergrid_synth.visualization",false],[68,"module-powergrid_synth.distribution.distribution_converter",false]],"mu_beta (powergrid_synth.transmission.transmission.transmissionlineallocator attribute)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator.mu_beta",false]],"mu_beta (powergrid_synth.transmission.transmissionlineallocator attribute)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator.mu_beta",false]],"mu_beta (powergrid_synth.transmissionlineallocator attribute)":[[31,"powergrid_synth.TransmissionLineAllocator.mu_beta",false],[68,"powergrid_synth.TransmissionLineAllocator.mu_beta",false]],"mu_committed (powergrid_synth.generation_dispatcher.generationdispatcher attribute)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher.mu_committed",false]],"mu_committed (powergrid_synth.generationdispatcher attribute)":[[31,"powergrid_synth.GenerationDispatcher.mu_committed",false],[68,"powergrid_synth.GenerationDispatcher.mu_committed",false]],"mu_committed (powergrid_synth.transmission.generation_dispatcher.generationdispatcher attribute)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher.mu_committed",false]],"mu_committed (powergrid_synth.transmission.generationdispatcher attribute)":[[43,"powergrid_synth.transmission.GenerationDispatcher.mu_committed",false]],"n_levels (powergrid_synth.core.grid_graph.transmissiongrid property)":[[9,"powergrid_synth.core.grid_graph.TransmissionGrid.n_levels",false]],"n_levels (powergrid_synth.core.transmissiongrid property)":[[11,"powergrid_synth.core.TransmissionGrid.n_levels",false]],"n_levels (powergrid_synth.transmissiongrid property)":[[31,"powergrid_synth.TransmissionGrid.n_levels",false],[68,"powergrid_synth.TransmissionGrid.n_levels",false]],"negbinomparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.NegBinomParams",false]],"negbinomparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.NegBinomParams",false]],"nodes_at_hop() (powergrid_synth.core.distributiongrid method)":[[11,"powergrid_synth.core.DistributionGrid.nodes_at_hop",false]],"nodes_at_hop() (powergrid_synth.core.grid_graph.distributiongrid method)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.nodes_at_hop",false]],"nodes_at_hop() (powergrid_synth.distributiongrid method)":[[31,"powergrid_synth.DistributionGrid.nodes_at_hop",false],[68,"powergrid_synth.DistributionGrid.nodes_at_hop",false]],"nodes_by_type() (powergrid_synth.core.distributiongrid method)":[[11,"powergrid_synth.core.DistributionGrid.nodes_by_type",false]],"nodes_by_type() (powergrid_synth.core.grid_graph.distributiongrid method)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.nodes_by_type",false]],"nodes_by_type() (powergrid_synth.distributiongrid method)":[[31,"powergrid_synth.DistributionGrid.nodes_by_type",false],[68,"powergrid_synth.DistributionGrid.nodes_by_type",false]],"normalparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.NormalParams",false]],"normalparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.NormalParams",false]],"nx_to_pandapower() (in module powergrid_synth)":[[68,"powergrid_synth.nx_to_pandapower",false]],"optimize() (powergrid_synth.deg_dist_optimizer.degreedistributionoptimizer method)":[[14,"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer.optimize",false]],"optimize() (powergrid_synth.transmission.deg_dist_optimizer.degreedistributionoptimizer method)":[[39,"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer.optimize",false]],"overload_b (powergrid_synth.transmission.transmission.transmissionlineallocator attribute)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator.overload_b",false]],"overload_b (powergrid_synth.transmission.transmissionlineallocator attribute)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator.overload_b",false]],"overload_b (powergrid_synth.transmissionlineallocator attribute)":[[31,"powergrid_synth.TransmissionLineAllocator.overload_b",false],[68,"powergrid_synth.TransmissionLineAllocator.overload_b",false]],"pandapower_to_feeders() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.pandapower_to_feeders",false]],"pandapower_to_feeders() (in module powergrid_synth.distribution.distribution_converter)":[[16,"powergrid_synth.distribution.distribution_converter.pandapower_to_feeders",false],[68,"powergrid_synth.distribution.distribution_converter.pandapower_to_feeders",false]],"pandapower_to_nx() (in module powergrid_synth)":[[68,"powergrid_synth.pandapower_to_nx",false]],"pandapower_to_pypowsybl() (in module powergrid_synth)":[[68,"powergrid_synth.pandapower_to_pypowsybl",false]],"pdf() (powergrid_synth.distribution.distribution_input_model.distributioninputmodel method)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel.pdf",false]],"pdf() (powergrid_synth.distribution.distributioninputmodel method)":[[21,"powergrid_synth.distribution.DistributionInputModel.pdf",false],[68,"powergrid_synth.distribution.DistributionInputModel.pdf",false]],"pf_cdf (powergrid_synth.distribution.distributionsynthparams attribute)":[[68,"powergrid_synth.distribution.DistributionSynthParams.pf_cdf",false]],"plot_all_levels() (powergrid_synth.core.hierarchical_analysis.hierarchicalanalyzer method)":[[10,"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer.plot_all_levels",false]],"plot_all_levels() (powergrid_synth.core.hierarchicalanalyzer method)":[[11,"powergrid_synth.core.HierarchicalAnalyzer.plot_all_levels",false]],"plot_all_levels() (powergrid_synth.hierarchical_analysis.hierarchicalanalyzer method)":[[30,"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer.plot_all_levels",false]],"plot_all_levels() (powergrid_synth.hierarchicalanalyzer method)":[[31,"powergrid_synth.HierarchicalAnalyzer.plot_all_levels",false]],"plot_all_levels_comparison() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.plot_all_levels_comparison",false]],"plot_all_levels_comparison() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.plot_all_levels_comparison",false]],"plot_all_levels_comparison() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.plot_all_levels_comparison",false]],"plot_all_levels_comparison() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.plot_all_levels_comparison",false],[68,"powergrid_synth.GraphComparator.plot_all_levels_comparison",false]],"plot_bus_types() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_bus_types",false]],"plot_bus_types() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_bus_types",false]],"plot_bus_types() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_bus_types",false],[68,"powergrid_synth.GridVisualizer.plot_bus_types",false]],"plot_bus_types() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_bus_types",false]],"plot_degree_comparison() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.plot_degree_comparison",false]],"plot_degree_comparison() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.plot_degree_comparison",false]],"plot_degree_comparison() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.plot_degree_comparison",false]],"plot_degree_comparison() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.plot_degree_comparison",false],[68,"powergrid_synth.GraphComparator.plot_degree_comparison",false]],"plot_degree_distribution() (powergrid_synth.analysis.gridanalyzer method)":[[2,"powergrid_synth.analysis.GridAnalyzer.plot_degree_distribution",false]],"plot_degree_distribution() (powergrid_synth.core.analysis.gridanalyzer method)":[[6,"powergrid_synth.core.analysis.GridAnalyzer.plot_degree_distribution",false]],"plot_degree_distribution() (powergrid_synth.core.gridanalyzer method)":[[11,"powergrid_synth.core.GridAnalyzer.plot_degree_distribution",false]],"plot_entropy_pdf() (powergrid_synth.bus_type_allocator.bustypeallocator method)":[[3,"powergrid_synth.bus_type_allocator.BusTypeAllocator.plot_entropy_pdf",false]],"plot_entropy_pdf() (powergrid_synth.bustypeallocator method)":[[31,"powergrid_synth.BusTypeAllocator.plot_entropy_pdf",false],[68,"powergrid_synth.BusTypeAllocator.plot_entropy_pdf",false]],"plot_entropy_pdf() (powergrid_synth.transmission.bus_type_allocator.bustypeallocator method)":[[37,"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator.plot_entropy_pdf",false]],"plot_entropy_pdf() (powergrid_synth.transmission.bustypeallocator method)":[[43,"powergrid_synth.transmission.BusTypeAllocator.plot_entropy_pdf",false]],"plot_grid() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_grid",false]],"plot_grid() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_grid",false]],"plot_grid() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_grid",false],[68,"powergrid_synth.GridVisualizer.plot_grid",false]],"plot_grid() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_grid",false]],"plot_impedance() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_impedance",false]],"plot_impedance() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_impedance",false]],"plot_impedance() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_impedance",false],[68,"powergrid_synth.GridVisualizer.plot_impedance",false]],"plot_impedance() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_impedance",false]],"plot_interactive() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_interactive",false]],"plot_interactive() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_interactive",false]],"plot_interactive() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_interactive",false],[68,"powergrid_synth.GridVisualizer.plot_interactive",false]],"plot_interactive() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_interactive",false]],"plot_interactive_bus_types() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_interactive_bus_types",false]],"plot_interactive_bus_types() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_interactive_bus_types",false]],"plot_interactive_bus_types() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_interactive_bus_types",false],[68,"powergrid_synth.GridVisualizer.plot_interactive_bus_types",false]],"plot_interactive_bus_types() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_interactive_bus_types",false]],"plot_interactive_voltage_level() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_interactive_voltage_level",false]],"plot_interactive_voltage_level() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_interactive_voltage_level",false]],"plot_interactive_voltage_level() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_interactive_voltage_level",false],[68,"powergrid_synth.GridVisualizer.plot_interactive_voltage_level",false]],"plot_interactive_voltage_level() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_interactive_voltage_level",false]],"plot_level_topology_comparison() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.plot_level_topology_comparison",false]],"plot_level_topology_comparison() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.plot_level_topology_comparison",false]],"plot_level_topology_comparison() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.plot_level_topology_comparison",false]],"plot_level_topology_comparison() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.plot_level_topology_comparison",false],[68,"powergrid_synth.GraphComparator.plot_level_topology_comparison",false]],"plot_load_gen_bubbles() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_load_gen_bubbles",false]],"plot_load_gen_bubbles() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_load_gen_bubbles",false]],"plot_load_gen_bubbles() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_load_gen_bubbles",false],[68,"powergrid_synth.GridVisualizer.plot_load_gen_bubbles",false]],"plot_load_gen_bubbles() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_load_gen_bubbles",false]],"plot_subgraphs() (powergrid_synth.core.gridvisualizer method)":[[11,"powergrid_synth.core.GridVisualizer.plot_subgraphs",false]],"plot_subgraphs() (powergrid_synth.core.visualization.gridvisualizer method)":[[13,"powergrid_synth.core.visualization.GridVisualizer.plot_subgraphs",false]],"plot_subgraphs() (powergrid_synth.gridvisualizer method)":[[31,"powergrid_synth.GridVisualizer.plot_subgraphs",false],[68,"powergrid_synth.GridVisualizer.plot_subgraphs",false]],"plot_subgraphs() (powergrid_synth.visualization.gridvisualizer method)":[[49,"powergrid_synth.visualization.GridVisualizer.plot_subgraphs",false]],"powergrid_synth":[[31,"module-powergrid_synth",false]],"powergrid_synth.analysis":[[2,"module-powergrid_synth.analysis",false]],"powergrid_synth.bus_type_allocator":[[3,"module-powergrid_synth.bus_type_allocator",false]],"powergrid_synth.capacity_allocator":[[4,"module-powergrid_synth.capacity_allocator",false]],"powergrid_synth.comparison":[[5,"module-powergrid_synth.comparison",false]],"powergrid_synth.core":[[11,"module-powergrid_synth.core",false]],"powergrid_synth.core.analysis":[[6,"module-powergrid_synth.core.analysis",false]],"powergrid_synth.core.comparison":[[7,"module-powergrid_synth.core.comparison",false]],"powergrid_synth.core.exporter":[[8,"module-powergrid_synth.core.exporter",false]],"powergrid_synth.core.grid_graph":[[9,"module-powergrid_synth.core.grid_graph",false]],"powergrid_synth.core.hierarchical_analysis":[[10,"module-powergrid_synth.core.hierarchical_analysis",false]],"powergrid_synth.core.input_extractor":[[12,"module-powergrid_synth.core.input_extractor",false]],"powergrid_synth.core.visualization":[[13,"module-powergrid_synth.core.visualization",false]],"powergrid_synth.deg_dist_optimizer":[[14,"module-powergrid_synth.deg_dist_optimizer",false]],"powergrid_synth.distribution":[[21,"module-powergrid_synth.distribution",false]],"powergrid_synth.distribution.distribution_analysis":[[15,"module-powergrid_synth.distribution.distribution_analysis",false]],"powergrid_synth.distribution.distribution_converter":[[16,"module-powergrid_synth.distribution.distribution_converter",false],[68,"module-powergrid_synth.distribution.distribution_converter",false]],"powergrid_synth.distribution.distribution_input_model":[[17,"module-powergrid_synth.distribution.distribution_input_model",false]],"powergrid_synth.distribution.distribution_params":[[18,"module-powergrid_synth.distribution.distribution_params",false]],"powergrid_synth.distribution.distribution_synthesis":[[19,"module-powergrid_synth.distribution.distribution_synthesis",false]],"powergrid_synth.distribution.distribution_validation":[[20,"module-powergrid_synth.distribution.distribution_validation",false]],"powergrid_synth.distribution.synthesize":[[22,"module-powergrid_synth.distribution.synthesize",false]],"powergrid_synth.distribution_lines":[[23,"module-powergrid_synth.distribution_lines",false]],"powergrid_synth.distribution_topology":[[24,"module-powergrid_synth.distribution_topology",false]],"powergrid_synth.edge_creation":[[25,"module-powergrid_synth.edge_creation",false]],"powergrid_synth.exporter":[[26,"module-powergrid_synth.exporter",false]],"powergrid_synth.generation_dispatcher":[[27,"module-powergrid_synth.generation_dispatcher",false]],"powergrid_synth.generator":[[28,"module-powergrid_synth.generator",false]],"powergrid_synth.grid_graph":[[29,"module-powergrid_synth.grid_graph",false]],"powergrid_synth.hierarchical_analysis":[[30,"module-powergrid_synth.hierarchical_analysis",false]],"powergrid_synth.input_configurator":[[32,"module-powergrid_synth.input_configurator",false]],"powergrid_synth.input_extractor":[[33,"module-powergrid_synth.input_extractor",false]],"powergrid_synth.preprocessing":[[34,"module-powergrid_synth.preprocessing",false]],"powergrid_synth.synthesize":[[35,"module-powergrid_synth.synthesize",false]],"powergrid_synth.transformer_edges":[[36,"module-powergrid_synth.transformer_edges",false]],"powergrid_synth.transmission":[[43,"module-powergrid_synth.transmission",false]],"powergrid_synth.transmission.bus_type_allocator":[[37,"module-powergrid_synth.transmission.bus_type_allocator",false]],"powergrid_synth.transmission.capacity_allocator":[[38,"module-powergrid_synth.transmission.capacity_allocator",false]],"powergrid_synth.transmission.deg_dist_optimizer":[[39,"module-powergrid_synth.transmission.deg_dist_optimizer",false]],"powergrid_synth.transmission.edge_creation":[[40,"module-powergrid_synth.transmission.edge_creation",false]],"powergrid_synth.transmission.generation_dispatcher":[[41,"module-powergrid_synth.transmission.generation_dispatcher",false]],"powergrid_synth.transmission.generator":[[42,"module-powergrid_synth.transmission.generator",false]],"powergrid_synth.transmission.input_configurator":[[44,"module-powergrid_synth.transmission.input_configurator",false]],"powergrid_synth.transmission.preprocessing":[[45,"module-powergrid_synth.transmission.preprocessing",false]],"powergrid_synth.transmission.synthesize":[[46,"module-powergrid_synth.transmission.synthesize",false]],"powergrid_synth.transmission.transformer_edges":[[47,"module-powergrid_synth.transmission.transformer_edges",false]],"powergrid_synth.transmission.transmission":[[48,"module-powergrid_synth.transmission.transmission",false]],"powergrid_synth.visualization":[[49,"module-powergrid_synth.visualization",false]],"powergridgenerator (class in powergrid_synth)":[[31,"powergrid_synth.PowerGridGenerator",false],[68,"powergrid_synth.PowerGridGenerator",false]],"powergridgenerator (class in powergrid_synth.generator)":[[28,"powergrid_synth.generator.PowerGridGenerator",false]],"powergridgenerator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.PowerGridGenerator",false]],"powergridgenerator (class in powergrid_synth.transmission.generator)":[[42,"powergrid_synth.transmission.generator.PowerGridGenerator",false]],"powergridgraph (class in powergrid_synth)":[[31,"powergrid_synth.PowerGridGraph",false],[68,"powergrid_synth.PowerGridGraph",false]],"powergridgraph (class in powergrid_synth.core)":[[11,"powergrid_synth.core.PowerGridGraph",false]],"powergridgraph (class in powergrid_synth.core.grid_graph)":[[9,"powergrid_synth.core.grid_graph.PowerGridGraph",false]],"powergridgraph (class in powergrid_synth.grid_graph)":[[29,"powergrid_synth.grid_graph.PowerGridGraph",false]],"powerlawclip (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.PowerLawClip",false]],"powerlawclip (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.PowerLawClip",false]],"preprocessor (class in powergrid_synth.preprocessing)":[[34,"powergrid_synth.preprocessing.Preprocessor",false]],"preprocessor (class in powergrid_synth.transmission.preprocessing)":[[45,"powergrid_synth.transmission.preprocessing.Preprocessor",false]],"print_level_metrics() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.print_level_metrics",false]],"print_level_metrics() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.print_level_metrics",false]],"print_level_metrics() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.print_level_metrics",false]],"print_level_metrics() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.print_level_metrics",false],[68,"powergrid_synth.GraphComparator.print_level_metrics",false]],"print_metric_comparison() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.print_metric_comparison",false]],"print_metric_comparison() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.print_metric_comparison",false]],"print_metric_comparison() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.print_metric_comparison",false]],"print_metric_comparison() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.print_metric_comparison",false],[68,"powergrid_synth.GraphComparator.print_metric_comparison",false]],"pypowsybl_to_feeders() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.pypowsybl_to_feeders",false]],"pypowsybl_to_feeders() (in module powergrid_synth.distribution.distribution_converter)":[[16,"powergrid_synth.distribution.distribution_converter.pypowsybl_to_feeders",false],[68,"powergrid_synth.distribution.distribution_converter.pypowsybl_to_feeders",false]],"pypowsybl_to_nx() (in module powergrid_synth)":[[68,"powergrid_synth.pypowsybl_to_nx",false]],"root (powergrid_synth.core.distributiongrid property)":[[11,"powergrid_synth.core.DistributionGrid.root",false]],"root (powergrid_synth.core.grid_graph.distributiongrid property)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.root",false]],"root (powergrid_synth.distributiongrid property)":[[31,"powergrid_synth.DistributionGrid.root",false],[68,"powergrid_synth.DistributionGrid.root",false]],"run() (powergrid_synth.core.dcpowerflow method)":[[11,"powergrid_synth.core.DCPowerFlow.run",false]],"run_full_comparison() (powergrid_synth.comparison.graphcomparator method)":[[5,"powergrid_synth.comparison.GraphComparator.run_full_comparison",false]],"run_full_comparison() (powergrid_synth.core.comparison.graphcomparator method)":[[7,"powergrid_synth.core.comparison.GraphComparator.run_full_comparison",false]],"run_full_comparison() (powergrid_synth.core.graphcomparator method)":[[11,"powergrid_synth.core.GraphComparator.run_full_comparison",false]],"run_full_comparison() (powergrid_synth.graphcomparator method)":[[31,"powergrid_synth.GraphComparator.run_full_comparison",false],[68,"powergrid_synth.GraphComparator.run_full_comparison",false]],"run_full_report() (powergrid_synth.core.hierarchical_analysis.hierarchicalanalyzer method)":[[10,"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer.run_full_report",false]],"run_full_report() (powergrid_synth.core.hierarchicalanalyzer method)":[[11,"powergrid_synth.core.HierarchicalAnalyzer.run_full_report",false]],"run_full_report() (powergrid_synth.hierarchical_analysis.hierarchicalanalyzer method)":[[30,"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer.run_full_report",false]],"run_full_report() (powergrid_synth.hierarchicalanalyzer method)":[[31,"powergrid_synth.HierarchicalAnalyzer.run_full_report",false]],"run_global_analysis() (powergrid_synth.core.hierarchical_analysis.hierarchicalanalyzer method)":[[10,"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer.run_global_analysis",false]],"run_global_analysis() (powergrid_synth.core.hierarchicalanalyzer method)":[[11,"powergrid_synth.core.HierarchicalAnalyzer.run_global_analysis",false]],"run_global_analysis() (powergrid_synth.hierarchical_analysis.hierarchicalanalyzer method)":[[30,"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer.run_global_analysis",false]],"run_global_analysis() (powergrid_synth.hierarchicalanalyzer method)":[[31,"powergrid_synth.HierarchicalAnalyzer.run_global_analysis",false]],"run_level_analysis() (powergrid_synth.core.hierarchical_analysis.hierarchicalanalyzer method)":[[10,"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer.run_level_analysis",false]],"run_level_analysis() (powergrid_synth.core.hierarchicalanalyzer method)":[[11,"powergrid_synth.core.HierarchicalAnalyzer.run_level_analysis",false]],"run_level_analysis() (powergrid_synth.hierarchical_analysis.hierarchicalanalyzer method)":[[30,"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer.run_level_analysis",false]],"run_level_analysis() (powergrid_synth.hierarchicalanalyzer method)":[[31,"powergrid_synth.HierarchicalAnalyzer.run_level_analysis",false]],"run_setup() (powergrid_synth.preprocessing.preprocessor method)":[[34,"powergrid_synth.preprocessing.Preprocessor.run_setup",false]],"run_setup() (powergrid_synth.transmission.preprocessing.preprocessor method)":[[45,"powergrid_synth.transmission.preprocessing.Preprocessor.run_setup",false]],"sample() (powergrid_synth.distribution.distribution_input_model.distributioninputmodel method)":[[17,"powergrid_synth.distribution.distribution_input_model.DistributionInputModel.sample",false]],"sample() (powergrid_synth.distribution.distributioninputmodel method)":[[21,"powergrid_synth.distribution.DistributionInputModel.sample",false],[68,"powergrid_synth.distribution.DistributionInputModel.sample",false]],"schweetzerfeedergenerator (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.SchweetzerFeederGenerator",false],[68,"powergrid_synth.distribution.SchweetzerFeederGenerator",false]],"schweetzerfeedergenerator (class in powergrid_synth.distribution.distribution_synthesis)":[[19,"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator",false]],"stab_params (powergrid_synth.transmission.transmission.transmissionlineallocator attribute)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator.stab_params",false]],"stab_params (powergrid_synth.transmission.transmissionlineallocator attribute)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator.stab_params",false]],"stab_params (powergrid_synth.transmissionlineallocator attribute)":[[31,"powergrid_synth.TransmissionLineAllocator.stab_params",false],[68,"powergrid_synth.TransmissionLineAllocator.stab_params",false]],"synthesize() (in module powergrid_synth)":[[68,"powergrid_synth.synthesize",false]],"synthesize() (in module powergrid_synth.synthesize)":[[35,"powergrid_synth.synthesize.synthesize",false]],"synthesize() (in module powergrid_synth.transmission.synthesize)":[[46,"powergrid_synth.transmission.synthesize.synthesize",false]],"synthesize_distribution() (in module powergrid_synth)":[[68,"powergrid_synth.synthesize_distribution",false]],"synthesize_distribution() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.synthesize_distribution",false]],"synthesize_distribution() (in module powergrid_synth.distribution.synthesize)":[[22,"powergrid_synth.distribution.synthesize.synthesize_distribution",false]],"tab_2d_pg (powergrid_synth.generation_dispatcher.generationdispatcher attribute)":[[27,"powergrid_synth.generation_dispatcher.GenerationDispatcher.tab_2d_pg",false]],"tab_2d_pg (powergrid_synth.generationdispatcher attribute)":[[31,"powergrid_synth.GenerationDispatcher.tab_2d_pg",false],[68,"powergrid_synth.GenerationDispatcher.tab_2d_pg",false]],"tab_2d_pg (powergrid_synth.transmission.generation_dispatcher.generationdispatcher attribute)":[[41,"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher.tab_2d_pg",false]],"tab_2d_pg (powergrid_synth.transmission.generationdispatcher attribute)":[[43,"powergrid_synth.transmission.GenerationDispatcher.tab_2d_pg",false]],"tab_fl_beta (powergrid_synth.transmission.transmission.transmissionlineallocator attribute)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator.tab_fl_beta",false]],"tab_fl_beta (powergrid_synth.transmission.transmissionlineallocator attribute)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator.tab_fl_beta",false]],"tab_fl_beta (powergrid_synth.transmissionlineallocator attribute)":[[31,"powergrid_synth.TransmissionLineAllocator.tab_fl_beta",false],[68,"powergrid_synth.TransmissionLineAllocator.tab_fl_beta",false]],"tlocationscaleparams (class in powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.TLocationScaleParams",false]],"tlocationscaleparams (class in powergrid_synth.distribution.distribution_params)":[[18,"powergrid_synth.distribution.distribution_params.TLocationScaleParams",false]],"to_cgmes() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_cgmes",false]],"to_cgmes() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_cgmes",false]],"to_cgmes() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_cgmes",false]],"to_excel() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_excel",false]],"to_excel() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_excel",false]],"to_excel() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_excel",false]],"to_json() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_json",false]],"to_json() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_json",false]],"to_json() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_json",false]],"to_matpower() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_matpower",false]],"to_matpower() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_matpower",false]],"to_matpower() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_matpower",false]],"to_pickle() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_pickle",false]],"to_pickle() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_pickle",false]],"to_pickle() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_pickle",false]],"to_psse() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_psse",false]],"to_psse() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_psse",false]],"to_psse() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_psse",false]],"to_pypowsybl() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_pypowsybl",false]],"to_pypowsybl() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_pypowsybl",false]],"to_pypowsybl() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_pypowsybl",false]],"to_sqlite() (powergrid_synth.core.exporter.gridexporter method)":[[8,"powergrid_synth.core.exporter.GridExporter.to_sqlite",false]],"to_sqlite() (powergrid_synth.exporter.gridexporter method)":[[26,"powergrid_synth.exporter.GridExporter.to_sqlite",false]],"to_sqlite() (powergrid_synth.gridexporter method)":[[68,"powergrid_synth.GridExporter.to_sqlite",false]],"total_gen_mw (powergrid_synth.core.distributiongrid property)":[[11,"powergrid_synth.core.DistributionGrid.total_gen_mw",false]],"total_gen_mw (powergrid_synth.core.grid_graph.distributiongrid property)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.total_gen_mw",false]],"total_gen_mw (powergrid_synth.distributiongrid property)":[[31,"powergrid_synth.DistributionGrid.total_gen_mw",false],[68,"powergrid_synth.DistributionGrid.total_gen_mw",false]],"total_load_mw (powergrid_synth.core.distributiongrid property)":[[11,"powergrid_synth.core.DistributionGrid.total_load_mw",false]],"total_load_mw (powergrid_synth.core.grid_graph.distributiongrid property)":[[9,"powergrid_synth.core.grid_graph.DistributionGrid.total_load_mw",false]],"total_load_mw (powergrid_synth.distributiongrid property)":[[31,"powergrid_synth.DistributionGrid.total_load_mw",false],[68,"powergrid_synth.DistributionGrid.total_load_mw",false]],"transformerconnector (class in powergrid_synth.transformer_edges)":[[36,"powergrid_synth.transformer_edges.TransformerConnector",false]],"transformerconnector (class in powergrid_synth.transmission.transformer_edges)":[[47,"powergrid_synth.transmission.transformer_edges.TransformerConnector",false]],"transmissiongrid (class in powergrid_synth)":[[31,"powergrid_synth.TransmissionGrid",false],[68,"powergrid_synth.TransmissionGrid",false]],"transmissiongrid (class in powergrid_synth.core)":[[11,"powergrid_synth.core.TransmissionGrid",false]],"transmissiongrid (class in powergrid_synth.core.grid_graph)":[[9,"powergrid_synth.core.grid_graph.TransmissionGrid",false]],"transmissionlineallocator (class in powergrid_synth)":[[31,"powergrid_synth.TransmissionLineAllocator",false],[68,"powergrid_synth.TransmissionLineAllocator",false]],"transmissionlineallocator (class in powergrid_synth.transmission)":[[43,"powergrid_synth.transmission.TransmissionLineAllocator",false]],"transmissionlineallocator (class in powergrid_synth.transmission.transmission)":[[48,"powergrid_synth.transmission.transmission.TransmissionLineAllocator",false]],"type_conn (powergrid_synth.bustypeallocator attribute)":[[68,"powergrid_synth.BusTypeAllocator.TYPE_CONN",false]],"type_gen (powergrid_synth.bustypeallocator attribute)":[[68,"powergrid_synth.BusTypeAllocator.TYPE_GEN",false]],"type_load (powergrid_synth.bustypeallocator attribute)":[[68,"powergrid_synth.BusTypeAllocator.TYPE_LOAD",false]],"validate_tree() (in module powergrid_synth.distribution)":[[21,"powergrid_synth.distribution.validate_tree",false]],"validate_tree() (in module powergrid_synth.distribution.distribution_validation)":[[20,"powergrid_synth.distribution.distribution_validation.validate_tree",false]],"voltage_levels (powergrid_synth.core.grid_graph.transmissiongrid property)":[[9,"powergrid_synth.core.grid_graph.TransmissionGrid.voltage_levels",false]],"voltage_levels (powergrid_synth.core.transmissiongrid property)":[[11,"powergrid_synth.core.TransmissionGrid.voltage_levels",false]],"voltage_levels (powergrid_synth.transmissiongrid property)":[[31,"powergrid_synth.TransmissionGrid.voltage_levels",false],[68,"powergrid_synth.TransmissionGrid.voltage_levels",false]]},"objects":{"":[[31,0,0,"-","powergrid_synth"]],"powergrid_synth":[[68,1,1,"","BusTypeAllocator"],[68,1,1,"","CapacityAllocator"],[68,1,1,"","DistributionGrid"],[68,1,1,"","GenerationDispatcher"],[68,1,1,"","GraphComparator"],[68,1,1,"","GridExporter"],[68,1,1,"","GridVisualizer"],[31,1,1,"","HierarchicalAnalyzer"],[68,1,1,"","InputConfigurator"],[68,1,1,"","LoadAllocator"],[68,1,1,"","PowerGridGenerator"],[68,1,1,"","PowerGridGraph"],[68,1,1,"","TransmissionGrid"],[68,1,1,"","TransmissionLineAllocator"],[2,0,0,"-","analysis"],[3,0,0,"-","bus_type_allocator"],[4,0,0,"-","capacity_allocator"],[5,0,0,"-","comparison"],[11,0,0,"-","core"],[14,0,0,"-","deg_dist_optimizer"],[21,0,0,"-","distribution"],[23,0,0,"-","distribution_lines"],[24,0,0,"-","distribution_topology"],[25,0,0,"-","edge_creation"],[26,0,0,"-","exporter"],[31,5,1,"","extract_topology_params_from_graph"],[27,0,0,"-","generation_dispatcher"],[28,0,0,"-","generator"],[31,5,1,"","get_reference_stats"],[29,0,0,"-","grid_graph"],[30,0,0,"-","hierarchical_analysis"],[32,0,0,"-","input_configurator"],[33,0,0,"-","input_extractor"],[68,5,1,"","load_grid"],[68,5,1,"","nx_to_pandapower"],[68,5,1,"","pandapower_to_nx"],[68,5,1,"","pandapower_to_pypowsybl"],[34,0,0,"-","preprocessing"],[68,5,1,"","pypowsybl_to_nx"],[68,5,1,"","synthesize"],[35,0,0,"-","synthesize"],[68,5,1,"","synthesize_distribution"],[36,0,0,"-","transformer_edges"],[43,0,0,"-","transmission"],[49,0,0,"-","visualization"]],"powergrid_synth.BusTypeAllocator":[[68,2,1,"","TYPE_CONN"],[68,2,1,"","TYPE_GEN"],[68,2,1,"","TYPE_LOAD"],[31,3,1,"","_calculate_bus_ratios"],[31,3,1,"","_calculate_entropy_score"],[31,3,1,"","_calculate_link_ratios"],[31,3,1,"","_estimate_w_star"],[31,3,1,"","_generate_random_assignment"],[31,3,1,"","_get_d_parameter"],[31,3,1,"","_get_ratios"],[31,3,1,"","_normalize_ratio"],[68,3,1,"","allocate"],[68,3,1,"","plot_entropy_pdf"]],"powergrid_synth.CapacityAllocator":[[31,3,1,"","_assignment_logic"],[31,3,1,"","_generate_heuristic_tab_2d"],[31,3,1,"","_get_default_tab_2d"],[31,3,1,"","_initial_generation_distribution"],[68,3,1,"","allocate"]],"powergrid_synth.DistributionGrid":[[68,3,1,"","from_nx"],[68,4,1,"","is_radial"],[68,4,1,"","max_hop"],[68,3,1,"","nodes_at_hop"],[68,3,1,"","nodes_by_type"],[68,4,1,"","root"],[68,4,1,"","total_gen_mw"],[68,4,1,"","total_load_mw"]],"powergrid_synth.GenerationDispatcher":[[31,3,1,"","_assign_alphas"],[31,3,1,"","_generate_alphas"],[31,3,1,"","_select_committed"],[31,3,1,"","_select_uncommitted"],[68,2,1,"","alpha_mod"],[68,3,1,"","dispatch"],[68,2,1,"","mu_committed"],[68,2,1,"","tab_2d_pg"]],"powergrid_synth.GraphComparator":[[31,3,1,"","_get_comparison_data"],[68,3,1,"","compare_degree_distributions"],[68,3,1,"","plot_all_levels_comparison"],[68,3,1,"","plot_degree_comparison"],[68,3,1,"","plot_level_topology_comparison"],[68,3,1,"","print_level_metrics"],[68,3,1,"","print_metric_comparison"],[68,3,1,"","run_full_comparison"]],"powergrid_synth.GridExporter":[[68,3,1,"","to_cgmes"],[68,3,1,"","to_excel"],[68,3,1,"","to_json"],[68,3,1,"","to_matpower"],[68,3,1,"","to_pickle"],[68,3,1,"","to_psse"],[68,3,1,"","to_pypowsybl"],[68,3,1,"","to_sqlite"]],"powergrid_synth.GridVisualizer":[[31,3,1,"","_create_interactive_window"],[31,3,1,"","_draw_bus_types_on_ax"],[31,3,1,"","_draw_edges_impedance"],[31,3,1,"","_draw_graph_on_ax"],[31,3,1,"","_find_tree_root"],[31,3,1,"","_get_layered_layout"],[31,3,1,"","_get_node_colors"],[31,3,1,"","_hierarchical_tree_layout"],[31,3,1,"","_radial_tree_layout"],[31,3,1,"","_yifan_hu_layout"],[68,3,1,"","plot_bus_types"],[68,3,1,"","plot_grid"],[68,3,1,"","plot_impedance"],[68,3,1,"","plot_interactive"],[68,3,1,"","plot_interactive_bus_types"],[68,3,1,"","plot_interactive_voltage_level"],[68,3,1,"","plot_load_gen_bubbles"],[68,3,1,"","plot_subgraphs"]],"powergrid_synth.HierarchicalAnalyzer":[[31,3,1,"","plot_all_levels"],[31,3,1,"","run_full_report"],[31,3,1,"","run_global_analysis"],[31,3,1,"","run_level_analysis"]],"powergrid_synth.InputConfigurator":[[31,3,1,"","_generate_optimized_degrees"],[31,3,1,"","_generate_poisson_degrees"],[31,3,1,"","_generate_transformer_simple"],[31,3,1,"","_generate_transformer_stars"],[68,3,1,"","create_params"]],"powergrid_synth.LoadAllocator":[[31,3,1,"","_assignment_logic"],[31,3,1,"","_calculate_total_load"],[31,3,1,"","_get_tab_2d_load"],[31,3,1,"","_initial_load_distribution"],[68,3,1,"","allocate"],[68,3,1,"","allocate_reactive"]],"powergrid_synth.PowerGridGenerator":[[31,3,1,"","_generate_subgraphs"],[31,3,1,"","_generate_transformer_connections"],[68,3,1,"","generate_grid"]],"powergrid_synth.PowerGridGraph":[[68,3,1,"","level"]],"powergrid_synth.TransmissionGrid":[[68,4,1,"","n_levels"],[68,4,1,"","voltage_levels"]],"powergrid_synth.TransmissionLineAllocator":[[31,3,1,"","_assign_betas"],[31,3,1,"","_generate_beta"],[31,3,1,"","_generate_phi"],[31,3,1,"","_refine_topology"],[68,3,1,"","allocate"],[68,2,1,"","mu_beta"],[68,2,1,"","overload_b"],[68,2,1,"","stab_params"],[68,2,1,"","tab_fl_beta"]],"powergrid_synth.analysis":[[2,1,1,"","GridAnalyzer"]],"powergrid_synth.analysis.GridAnalyzer":[[2,3,1,"","analyze"],[2,3,1,"","get_basic_stats"],[2,3,1,"","get_clustering_metrics"],[2,3,1,"","get_path_metrics"],[2,3,1,"","plot_degree_distribution"]],"powergrid_synth.bus_type_allocator":[[3,1,1,"","BusTypeAllocator"]],"powergrid_synth.bus_type_allocator.BusTypeAllocator":[[3,3,1,"","_calculate_bus_ratios"],[3,3,1,"","_calculate_entropy_score"],[3,3,1,"","_calculate_link_ratios"],[3,3,1,"","_estimate_w_star"],[3,3,1,"","_generate_random_assignment"],[3,3,1,"","_get_d_parameter"],[3,3,1,"","_get_ratios"],[3,3,1,"","_normalize_ratio"],[3,3,1,"","allocate"],[3,3,1,"","plot_entropy_pdf"]],"powergrid_synth.capacity_allocator":[[4,1,1,"","CapacityAllocator"]],"powergrid_synth.capacity_allocator.CapacityAllocator":[[4,3,1,"","_assignment_logic"],[4,3,1,"","_generate_heuristic_tab_2d"],[4,3,1,"","_get_default_tab_2d"],[4,3,1,"","_initial_generation_distribution"],[4,3,1,"","allocate"]],"powergrid_synth.comparison":[[5,1,1,"","GraphComparator"]],"powergrid_synth.comparison.GraphComparator":[[5,3,1,"","_get_comparison_data"],[5,3,1,"","compare_degree_distributions"],[5,3,1,"","plot_all_levels_comparison"],[5,3,1,"","plot_degree_comparison"],[5,3,1,"","plot_level_topology_comparison"],[5,3,1,"","print_level_metrics"],[5,3,1,"","print_metric_comparison"],[5,3,1,"","run_full_comparison"]],"powergrid_synth.core":[[11,1,1,"","DCPowerFlow"],[11,1,1,"","DistributionGrid"],[11,1,1,"","GraphComparator"],[11,1,1,"","GridAnalyzer"],[11,1,1,"","GridVisualizer"],[11,1,1,"","HierarchicalAnalyzer"],[11,1,1,"","PowerGridGraph"],[11,1,1,"","TransmissionGrid"],[6,0,0,"-","analysis"],[7,0,0,"-","comparison"],[8,0,0,"-","exporter"],[11,5,1,"","extract_topology_params_from_graph"],[11,5,1,"","get_reference_stats"],[9,0,0,"-","grid_graph"],[10,0,0,"-","hierarchical_analysis"],[12,0,0,"-","input_extractor"],[13,0,0,"-","visualization"]],"powergrid_synth.core.DCPowerFlow":[[11,3,1,"","run"]],"powergrid_synth.core.DistributionGrid":[[11,3,1,"","from_nx"],[11,4,1,"","is_radial"],[11,4,1,"","max_hop"],[11,3,1,"","nodes_at_hop"],[11,3,1,"","nodes_by_type"],[11,4,1,"","root"],[11,4,1,"","total_gen_mw"],[11,4,1,"","total_load_mw"]],"powergrid_synth.core.GraphComparator":[[11,3,1,"","_get_comparison_data"],[11,3,1,"","compare_degree_distributions"],[11,3,1,"","plot_all_levels_comparison"],[11,3,1,"","plot_degree_comparison"],[11,3,1,"","plot_level_topology_comparison"],[11,3,1,"","print_level_metrics"],[11,3,1,"","print_metric_comparison"],[11,3,1,"","run_full_comparison"]],"powergrid_synth.core.GridAnalyzer":[[11,3,1,"","analyze"],[11,3,1,"","get_basic_stats"],[11,3,1,"","get_clustering_metrics"],[11,3,1,"","get_path_metrics"],[11,3,1,"","plot_degree_distribution"]],"powergrid_synth.core.GridVisualizer":[[11,3,1,"","_create_interactive_window"],[11,3,1,"","_draw_bus_types_on_ax"],[11,3,1,"","_draw_edges_impedance"],[11,3,1,"","_draw_graph_on_ax"],[11,3,1,"","_find_tree_root"],[11,3,1,"","_get_layered_layout"],[11,3,1,"","_get_node_colors"],[11,3,1,"","_hierarchical_tree_layout"],[11,3,1,"","_radial_tree_layout"],[11,3,1,"","_yifan_hu_layout"],[11,3,1,"","plot_bus_types"],[11,3,1,"","plot_grid"],[11,3,1,"","plot_impedance"],[11,3,1,"","plot_interactive"],[11,3,1,"","plot_interactive_bus_types"],[11,3,1,"","plot_interactive_voltage_level"],[11,3,1,"","plot_load_gen_bubbles"],[11,3,1,"","plot_subgraphs"]],"powergrid_synth.core.HierarchicalAnalyzer":[[11,3,1,"","plot_all_levels"],[11,3,1,"","run_full_report"],[11,3,1,"","run_global_analysis"],[11,3,1,"","run_level_analysis"]],"powergrid_synth.core.PowerGridGraph":[[11,3,1,"","level"]],"powergrid_synth.core.TransmissionGrid":[[11,4,1,"","n_levels"],[11,4,1,"","voltage_levels"]],"powergrid_synth.core.analysis":[[6,1,1,"","GridAnalyzer"]],"powergrid_synth.core.analysis.GridAnalyzer":[[6,3,1,"","analyze"],[6,3,1,"","get_basic_stats"],[6,3,1,"","get_clustering_metrics"],[6,3,1,"","get_path_metrics"],[6,3,1,"","plot_degree_distribution"]],"powergrid_synth.core.comparison":[[7,1,1,"","GraphComparator"]],"powergrid_synth.core.comparison.GraphComparator":[[7,3,1,"","_get_comparison_data"],[7,3,1,"","compare_degree_distributions"],[7,3,1,"","plot_all_levels_comparison"],[7,3,1,"","plot_degree_comparison"],[7,3,1,"","plot_level_topology_comparison"],[7,3,1,"","print_level_metrics"],[7,3,1,"","print_metric_comparison"],[7,3,1,"","run_full_comparison"]],"powergrid_synth.core.exporter":[[8,1,1,"","GridExporter"]],"powergrid_synth.core.exporter.GridExporter":[[8,3,1,"","_get_pandapower_net"],[8,3,1,"","_get_pypowsybl_net"],[8,3,1,"","to_cgmes"],[8,3,1,"","to_excel"],[8,3,1,"","to_json"],[8,3,1,"","to_matpower"],[8,3,1,"","to_pickle"],[8,3,1,"","to_psse"],[8,3,1,"","to_pypowsybl"],[8,3,1,"","to_sqlite"]],"powergrid_synth.core.grid_graph":[[9,1,1,"","DistributionGrid"],[9,1,1,"","PowerGridGraph"],[9,1,1,"","TransmissionGrid"]],"powergrid_synth.core.grid_graph.DistributionGrid":[[9,3,1,"","from_nx"],[9,4,1,"","is_radial"],[9,4,1,"","max_hop"],[9,3,1,"","nodes_at_hop"],[9,3,1,"","nodes_by_type"],[9,4,1,"","root"],[9,4,1,"","total_gen_mw"],[9,4,1,"","total_load_mw"]],"powergrid_synth.core.grid_graph.PowerGridGraph":[[9,3,1,"","level"]],"powergrid_synth.core.grid_graph.TransmissionGrid":[[9,4,1,"","n_levels"],[9,4,1,"","voltage_levels"]],"powergrid_synth.core.hierarchical_analysis":[[10,1,1,"","HierarchicalAnalyzer"]],"powergrid_synth.core.hierarchical_analysis.HierarchicalAnalyzer":[[10,3,1,"","plot_all_levels"],[10,3,1,"","run_full_report"],[10,3,1,"","run_global_analysis"],[10,3,1,"","run_level_analysis"]],"powergrid_synth.core.input_extractor":[[12,5,1,"","extract_topology_params_from_graph"]],"powergrid_synth.core.visualization":[[13,1,1,"","GridVisualizer"],[13,1,1,"","MatplotlibDropdown"]],"powergrid_synth.core.visualization.GridVisualizer":[[13,3,1,"","_create_interactive_window"],[13,3,1,"","_draw_bus_types_on_ax"],[13,3,1,"","_draw_edges_impedance"],[13,3,1,"","_draw_graph_on_ax"],[13,3,1,"","_find_tree_root"],[13,3,1,"","_get_layered_layout"],[13,3,1,"","_get_node_colors"],[13,3,1,"","_hierarchical_tree_layout"],[13,3,1,"","_radial_tree_layout"],[13,3,1,"","_yifan_hu_layout"],[13,3,1,"","plot_bus_types"],[13,3,1,"","plot_grid"],[13,3,1,"","plot_impedance"],[13,3,1,"","plot_interactive"],[13,3,1,"","plot_interactive_bus_types"],[13,3,1,"","plot_interactive_voltage_level"],[13,3,1,"","plot_load_gen_bubbles"],[13,3,1,"","plot_subgraphs"]],"powergrid_synth.deg_dist_optimizer":[[14,1,1,"","DegreeDistributionOptimizer"]],"powergrid_synth.deg_dist_optimizer.DegreeDistributionOptimizer":[[14,3,1,"","_dgln_pdf"],[14,3,1,"","_dpl_pdf"],[14,3,1,"","_objective_func"],[14,3,1,"","optimize"]],"powergrid_synth.distribution":[[21,1,1,"","BetaParams"],[21,1,1,"","CableLibraryEntry"],[21,1,1,"","CurrentThreshold"],[68,1,1,"","DistributionInputModel"],[68,1,1,"","DistributionSynthParams"],[21,1,1,"","ExponentialClip"],[21,1,1,"","ExponentialParams"],[21,1,1,"","FeederInputSample"],[21,1,1,"","MixtureGammaParams"],[21,1,1,"","MixtureNormalParams"],[21,1,1,"","MixturePoissonParams"],[21,1,1,"","ModifiedCauchyParams"],[21,1,1,"","NegBinomParams"],[21,1,1,"","NormalParams"],[21,1,1,"","PowerLawClip"],[68,1,1,"","SchweetzerFeederGenerator"],[21,1,1,"","TLocationScaleParams"],[21,5,1,"","compare_feeders"],[21,5,1,"","compute_emergent_properties"],[15,0,0,"-","distribution_analysis"],[68,0,0,"-","distribution_converter"],[17,0,0,"-","distribution_input_model"],[18,0,0,"-","distribution_params"],[19,0,0,"-","distribution_synthesis"],[20,0,0,"-","distribution_validation"],[21,5,1,"","feeder_summary"],[68,5,1,"","fit_params_from_feeders"],[21,5,1,"","kl_divergence_discrete"],[21,5,1,"","pandapower_to_feeders"],[21,5,1,"","pypowsybl_to_feeders"],[22,0,0,"-","synthesize"],[21,5,1,"","synthesize_distribution"],[21,5,1,"","validate_tree"]],"powergrid_synth.distribution.DistributionInputModel":[[21,3,1,"","_fit_kde"],[68,3,1,"","fit"],[68,3,1,"","fit_from_arrays"],[68,3,1,"","pdf"],[68,3,1,"","sample"]],"powergrid_synth.distribution.DistributionSynthParams":[[68,2,1,"","cable_length"],[68,2,1,"","cable_library"],[68,2,1,"","current_ratio"],[68,2,1,"","current_threshold"],[68,2,1,"","degree_clip"],[68,2,1,"","degree_dist"],[68,2,1,"","hop_dist"],[68,2,1,"","injection_deviation"],[68,2,1,"","injection_frac"],[68,2,1,"","injection_hop"],[68,2,1,"","intermediate_frac"],[68,2,1,"","intermediate_hop"],[68,2,1,"","length_clip"],[68,2,1,"","load_deviation"],[68,2,1,"","pf_cdf"]],"powergrid_synth.distribution.SchweetzerFeederGenerator":[[21,3,1,"","_assign_cable_lengths"],[21,3,1,"","_assign_cable_types"],[21,3,1,"","_assign_injection"],[21,3,1,"","_assign_intermediate"],[21,3,1,"","_assign_load"],[21,3,1,"","_assign_node_properties"],[21,3,1,"","_compute_downstream_power"],[21,3,1,"","_connect_nodes"],[21,3,1,"","_fill_hop_gaps"],[21,3,1,"","_generate_nodes"],[21,3,1,"","_pick_cable_by_capacity"],[68,3,1,"","generate_feeder"]],"powergrid_synth.distribution.distribution_analysis":[[15,5,1,"","_cable_lengths"],[15,5,1,"","_degrees"],[15,5,1,"","_hop_distances"],[15,5,1,"","_injection_fractions"],[15,5,1,"","_intermediate_fractions"],[15,5,1,"","_load_deviations"],[15,5,1,"","fit_beta"],[15,5,1,"","fit_exponential_clip"],[15,5,1,"","fit_mixture_gamma"],[15,5,1,"","fit_modified_cauchy"],[15,5,1,"","fit_neg_binomial"],[15,5,1,"","fit_params_from_feeders"],[15,5,1,"","fit_power_law_clip"],[15,5,1,"","fit_t_location_scale"]],"powergrid_synth.distribution.distribution_converter":[[68,5,1,"","feeder_summary"],[68,5,1,"","pandapower_to_feeders"],[68,5,1,"","pypowsybl_to_feeders"]],"powergrid_synth.distribution.distribution_input_model":[[17,1,1,"","DistributionInputModel"],[17,1,1,"","FeederInputSample"]],"powergrid_synth.distribution.distribution_input_model.DistributionInputModel":[[17,3,1,"","_fit_kde"],[17,3,1,"","fit"],[17,3,1,"","fit_from_arrays"],[17,3,1,"","pdf"],[17,3,1,"","sample"]],"powergrid_synth.distribution.distribution_params":[[18,1,1,"","BetaParams"],[18,1,1,"","CableLibraryEntry"],[18,1,1,"","CurrentThreshold"],[18,1,1,"","DistributionSynthParams"],[18,1,1,"","ExponentialClip"],[18,1,1,"","ExponentialParams"],[18,1,1,"","MixtureGammaParams"],[18,1,1,"","MixtureNormalParams"],[18,1,1,"","MixturePoissonParams"],[18,1,1,"","ModifiedCauchyParams"],[18,1,1,"","NegBinomParams"],[18,1,1,"","NormalParams"],[18,1,1,"","PowerLawClip"],[18,1,1,"","TLocationScaleParams"]],"powergrid_synth.distribution.distribution_synthesis":[[19,1,1,"","SchweetzerFeederGenerator"]],"powergrid_synth.distribution.distribution_synthesis.SchweetzerFeederGenerator":[[19,3,1,"","_assign_cable_lengths"],[19,3,1,"","_assign_cable_types"],[19,3,1,"","_assign_injection"],[19,3,1,"","_assign_intermediate"],[19,3,1,"","_assign_load"],[19,3,1,"","_assign_node_properties"],[19,3,1,"","_compute_downstream_power"],[19,3,1,"","_connect_nodes"],[19,3,1,"","_fill_hop_gaps"],[19,3,1,"","_generate_nodes"],[19,3,1,"","_pick_cable_by_capacity"],[19,3,1,"","generate_feeder"]],"powergrid_synth.distribution.distribution_validation":[[20,5,1,"","compare_feeders"],[20,5,1,"","compute_emergent_properties"],[20,5,1,"","extract_cable_length_distribution"],[20,5,1,"","extract_degree_distribution"],[20,5,1,"","extract_hop_distribution"],[20,5,1,"","extract_load_per_node"],[20,5,1,"","kl_divergence_discrete"],[20,5,1,"","validate_tree"]],"powergrid_synth.distribution.synthesize":[[22,5,1,"","_export_feeders"],[22,5,1,"","_get_pandapower_dist_case"],[22,5,1,"","_is_pypowsybl_network"],[22,5,1,"","_load_reference_feeders"],[22,5,1,"","synthesize_distribution"]],"powergrid_synth.distribution_lines":[[23,1,1,"","DistributionLineAllocator"]],"powergrid_synth.distribution_lines.DistributionLineAllocator":[[23,3,1,"","allocate"]],"powergrid_synth.distribution_topology":[[24,1,1,"","DistributionGridGenerator"],[24,5,1,"","_generate_random_tree"],[24,5,1,"","_generate_tree_from_degree_sequence"],[24,5,1,"","extract_distribution_params"]],"powergrid_synth.distribution_topology.DistributionGridGenerator":[[24,3,1,"","generate_from_params"],[24,3,1,"","generate_from_specs"]],"powergrid_synth.edge_creation":[[25,1,1,"","EdgeCreator"]],"powergrid_synth.edge_creation.EdgeCreator":[[25,3,1,"","generate_edges"]],"powergrid_synth.exporter":[[26,1,1,"","GridExporter"]],"powergrid_synth.exporter.GridExporter":[[26,3,1,"","_get_pandapower_net"],[26,3,1,"","_get_pypowsybl_net"],[26,3,1,"","to_cgmes"],[26,3,1,"","to_excel"],[26,3,1,"","to_json"],[26,3,1,"","to_matpower"],[26,3,1,"","to_pickle"],[26,3,1,"","to_psse"],[26,3,1,"","to_pypowsybl"],[26,3,1,"","to_sqlite"]],"powergrid_synth.generation_dispatcher":[[27,1,1,"","GenerationDispatcher"]],"powergrid_synth.generation_dispatcher.GenerationDispatcher":[[27,3,1,"","_assign_alphas"],[27,3,1,"","_generate_alphas"],[27,3,1,"","_select_committed"],[27,3,1,"","_select_uncommitted"],[27,2,1,"","alpha_mod"],[27,3,1,"","dispatch"],[27,2,1,"","mu_committed"],[27,2,1,"","tab_2d_pg"]],"powergrid_synth.generator":[[28,1,1,"","PowerGridGenerator"]],"powergrid_synth.generator.PowerGridGenerator":[[28,3,1,"","_generate_subgraphs"],[28,3,1,"","_generate_transformer_connections"],[28,3,1,"","generate_grid"]],"powergrid_synth.grid_graph":[[29,1,1,"","PowerGridGraph"]],"powergrid_synth.grid_graph.PowerGridGraph":[[29,3,1,"","level"]],"powergrid_synth.hierarchical_analysis":[[30,1,1,"","HierarchicalAnalyzer"]],"powergrid_synth.hierarchical_analysis.HierarchicalAnalyzer":[[30,3,1,"","plot_all_levels"],[30,3,1,"","run_full_report"],[30,3,1,"","run_global_analysis"],[30,3,1,"","run_level_analysis"]],"powergrid_synth.input_configurator":[[32,1,1,"","InputConfigurator"]],"powergrid_synth.input_configurator.InputConfigurator":[[32,3,1,"","_generate_optimized_degrees"],[32,3,1,"","_generate_poisson_degrees"],[32,3,1,"","_generate_transformer_simple"],[32,3,1,"","_generate_transformer_stars"],[32,3,1,"","create_params"]],"powergrid_synth.input_extractor":[[33,5,1,"","extract_topology_params_from_graph"]],"powergrid_synth.preprocessing":[[34,1,1,"","Preprocessor"]],"powergrid_synth.preprocessing.Preprocessor":[[34,3,1,"","assign_boxes"],[34,3,1,"","run_setup"]],"powergrid_synth.synthesize":[[35,5,1,"","synthesize"]],"powergrid_synth.transformer_edges":[[36,1,1,"","TransformerConnector"]],"powergrid_synth.transformer_edges.TransformerConnector":[[36,3,1,"","generate_transformer_edges"]],"powergrid_synth.transmission":[[43,1,1,"","BusTypeAllocator"],[43,1,1,"","CapacityAllocator"],[43,1,1,"","GenerationDispatcher"],[43,1,1,"","InputConfigurator"],[43,1,1,"","LoadAllocator"],[43,1,1,"","PowerGridGenerator"],[43,1,1,"","TransmissionLineAllocator"],[37,0,0,"-","bus_type_allocator"],[38,0,0,"-","capacity_allocator"],[39,0,0,"-","deg_dist_optimizer"],[40,0,0,"-","edge_creation"],[41,0,0,"-","generation_dispatcher"],[42,0,0,"-","generator"],[44,0,0,"-","input_configurator"],[45,0,0,"-","preprocessing"],[46,0,0,"-","synthesize"],[47,0,0,"-","transformer_edges"],[48,0,0,"-","transmission"]],"powergrid_synth.transmission.BusTypeAllocator":[[43,3,1,"","_calculate_bus_ratios"],[43,3,1,"","_calculate_entropy_score"],[43,3,1,"","_calculate_link_ratios"],[43,3,1,"","_estimate_w_star"],[43,3,1,"","_generate_random_assignment"],[43,3,1,"","_get_d_parameter"],[43,3,1,"","_get_ratios"],[43,3,1,"","_normalize_ratio"],[43,3,1,"","allocate"],[43,3,1,"","plot_entropy_pdf"]],"powergrid_synth.transmission.CapacityAllocator":[[43,3,1,"","_assignment_logic"],[43,3,1,"","_generate_heuristic_tab_2d"],[43,3,1,"","_get_default_tab_2d"],[43,3,1,"","_initial_generation_distribution"],[43,3,1,"","allocate"]],"powergrid_synth.transmission.GenerationDispatcher":[[43,3,1,"","_assign_alphas"],[43,3,1,"","_generate_alphas"],[43,3,1,"","_select_committed"],[43,3,1,"","_select_uncommitted"],[43,2,1,"","alpha_mod"],[43,3,1,"","dispatch"],[43,2,1,"","mu_committed"],[43,2,1,"","tab_2d_pg"]],"powergrid_synth.transmission.InputConfigurator":[[43,3,1,"","_generate_optimized_degrees"],[43,3,1,"","_generate_poisson_degrees"],[43,3,1,"","_generate_transformer_simple"],[43,3,1,"","_generate_transformer_stars"],[43,3,1,"","create_params"]],"powergrid_synth.transmission.LoadAllocator":[[43,3,1,"","_assignment_logic"],[43,3,1,"","_calculate_total_load"],[43,3,1,"","_get_tab_2d_load"],[43,3,1,"","_initial_load_distribution"],[43,3,1,"","allocate"],[43,3,1,"","allocate_reactive"]],"powergrid_synth.transmission.PowerGridGenerator":[[43,3,1,"","_generate_subgraphs"],[43,3,1,"","_generate_transformer_connections"],[43,3,1,"","generate_grid"]],"powergrid_synth.transmission.TransmissionLineAllocator":[[43,3,1,"","_assign_betas"],[43,3,1,"","_generate_beta"],[43,3,1,"","_generate_phi"],[43,3,1,"","_refine_topology"],[43,3,1,"","allocate"],[43,2,1,"","mu_beta"],[43,2,1,"","overload_b"],[43,2,1,"","stab_params"],[43,2,1,"","tab_fl_beta"]],"powergrid_synth.transmission.bus_type_allocator":[[37,1,1,"","BusTypeAllocator"]],"powergrid_synth.transmission.bus_type_allocator.BusTypeAllocator":[[37,3,1,"","_calculate_bus_ratios"],[37,3,1,"","_calculate_entropy_score"],[37,3,1,"","_calculate_link_ratios"],[37,3,1,"","_estimate_w_star"],[37,3,1,"","_generate_random_assignment"],[37,3,1,"","_get_d_parameter"],[37,3,1,"","_get_ratios"],[37,3,1,"","_normalize_ratio"],[37,3,1,"","allocate"],[37,3,1,"","plot_entropy_pdf"]],"powergrid_synth.transmission.capacity_allocator":[[38,1,1,"","CapacityAllocator"]],"powergrid_synth.transmission.capacity_allocator.CapacityAllocator":[[38,3,1,"","_assignment_logic"],[38,3,1,"","_generate_heuristic_tab_2d"],[38,3,1,"","_get_default_tab_2d"],[38,3,1,"","_initial_generation_distribution"],[38,3,1,"","allocate"]],"powergrid_synth.transmission.deg_dist_optimizer":[[39,1,1,"","DegreeDistributionOptimizer"]],"powergrid_synth.transmission.deg_dist_optimizer.DegreeDistributionOptimizer":[[39,3,1,"","_dgln_pdf"],[39,3,1,"","_dpl_pdf"],[39,3,1,"","_objective_func"],[39,3,1,"","optimize"]],"powergrid_synth.transmission.edge_creation":[[40,1,1,"","EdgeCreator"]],"powergrid_synth.transmission.edge_creation.EdgeCreator":[[40,3,1,"","generate_edges"]],"powergrid_synth.transmission.generation_dispatcher":[[41,1,1,"","GenerationDispatcher"]],"powergrid_synth.transmission.generation_dispatcher.GenerationDispatcher":[[41,3,1,"","_assign_alphas"],[41,3,1,"","_generate_alphas"],[41,3,1,"","_select_committed"],[41,3,1,"","_select_uncommitted"],[41,2,1,"","alpha_mod"],[41,3,1,"","dispatch"],[41,2,1,"","mu_committed"],[41,2,1,"","tab_2d_pg"]],"powergrid_synth.transmission.generator":[[42,1,1,"","PowerGridGenerator"]],"powergrid_synth.transmission.generator.PowerGridGenerator":[[42,3,1,"","_generate_subgraphs"],[42,3,1,"","_generate_transformer_connections"],[42,3,1,"","generate_grid"]],"powergrid_synth.transmission.input_configurator":[[44,1,1,"","InputConfigurator"]],"powergrid_synth.transmission.input_configurator.InputConfigurator":[[44,3,1,"","_generate_optimized_degrees"],[44,3,1,"","_generate_poisson_degrees"],[44,3,1,"","_generate_transformer_simple"],[44,3,1,"","_generate_transformer_stars"],[44,3,1,"","create_params"]],"powergrid_synth.transmission.preprocessing":[[45,1,1,"","Preprocessor"]],"powergrid_synth.transmission.preprocessing.Preprocessor":[[45,3,1,"","assign_boxes"],[45,3,1,"","run_setup"]],"powergrid_synth.transmission.synthesize":[[46,5,1,"","_get_pypowsybl_builtins"],[46,5,1,"","_is_pypowsybl_network"],[46,5,1,"","_load_reference"],[46,5,1,"","synthesize"]],"powergrid_synth.transmission.transformer_edges":[[47,1,1,"","TransformerConnector"]],"powergrid_synth.transmission.transformer_edges.TransformerConnector":[[47,3,1,"","generate_transformer_edges"]],"powergrid_synth.transmission.transmission":[[48,1,1,"","TransmissionLineAllocator"]],"powergrid_synth.transmission.transmission.TransmissionLineAllocator":[[48,3,1,"","_assign_betas"],[48,3,1,"","_generate_beta"],[48,3,1,"","_generate_phi"],[48,3,1,"","_refine_topology"],[48,3,1,"","allocate"],[48,2,1,"","mu_beta"],[48,2,1,"","overload_b"],[48,2,1,"","stab_params"],[48,2,1,"","tab_fl_beta"]],"powergrid_synth.visualization":[[49,1,1,"","GridVisualizer"],[49,1,1,"","MatplotlibDropdown"]],"powergrid_synth.visualization.GridVisualizer":[[49,3,1,"","_create_interactive_window"],[49,3,1,"","_draw_bus_types_on_ax"],[49,3,1,"","_draw_edges_impedance"],[49,3,1,"","_draw_graph_on_ax"],[49,3,1,"","_find_tree_root"],[49,3,1,"","_get_layered_layout"],[49,3,1,"","_get_node_colors"],[49,3,1,"","_hierarchical_tree_layout"],[49,3,1,"","_radial_tree_layout"],[49,3,1,"","_yifan_hu_layout"],[49,3,1,"","plot_bus_types"],[49,3,1,"","plot_grid"],[49,3,1,"","plot_impedance"],[49,3,1,"","plot_interactive"],[49,3,1,"","plot_interactive_bus_types"],[49,3,1,"","plot_interactive_voltage_level"],[49,3,1,"","plot_load_gen_bubbles"],[49,3,1,"","plot_subgraphs"]]},"objnames":{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","property","Python property"],"5":["py","function","Python function"]},"objtypes":{"0":"py:module","1":"py:class","2":"py:attribute","3":"py:method","4":"py:property","5":"py:function"},"terms":{"0f":[52,57],"10s":53,"12d":54,"12s":[54,60],"14x14":[4,31,38,43,68],"18s":54,"1e":[14,39],"1f":[60,61],"2199471533544965e":57,"254568367989918e":61,"25s":[53,54],"2d":[4,31,38,43,68,74],"2f":[52,53,55,56,57,58,59,61],"2m":76,"30s":[53,54],"35s":54,"3f":[53,54,55],"4d":60,"4f":[53,54,55],"640x480":61,"6815795001050204e":61,"999999999999999e":59,"A":[2,3,4,6,9,10,11,13,16,17,18,21,22,24,25,27,29,30,31,34,35,36,37,38,40,41,43,45,46,47,48,49,50,52,54,68,69,70,72,73,74,76],"About":[4,31,38,43,73],"After":[62,73,74],"All":[9,11,18,19,21,31,55,60,61,68,72,73],"An":[4,38,72,73,76],"As":[61,73],"Both":76,"By":[70,73],"EACH":62,"Each":[3,11,16,17,21,31,32,34,35,37,43,44,45,46,64,68,72,74,76],"FOR":[51,56,62],"For":[0,3,28,31,32,37,42,43,44,57,58,60,62,67,68,69,72,73,74,76],"From":[61,70,73,74],"Here":[59,62,64,70,75,76],"I":[0,11,12,22,24,27,31,33,35,41,43,46,62,67,68],"If":[2,3,4,5,6,7,8,10,11,14,21,22,24,26,28,30,31,35,37,38,39,42,43,46,48,68,69,73,74,76],"In":[24,31,43,50,51,55,56,59,62,70,72,73,74,76],"Is":[52,53,54],"It":[2,6,8,10,11,16,21,26,27,30,31,41,62,67,68,72,76],"Its":73,"More":[31,43,69,73,74],"NOT":[5,7,11,31,68],"No":[51,52,56,57,58,62],"Off":73,"On":[4,31,38,43,50,68,74],"Out":[31,43,48],"Same":76,"The":[0,2,3,4,6,8,9,11,12,13,14,16,17,18,21,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,51,52,54,55,57,60,61,62,64,66,67,68,69,72,73,74],"Their":73,"Then":[31,43,48,62,68,74,76],"There":[51,61,70,73],"These":[70,72,73,74,76],"They":[20,21,62,70],"This":[1,2,4,5,6,7,8,9,10,11,12,14,16,21,22,26,27,29,30,31,32,33,35,36,38,39,41,43,44,46,47,48,52,55,57,58,61,62,67,68,69,70,72,73,74,76],"To":[72,73,74,76],"We":[28,31,42,43,51,52,54,55,56,61,62,64,65,74,76],"What":74,"When":[4,27,31,38,41,43,62,68,72,73],"With":[3,31,37,43,68,70,72],"_":[11,14,27,31,39,41,43,52,53,54,59,60,61,62,68,73,74],"_9":[31,43,68],"_assign_alpha":[27,31,41,43],"_assign_beta":[31,43,48,68],"_assign_cable_length":[19,21],"_assign_cable_typ":[19,21],"_assign_inject":[19,21],"_assign_intermedi":[19,21],"_assign_load":[19,21],"_assign_node_properti":[19,21],"_assignment_log":[4,31,38,43],"_bound":[14,39],"_cable_length":15,"_calculate_bus_ratio":[3,31,37,43],"_calculate_entropy_scor":[3,31,37,43],"_calculate_link_ratio":[3,31,37,43],"_calculate_total_load":[31,43],"_compute_downstream_pow":[19,21],"_connect_nod":[19,21],"_continuous_distn":55,"_create_interactive_window":[11,13,31,49],"_degre":15,"_dgln_pdf":[14,39],"_dpl_pdf":[14,39],"_draw_bus_types_on_ax":[11,13,31,49],"_draw_edges_imped":[11,13,31,49],"_draw_graph_on_ax":[11,13,31,49],"_estimate_w_star":[3,31,37,43,68],"_export_feed":22,"_fill_hop_gap":[19,21],"_find_tree_root":[11,13,31,49],"_fit_kd":[17,21],"_g":74,"_generate_alpha":[27,31,41,43],"_generate_beta":[31,43,48,68],"_generate_heuristic_tab_2d":[4,31,38,43],"_generate_nod":[19,21],"_generate_optimized_degre":[31,32,43,44],"_generate_phi":[31,43,48],"_generate_poisson_degre":[31,32,43,44],"_generate_random_assign":[3,31,37,43],"_generate_random_tre":24,"_generate_subgraph":[28,31,42,43],"_generate_transformer_connect":[28,31,42,43],"_generate_transformer_simpl":[31,32,43,44],"_generate_transformer_star":[31,32,43,44],"_generate_tree_from_degree_sequ":24,"_get_comparison_data":[5,7,11,31],"_get_d_paramet":[3,31,37,43],"_get_default_tab_2d":[4,31,38,43],"_get_layered_layout":[11,13,31,49],"_get_node_color":[11,13,31,49,54],"_get_pandapower_dist_cas":22,"_get_pandapower_net":[8,26],"_get_pypowsybl_builtin":46,"_get_pypowsybl_net":[8,26],"_get_ratio":[3,31,37,43],"_get_tab_2d_load":[31,43],"_hierarchical_tree_layout":[11,13,31,49,54],"_hop_dist":15,"_i":[36,47,70,76],"_igeq":76,"_initial_generation_distribut":[4,31,38,43],"_initial_load_distribut":[31,43],"_injection_fract":15,"_intermediate_fract":15,"_is_pypowsybl_network":[22,46],"_j":[36,47,76],"_l":[31,43,48,73,74],"_load_devi":15,"_load_refer":46,"_load_reference_feed":22,"_n":74,"_normalize_ratio":[3,31,37,43],"_objective_func":[14,39],"_pick_cable_by_capac":[19,21],"_radial_tree_layout":[11,13,31,49,54],"_refine_topolog":[31,43,48,68],"_select_commit":[27,31,41,43],"_select_uncommit":[27,31,41,43],"_yifan_hu_layout":[11,13,31,49],"a_":73,"a_1":72,"a_2":72,"a_n":73,"a_postdoc":[55,60],"ab":[4,38],"abov":[4,19,21,31,38,43,55,72,74],"absent":72,"absolut":[20,21,70],"ac":[0,55,57,58,60,61,67],"access":[9,29,54,72],"accord":[4,31,38,43,74],"account":[74,76],"achiev":[70,76],"acknowledg":72,"across":[0,3,9,11,19,21,25,31,32,36,37,40,43,44,47,54,57,67,68,70,72,73,76],"act":[12,33,73],"activ":[0,13,27,31,32,41,43,44,49,56,57,67,68,73,74,77],"active_load":[31,43,68],"active_power_mismatch":[57,58,59],"actual":[3,28,31,37,42,43,57,62,68,69,72,73,74,76],"actual_degre":62,"adam":[50,76],"adapt":76,"add":[9,11,28,31,35,42,43,46,48,55,60,68,69,73],"addit":[4,27,31,34,38,41,43,45,68,72,76],"address":[73,76],"adjust":[4,27,31,34,38,41,43,45,68,72,73,74,76],"admitt":[73,74],"advantag":[70,72],"aest":55,"affin":69,"aggreat":74,"aggreg":[4,20,21,31,38,43,52,68,72,73,74,76],"ai":[0,3,31,37,43,57,58,67,68,70],"aksoy":[25,28,31,32,34,36,40,42,43,44,45,47,50,62,68,76],"al":[4,9,11,14,17,18,19,20,21,22,24,25,27,28,31,32,34,36,38,39,40,41,42,43,44,45,47,48,51,52,54,55,62,67,68,71,72,73,74,76],"algorithm":[0,3,4,13,18,19,24,25,27,28,31,34,36,37,38,40,41,42,43,45,47,48,49,50,52,53,55,62,64,67,68,69,71],"ali":[50,76],"align":57,"all_edg":[28,31,42,43],"all_k":62,"all_kl":[54,55],"all_typ":[54,55],"alloc":[0,3,4,23,31,35,37,38,43,46,48,51,56,57,58,59,60,61,67,68,70,76,77],"allocate_react":[31,43,68,74],"allow":[11,13,24,31,49,60,68,70,72,76],"almost":[36,47,76],"alon":72,"along":[18,72,74,76],"alpha":[11,13,14,27,31,39,41,43,49,52,53,54,55,56,57,62,68,72,76],"alpha_":[31,43,48,68,73],"alpha_g":73,"alpha_i":[27,31,41,43,68,73],"alpha_mod":[27,31,41,43,68,73],"alpha_n":73,"alreadi":[4,31,38,43,68],"also":[5,7,51,52,54,64,68,72,73,74,76],"altern":[25,40,76],"alway":[52,57,58,72],"among":[51,73],"amp":[51,56,57,58,59,61],"ampl":[0,8,26,57,58,67,68],"amplifi":70,"analog":[4,24,31,38,43,68,72,73,74],"analyes":74,"analysi":[1,10,11,15,30,31,51,55,56,62,67,73],"analyz":[2,6,11,24,31,57,58,70,74],"andrea":[50,71,72],"angl":[0,11,31,43,48,55,59,61,67,68,74],"ani":[2,6,9,11,13,21,22,27,31,35,36,41,43,46,47,55,60,61,68,72,76],"anna":[50,71,72,76],"annot":[9,11,15,16,19,21,22,31,68],"annual":73,"anoth":[5,7],"antibodi":69,"antonello":[50,71,72],"apcsh19":76,"appar":[8,19,21,26,68,72],"appear":24,"append":[52,53,54,55,62],"appendix":[25,34,40,45],"appli":[36,47,52,72,73,76],"applic":72,"approach":[3,4,24,31,37,38,43,52,68,69,72,73,74],"appropri":62,"approx":[27,31,32,41,43,44,68,73,76],"approx4":76,"approxim":[62,70,73,74,76],"arang":[52,54,55,62],"arbitrari":52,"arcco":[31,43,68,74],"arctan":72,"arg":68,"argu":48,"argument":[21,22,35,46,68,72],"aris":61,"around":[72,76],"array":[3,4,14,17,20,21,27,31,37,38,39,41,43,52,68,70],"artifici":[3,31,37,43,62,67,68,70],"arxiv":[4,25,28,31,34,36,38,40,43,45,47,50,68,74,76],"ascend":[11,12,31,33,43,48,68,69,72,73,74],"aspect":52,"assert":61,"assess":[50,72,76],"assign":[0,3,4,11,13,18,19,21,22,23,27,31,32,34,35,37,38,41,43,44,45,46,48,49,50,52,59,60,61,64,66,67,69,75,76,77],"assign_box":[34,45],"assign_cable_length":[19,21,22,52,68],"assign_cable_typ":[19,21,22,52,68],"assist":[32,44],"associ":[23,48,76],"assort":76,"assumpt":[62,72],"astyp":62,"athari":[50,76],"attach":[24,56,57,76],"attempt":72,"attr":[9,11,19,21,29,31],"attribut":[3,4,9,11,12,13,15,16,17,19,21,23,24,27,28,31,33,37,38,41,42,43,48,49,51,52,55,56,57,61,68,74],"atyp":76,"author":[51,70,72,74,76],"auto":[1,68],"autoapi":1,"autom":[24,50,71],"automat":[72,74],"avail":[4,8,26,31,34,38,43,45,64,68],"ave_k":[14,32,39,44],"averag":[0,2,6,11,14,31,32,35,39,43,44,46,52,54,57,58,60,68,70,72,76],"avg":[5,7,11,31,32,44,51,52,54,55,56,57,58,60,62,64,68],"avg_cap":[57,58],"avg_degre":[31,32,43,44,52],"avg_k":[0,31,32,35,43,44,46,52,60,62,64,67,68],"avg_k_d":52,"avg_k_ref":52,"avgdist":76,"avoid":[3,31,37,43,68,73],"ax":[2,5,6,7,11,13,31,49,52,54,57,62,68],"axe":[2,6,7,11,31,52,53,54,55,61,62,68],"axi":[5,7,11,13,31,49,52,54,62,68],"b":[11,15,18,21,50,55,57,61,62,72,73,74,76],"b_":[11,73],"b_1":72,"b_2":72,"back":[15,27,31,41,43,53,61,68,72,74],"backbon":[0,60,64],"backend":68,"badg":64,"balanc":[0,27,31,41,43,67,68],"band":[11,13,31,49,74],"bandwidth":[17,21,68],"bar":[5,7,11,14,27,31,32,39,41,43,44,48,52,53,54,55,62,68,73,74,76],"base":[0,2,3,4,6,8,9,11,13,14,21,22,23,26,28,29,31,35,37,38,39,42,43,46,48,49,50,51,55,56,57,58,62,67,68,69,72,74,76,77],"base_kv_list":[57,58,59,61],"base_kv_map":[8,26,35,46,55,57,58,59,60,61,68],"base_mva":[8,26,68],"basi":72,"basic":15,"bbox_transform":[11,13,31,49],"becaus":[69,70],"becom":[27,28,31,41,42,43,74],"befor":[27,31,41,43,48,69,73],"begin":[3,31,37,43,70,74],"behavior":72,"behind":[74,75],"bell":52,"belong":74,"benchmark":55,"best":[3,11,13,31,37,43,49,51,56,57,58,59,60,61,68,69,70],"best_error":[3,31,37,43,68],"best_param":[14,39],"besterror":69,"bestsolut":69,"beta":[3,14,15,18,21,31,37,39,43,48,68,69,72,73,76],"beta_":[31,43,48,68,73],"beta_l":[31,43,48,68,73],"betaparam":[15,18,21,68],"better":[3,14,31,37,39,43,68,69,70],"betweenness":72,"beyond":74,"bfs":[11,13,31,49,52,72],"bfs_depth":52,"bias":[4,24,31,38,43,68],"big":[14,34,39,45,74,76],"bigg":[14,39,76],"biidm":[0,8,26,55,57,58,61,67,68],"biject":24,"bimod":[19,21,52,72],"bin":[0,4,20,21,27,31,38,41,43,48,52,53,54,55,56,57,67,68,73,74,76],"bin_edg":20,"binari":[31,32,43,44],"binomi":[15,18,19,21,52,55,72],"bins_d":[52,54],"bins_h":54,"bipartit":[36,47,76],"bipartiti":76,"birchfield":[50,76],"black":[53,54,56,57],"block":[50,76],"blue":[11,13,31,49,57,62,68],"boldsymbol":[11,73],"book":[31,43,68],"book_2_9":[31,43,68],"bool":[6,7,8,9,10,11,13,14,19,21,22,24,28,31,35,39,42,43,46,48,49,68],"bottleneck":[31,43,48],"bottom":[19,52,72],"bound":[14,39,72],"boundari":74,"box":[0,25,34,40,45,57,58,76],"box_id":[34,45],"branch":[0,11,23,31,43,48,70,71,72,74],"breadth":72,"break":69,"breakdown":[53,55,59,60,61],"brentq":55,"bridg":72,"brief":[31,43,64],"browser":64,"bsa":76,"bt":60,"bt_count":[59,61],"bubbl":[11,13,31,49,57,68],"build":[8,11,16,21,26,35,36,46,47,52,55,60,67,68,70,76],"built":[0,8,21,22,26,35,46,52,55,58,60,61,67,68,72],"bump":72,"bundl":[18,61],"bus":[0,3,5,7,11,13,16,21,27,31,35,37,41,43,46,48,49,50,52,54,55,59,61,64,66,67,68,72,73,74,75,76,77],"bus_id":[27,31,41,43],"bus_ratio":[3,31,37,43],"bus_typ":[4,27,31,38,41,43,51,57,58,59,60,61,68],"bus_type_alloc":[0,1,43,69,70],"bus_type_ratio":[3,31,35,37,43,46,57,58,60,68],"busbar":[59,72],"buse":[0,3,4,16,19,21,24,27,31,37,38,41,43,52,54,55,56,57,58,59,60,61,68,69,70,73,74,76],"bustyp":69,"bustypealloc":[0,3,4,31,37,38,43,51,56,57,58,59,61,67,68,69],"bustypeassign":[56,60],"button":[13,49],"bw_method":[17,21,68],"bxg":76,"byte":[55,61],"bz2":59,"c":[0,4,31,32,35,38,43,44,46,50,52,60,62,64,67,68,69,70,73,74,76],"c424":[50,76],"c452":[50,76],"c_act":62,"c_pre":62,"c_t":70,"cabl":[0,9,11,15,16,18,19,20,21,22,31,52,53,54,67,68,71],"cable_length":[53,54,68],"cable_length_kl":[53,54,55],"cable_librari":68,"cable_typ":[19,21,68],"cablelibraryentri":[18,19,21,68],"calcul":[2,6,11,51,52,53,54,55,56,57,60,61,62,68,69,70,73,74],"calibr":[23,72],"california":72,"call":[0,3,31,32,37,43,44,51,55,57,60,62,64,66,67,68,70,74,76],"calss":[32,44],"can":[2,6,10,11,30,31,34,45,52,55,56,60,61,62,67,70,71,72,73,74,76],"candid":69,"cap":[56,57,58,73],"cap_alloc":[56,57,58],"capac":[0,4,11,13,23,27,31,38,41,43,48,49,50,59,60,61,67,68,75,76,77],"capacit":72,"capacitor":72,"capacity_alloc":[0,1,43,74],"capacity_mva":23,"capacityalloc":[0,4,31,38,43,56,57,58,59,61,67,68],"capcac":74,"captur":[4,16,21,27,31,38,41,43,57,68,70,72,73,74,76],"carlo":[3,31,37,43,68,69,72],"carri":[68,73],"case":[3,31,37,43,46,57,60,61,62,68,70,72,74,76],"case118":[0,35,46,57,60,67,68],"case300":60,"case300_clon":60,"case9241pegas":58,"case_d":[57,58],"case_ieee30":60,"catalogu":0,"categori":[0,67],"cauchi":[0,15,18,19,21,72],"cc":[3,31,37,43,69,70],"cd":0,"cdf":[19,46,55,61,68,72],"cdot":[3,23,27,31,32,37,41,43,44,68,69,70,72,73,74,76],"cell":[4,31,38,43,57,73,74],"center":[11,13,31,36,47,49,72,76],"centr":[31,32,34,36,43,44,45,47],"central":[70,72],"centric":72,"cfg":52,"cfg_d":52,"cfg_lv":52,"cgmes":[0,8,16,21,22,26,35,46,57,58,59,60,64,67,68,72],"cgmes_dir":[55,59,61],"cgmes_fil":[55,61],"cgmes_out":61,"chain":[25,28,34,40,42,45,51,52,62,67,74,77],"chanc":52,"chang":72,"chapter":74,"character":51,"characterist":[50,51,52,59,61,72,74,76],"check":[20,21,22,46,56,57,58,69,73],"children":[11,13,31,49],"choic":[25,40,72],"choos":76,"chosen":[3,11,27,31,35,37,41,43,46,68,76],"chung":[25,28,34,36,40,42,45,47,51,52,62,67,74,77],"chung_lu_chain":0,"cigr":[55,64],"cigre_lv":[0,21,22,55,67,68],"cigre_lv_cgm":55,"cigre_lv_cgmes_eq":55,"cigre_lv_cgmes_ssh":55,"cigre_lv_cgmes_sv":55,"cigre_lv_cgmes_tp":55,"cigre_lv_onelin":55,"cigre_lv_oneliner_0":55,"cigre_lv_oneliner_1":55,"cigre_lv_oneliner_2":55,"cigre_lv_oneliner_3":55,"cigre_lv_oneliner_4":55,"cigre_mv":[21,22,68],"circl":[11,13,31,49,68],"circuit":[50,71,72],"class":[2,3,4,5,6,7,8,9,10,11,13,14,17,18,19,21,23,24,25,26,27,28,29,30,31,32,34,36,37,38,39,40,41,42,43,44,45,47,48,49,57,58,72,73,74],"classifi":[3,31,37,43,72],"classmethod":[9,11,31,68],"clc":[0,11,12,24,25,28,31,33,34,35,40,42,43,45,46,60,61,63,67,68,77],"clc_stat":52,"clc_synthes":[55,60],"clcstar":[28,31,42,43,68],"clear":72,"click":64,"clip":[15,18,19,21,31,43,48,52,55,68,73],"clonal":[3,31,37,43,68,69],"clone":[0,3,24,31,35,37,43,46,57,58,60,61,67,68,69],"clonepool":69,"close":[16,21,52,57,68,72,73,76],"closer":69,"closest":[19,21,27,31,41,43,72,73],"clt":70,"cluster":[0,2,3,5,6,7,11,31,37,43,51,52,54,56,57,58,62,68,70,72,76],"cns":72,"cnt":60,"code":[0,73],"coeff":[51,56,62],"coeffici":[2,3,6,11,31,32,37,43,44,68,70,72,73,74,76],"col":54,"colab":64,"collect":[15,17,21,27,31,41,43,51,53,54,55,56,57,58,59,60,61,62,68,69],"color":[11,13,31,49,52,53,54,56,57,62,68],"column":[4,5,7,11,27,31,38,41,43,57,68,73,74],"com":0,"combin":[3,13,14,17,28,31,37,39,42,43,49,51,56,57,60,62,68],"combinedpool":69,"come":[58,76],"commit":[27,31,41,43,67,68,76],"common":[5,7,8,11,26,31,55,61,68],"communiti":[50,76],"comp":52,"comp_clc":52,"comp_clc2":52,"comp_sw":52,"comp_sw2":52,"companion":72,"compar":[5,7,11,20,21,31,52,55,58,59,61,62,68,70,72,73,76],"compare_degree_distribut":[5,7,11,31,57,58,59,61,68,76],"compare_feed":[20,21,53,54,55],"comparison":[0,1,11,20,31,51,56,58,59,62,68],"compat":[68,72],"compit":59,"complementari":76,"complet":[19,21,35,46,51,52,55,56,57,58,59,60,61,62,68,72],"complex":[50,72,76],"compon":[11,12,13,15,16,21,23,24,28,31,33,35,42,43,46,48,49,51,52,55,56,57,58,59,60,61,62,68,73],"componentresult":[57,58,59],"comprehens":[2,6,11],"compress":[19,21],"comput":[0,3,4,5,7,11,14,19,20,21,23,31,37,38,39,43,48,50,52,55,62,68,69,70,72,73,74,76],"compute_emergent_properti":[20,21,52,53,54,55],"concentr":[11,13,31,49],"concept":52,"conclus":52,"condit":[36,47,72,76],"conductor":[23,72,73],"config":[0,31,32,43,44,64,67,68],"configur":[0,11,12,18,31,32,33,43,44,51,52,53,56,64,67,68],"conjug":72,"conn":[3,31,35,37,43,46,51,57,58,59,60,61,68,69],"connect":[0,3,9,11,12,16,19,21,24,25,28,31,32,33,35,37,40,42,43,44,46,48,51,52,53,54,56,57,58,59,60,61,64,67,68,69,70,73,74,76,77],"connected_compon":52,"connected_component_num":[55,57,58,59,61],"connection_spec":[0,32,35,44,46,52,60,62,64,67,68],"connector":[51,56,57,58],"consecut":[34,45,76],"consequ":72,"consid":[62,70,72,73,74,76],"consider":73,"consist":[31,32,36,43,44,47,52,68,70,72,73,74,76],"constant":70,"constitut":72,"constrain":[52,72],"constraint":[0,24,69,72,73,74,76],"construct":[24,72],"consum":[36,47],"contain":[1,2,3,6,9,11,13,29,31,37,43,49,59,60,62,64,68,72,76],"context":74,"contextlib":52,"contigu":[19,21,28,31,42,43,68],"control":[0,60,64,66,67,72,76],"conveni":[5,7,9,10,11,30,31,54,68,72],"convent":[61,72],"converg":[3,31,35,37,43,46,48,51,55,56,57,58,59,60,61,68,69,70],"convers":[0,16,55,61,67,72],"convert":[0,8,16,21,26,27,28,31,41,42,43,52,57,59,60,67,69,72,74],"cookbook":0,"coordin":[17,21,57,68],"copi":[9,11,31,52,68,69],"coral":[53,54],"core":[0,1,31,52,55,60,72],"correct":[52,72],"correl":[0,3,4,27,31,37,38,41,43,48,50,51,67,68,69,70,74,76],"correspond":[58,70,73,74],"cos":[31,43,48,53,68,72,73],"cotilla":[50,76],"count":[0,2,3,4,6,11,20,21,27,28,31,32,35,37,38,41,42,43,44,46,51,52,55,56,57,58,60,61,64,69,73,74],"counter":[51,53,54,55,56,57,58,59,60,61,62],"counterpart":[16,21,68],"covari":[17,21],"cover":[67,72],"creat":[0,1,2,5,6,7,9,11,13,19,21,25,29,31,35,36,40,46,47,49,52,53,55,61,62,68,69,70,74],"create_cigre_network_lv":[52,54,55],"create_cigre_network_mv":52,"create_ext_grid":55,"create_ieee118":61,"create_kerber_dorfnetz":52,"create_kerber_landnetz_freileitung_1":52,"create_kerber_vorstadtnetz_kabel_1":52,"create_nxgraph":57,"create_param":[0,31,32,43,44,52,62,64,67,68],"creation":[0,25,40,68],"criteria":[50,51,56,57,60,61,69,70,76],"cumul":[28,31,42,43,57,72,76],"cup":69,"current":[14,18,19,21,22,39,68,73],"current_global_offset":[28,31,42,43],"current_ratio":68,"current_threshold":68,"currentthreshold":[18,21,68],"curv":69,"custom":[4,5,7,9,11,13,21,22,29,31,35,38,43,46,49,55,64,68],"cv":76,"cycl":[25,40,52,61,72,76],"d":[0,3,14,17,21,25,27,28,31,32,34,35,37,39,40,41,42,43,44,45,46,48,52,53,54,55,59,60,61,62,67,68,69,70,72,74,76],"d_":[14,31,32,39,43,44,68,72,76],"d_0":[3,31,37,43,70],"d_1":[3,31,37,43,70,76],"d_2":76,"d_h":76,"d_i":[34,45,76],"d_j":76,"d_k":76,"d_kl":[20,21],"d_n":76,"d_prime":[25,34,40,45],"daniel":[50,76],"darkorang":52,"dashboard":0,"data":[0,4,5,7,15,17,21,31,38,43,52,56,60,61,62,68,72,73,74,76],"data_format_convert":[0,67],"databas":[8,26,68],"dataclass":[0,18],"datafram":[5,7,11,31,62,68],"dataset":[59,72],"dc":[0,11,55,57,58,59,60,61,67],"dcpf":[0,11,23,31,35,43,46,48,60,67,68],"dcpowerflow":[0,11,67],"decay":[4,31,38,43,72],"decid":62,"decod":24,"decompos":76,"decreas":[72,76],"decrement":[19,21],"deeper":53,"def":62,"default":[0,3,4,5,7,8,11,14,15,18,19,21,22,23,24,26,27,28,31,32,35,37,38,39,41,42,43,44,46,48,54,55,60,64,67,68,72],"deficit":[52,73],"defin":[14,27,31,32,39,41,43,44,51,52,56,60,64,69,70,72,73,74,76],"definit":[3,18,31,37,43,68,70],"deg":52,"deg_dist_optim":[0,1,43],"deg_i_to_j":[11,12,31,33],"deg_j_to_i":[11,12,31,33],"deg_ref":54,"deg_syn":54,"degdist_param_search":[14,39],"degener":[54,73],"degre":[0,2,3,4,5,6,7,10,11,12,13,14,15,18,19,20,21,24,25,28,30,31,32,33,34,35,36,37,38,39,40,42,43,44,45,46,47,48,49,51,52,53,54,55,56,58,59,60,61,64,67,68,69,70,73,74],"degree_clip":[54,55,68],"degree_dist":[53,54,68],"degree_i":24,"degree_kl":[53,54,55],"degree_sequ":24,"degreedistributionoptim":[14,31,32,39,43,44,68],"degrees_by_level":[0,11,12,28,31,32,33,42,43,44,57,58,59,61,62,64,67,68],"degs_ref":55,"degs_syn":55,"delaunay":76,"deleg":[8,26],"deliv":74,"delta":[25,28,31,34,40,42,43,45,48,60,68,72,73,76],"delta_":[31,43,48,68,73],"demand":[31,43,68,69,74],"demo":51,"demonstr":[51,53,54,55,61,62],"denom":62,"denorm":[4,31,38,43,68,74],"denot":[70,72,74,76],"dens":70,"densiti":[2,6,11,17,21,51,52,54,55,56,57,58,62,68,70,72,73],"depend":[0,8,19,26,31,43,48,52,68,72,73],"depth":[24,52,57,59],"deriv":[3,31,37,43,68,69,70,74],"descend":[31,43,48,68,73],"describ":[17,20,72],"descript":[0,31,34,43,45,60,64],"design":[52,70,72,73],"desir":[24,25,28,31,32,34,36,40,42,43,44,45,47,62,68,70,76],"desired_degre":[34,45],"destin":[8,26,68],"desur":[28,42],"detail":[0,14,31,32,39,43,44,67,68],"detect":[10,11,30,31,68],"determin":[3,23,31,37,43,57,68,69,72,73,74],"determinist":[25,31,35,40,43,46,59,60,61,68,72,73,74,76],"dev":[0,51,56,57,58,59,60,61],"deviat":[3,4,15,18,21,31,37,38,43,69,72,73,74,76],"df":[59,61,62],"dg":52,"dgln":[0,14,31,32,35,39,43,44,46,51,56,60,62,64,67,68],"dh":[50,76],"diagon":[4,31,38,43,68,73,74],"diam":[0,31,32,35,43,44,46,52,60,62,64,67,68],"diam_clc":52,"diam_d":52,"diam_ref":52,"diamet":[0,2,5,6,7,11,12,25,28,31,32,33,34,35,40,42,43,44,45,46,48,51,52,54,56,57,58,60,62,64,67,68,76],"diameters_by_level":[0,11,12,28,31,32,33,42,43,44,57,58,59,61,62,64,67,68],"diao":[50,76],"dict":[2,3,4,6,8,11,12,13,16,19,20,21,23,24,27,28,31,32,33,34,35,37,38,41,42,43,44,45,46,48,57,59,60,61,68,72],"dictionari":[2,6,8,11,26,31,68,69],"differ":[3,11,12,13,23,31,32,33,36,37,43,44,47,48,49,52,53,57,64,65,68,69,70,72,73,76],"digamma":55,"dimension":72,"dinmathbf":76,"direct":[11,13,17,21,31,36,47,49,64,68,71,73],"directed_hausdorff":62,"directori":[8,21,22,26,35,46,61,68],"disabl":52,"discard":[25,40,76],"disconnect":[11,13,31,49,73],"discov":72,"discrep":[61,76],"discret":[4,14,20,21,31,32,38,39,43,44,73,74],"discrimin":[3,31,37,43,68],"disjoint":[31,32,36,43,44,47,76],"dispatch":[0,27,31,35,41,43,46,57,58,59,60,61,67,68,75,76,77],"dispers":72,"display_nad":[57,59],"dist":52,"dist_gen":52,"dist_sq":60,"dist_typ":[0,14,31,32,35,39,43,44,46,52,60,62,64,67,68],"distanc":[3,5,7,9,11,15,16,18,19,20,21,31,37,43,53,54,55,57,58,59,61,62,68,69,70,72,76],"distinct":[9,11,31,68,72,76],"distinguish":[72,76],"distribuion":74,"distribut":[1,2,3,4,5,6,7,9,10,11,14,23,24,27,30,31,32,34,35,37,38,39,41,43,44,45,46,48,50,51,56,58,59,60,61,70,74,75,77],"distributed_active_pow":[57,58,59],"distribution_analysi":[0,1,21],"distribution_convert":[0,1,21,68,72],"distribution_input_model":[0,1,21],"distribution_param":[0,1,15,19,21],"distribution_synthesi":[0,1,21],"distribution_valid":[0,1,21],"distributiongrid":[0,9,11,31,52,53,54,55,68,72],"distributiongridgener":24,"distributioninputmodel":[17,21,53,68],"distributionlinealloc":23,"distributionsynth":[0,67],"distributionsynthfromref":[0,67,72],"distributionsynthparam":[15,18,19,21,22,52,53,54,55,68],"diverg":[20,21,55],"divers":[3,31,37,43,68,69],"divid":[4,31,38,43,55,60,73],"doc":0,"docstr":[31,43],"document":[1,69],"doe":[3,5,7,11,31,37,43,52,55,68],"doen":74,"doi":[3,37,50,71,72],"domain":72,"done":[55,60,74],"dorf_feed":52,"dot":[14,25,28,31,39,40,42,43,68,72,76],"doubl":[48,60,72],"downstream":[19,21],"dpl":[0,14,31,32,35,39,43,44,46,52,60,64,67,68],"draw":[4,11,13,17,21,31,38,43,48,49,68,73,76],"draw_networkx":52,"draw_networkx_edg":54,"draw_networkx_nod":54,"drawn":[4,23,27,31,38,41,43,48,67,68,73,74,76,77],"drift":69,"dropdown":[11,13,31,49],"dso":72,"dtype":52,"due":[52,74],"duncan":[50,76],"duplic":[34,45,76],"dure":[72,74],"dutch":72,"dx":72,"dynam":[57,69],"e":[0,8,9,11,18,21,23,25,26,27,29,31,34,35,36,40,41,43,45,46,47,51,53,54,55,57,58,59,60,61,62,67,68,69,72,73,74,76],"easili":62,"eastern":76,"ecdf":76,"edg":[0,2,3,5,6,7,9,11,12,13,16,19,20,21,24,25,28,31,32,33,34,35,36,37,40,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,60,61,62,68,69,70,72,74],"edge_color":[52,54],"edge_cr":[0,1,43],"edgecolor":[52,53,54,56,57],"edgecr":[25,28,31,34,40,42,43,45],"edit":[0,3,31,37,43,68,69],"eduardo":[50,76],"effect":[67,70,72],"either":[31,32,43,44,68,74],"electr":[0,31,43,48,50,59,72,73,74,76],"element":[57,58,74],"elit":[3,31,37,43,68,69],"elitepool":69,"ell":72,"ell_":72,"els":[52,53,54,55,57,58,61,62],"elya":[3,4,31,37,38,43,50,51,68,69,70,73,74],"em":15,"emerg":[50,52,71,72],"emergenc":73,"emergent":[20,21,55],"emili":[50,76],"empir":[0,3,4,15,27,31,37,38,41,43,48,67,68,70,72,74,76,77],"empti":[34,45,69,76],"enabl":[19,21,68,72],"encod":[4,18,31,38,43,68,74],"encount":[55,60],"end":[3,31,37,43,48,70],"endpoint":[3,25,31,37,40,43,73,76],"endswith":[55,61],"energi":[50,67,73,76],"enforc":69,"engin":72,"enough":76,"ensembl":[62,72],"ensur":[19,21,68,72,73,76],"entir":[0,10,11,28,30,31,35,36,42,43,46,47,60,64,66,67,68,74,76],"entri":[18,28,31,34,42,43,45,55,61,73,74],"entropi":[0,3,31,35,37,43,46,51,56,57,58,59,60,61,67,68],"entropy_model":[3,31,35,37,43,46,51,57,58,60,68],"entropyfunc":69,"enumer":[52,53,54,55,62],"environ":0,"epsilon":[3,31,37,43,68,69,70,72],"equal":[4,20,21,31,38,43,72,74,76],"equat":[11,72],"eran":[50,71,72,76],"ercot":73,"erd":[50,76],"erd\u00f5":76,"err":72,"error":[14,39,51,56,57,58,59,60,61,69,74],"est":72,"estim":[3,17,21,31,37,43,68,70,72,73,76],"et":[4,9,11,14,17,18,19,20,21,22,24,25,27,28,31,32,34,36,38,39,40,41,42,43,44,45,47,48,51,52,54,55,62,67,68,71,72,73,74,76],"eta":[34,45,76],"etc":[0,16,21,31,46,54,55,60,62,68,72,76],"european":61,"evalu":[3,14,17,21,31,37,39,43,68,69],"even":[52,70,72],"everi":[11,12,19,21,31,33,72,76],"evid":76,"ew16":[69,70],"ewt17":74,"exact":[3,4,24,31,36,37,38,43,47,76],"examin":[70,74],"exampl":[0,8,22,26,28,31,32,35,42,43,44,46,59,67,68,72],"exceed":[31,43,48,72],"excel":[0,8,21,22,26,35,46,57,58,60,67,68],"except":[55,59,61,76],"excess":73,"exchang":[8,26,55,61,68],"exclud":[15,72],"execut":[4,11,31,34,38,43,45,48,68],"exhibit":[72,76],"exist":[0,11,12,21,22,31,33,35,46,51,55,60,62,67,68,70,73,74],"exist_ok":[55,61],"exp":[4,14,15,31,38,39,43,48,73,74,76],"expect":[16,21,34,45,68,74,76],"expens":72,"experiment":67,"explain":[70,73,74,75,76],"explicit":[31,32,43,44,52,68,72],"exploit":[3,31,37,43,68,72,76],"explor":48,"expon":[14,31,32,39,43,44,76],"exponenti":[0,4,14,15,18,19,21,27,31,38,39,41,43,48,67,68,72,74,76],"exponentialclip":[15,18,21,68],"exponentialparam":[18,21,68],"export":[1,11,21,22,31,35,46,55,67,74],"export_format":[0,21,22,35,46,55,60,67,68],"expos":[22,35,46,60],"express":72,"ext":54,"ext_grid":[54,55,57,58],"extend":[9,11,29,31,68],"extens":[21,22,35,46,68,76],"extra":0,"extract":[0,9,10,11,12,15,16,21,22,24,29,30,31,33,35,46,52,54,55,59,60,61,62,68,72,73,74],"extract_cable_length_distribut":20,"extract_degree_distribut":20,"extract_distribution_param":24,"extract_hop_distribut":20,"extract_load_per_nod":20,"extract_topology_params_from_graph":[11,12,31,33,57,58,59,61],"extrem":[0,4,27,31,38,41,43,67,72,73,74],"f":[27,31,41,43,48,51,52,53,54,55,56,57,58,59,60,61,62,72,73,74,76],"f_":[11,73],"f_1":76,"f_2":76,"f_c":74,"f_l":[31,43,48,68,73],"f_m":73,"f_max":0,"facil":67,"fact":72,"factor":[0,16,19,21,27,31,41,43,48,53,54,67,68,72,74],"factori":[21,22,46,55,61,68],"factoris":11,"fail":[59,61,76],"fall":[4,15,31,38,43,70,73,74],"fallback":[4,27,31,36,38,41,43,47,48,68],"fals":[2,5,6,7,8,10,11,13,14,26,28,30,31,35,39,42,43,46,48,49,52,54,57,60,68],"famili":[14,15,39],"far":[18,21,72,76],"fast":[25,40,76],"feasibl":73,"feastpack":[14,39],"featur":[11,13,31,49,68,74],"fed":72,"feed":72,"feeder":[0,9,11,15,16,17,18,19,20,21,22,24,31,52,63,64,67,68,71,75],"feeder_summari":[16,21,52,54,55,68,72],"feederinputsampl":[17,21,68],"feederparam":0,"feeders_default":55,"feeders_ref":55,"fig":[13,27,49,52,53,54,55,57,62],"fig_siz":[5,7,11,31,52,54,57,58,68],"figsiz":[2,3,5,6,7,11,13,31,37,43,49,51,52,53,54,55,56,57,61,62,68],"figur":[2,3,5,6,7,10,11,13,30,31,37,43,49,51,56,57,61,62,68,74],"file":[4,8,21,22,26,31,35,38,43,46,55,60,68,72],"filenam":[21,22,35,46,57,68],"filepath":[8,26,68],"fill":[28,31,42,43],"filter":[0,51,52,56,57,58,59,60,61,62],"final":[31,43,48,68,76,77],"final_pdf":[14,39],"find":[3,11,13,14,31,32,37,39,43,44,49,68,72,76],"fine":[0,67,76],"first":[31,32,43,44,53,54,60,61,72,74,76,77],"fit":[0,3,4,15,17,21,22,31,32,37,38,43,44,62,64,67,68,70,71,72,76],"fit_beta":15,"fit_exponential_clip":15,"fit_from_array":[17,21,68],"fit_mixture_gamma":15,"fit_modified_cauchi":15,"fit_neg_binomi":15,"fit_params_from_feed":[0,15,16,21,53,54,55,68],"fit_power_law_clip":15,"fit_t_location_scal":15,"fitted_param":[53,54,55],"fitted_raw":54,"five":[19,34,45,72],"fix":[3,15,31,37,43,69],"flag":[27,31,41,43,68,73],"flatter":52,"flexibl":76,"flip":69,"float":[3,4,6,8,9,11,13,14,17,19,20,21,22,23,27,31,32,35,37,38,39,41,43,44,46,48,52,53,54,55,62,68],"flow":[8,11,23,26,31,43,48,57,58,68,72,74],"focus":[67,72],"follow":[3,4,5,7,11,14,24,27,28,31,32,37,38,39,41,42,43,44,48,57,58,68,70,72,73,74,76],"fontsiz":[52,53,54],"forc":[11,13,31,49],"forecast_dist":[57,58],"forest":[11,13,31,49],"forestgreen":52,"form":[11,72,76],"format":[8,9,11,16,21,22,26,31,35,46,72],"formul":70,"formula":[31,43,68,74],"found":[3,5,7,11,31,37,43,53,68,70,72,73,76],"foundat":67,"four":[31,36,43,47,73,74],"fourier":72,"fpath":[55,61],"fr":60,"frac":[11,14,39,69,70,72,73,76],"frac_inject":[20,21,53,54,55],"frac_intermedi":[20,21,53,54,55],"fraction":[15,18,19,20,21,31,43,48,68,72,73],"framework":24,"free":[14,39,62,76],"freileitung":52,"french":59,"frequenc":[0,72],"fresh":[3,31,37,43,68],"freshpool":69,"from_nx":[9,11,31,52,53,54,55,68],"front":52,"full":[0,4,11,13,16,21,22,27,28,31,32,34,35,38,41,42,43,44,45,46,48,49,51,53,55,56,59,61,62,64,67,68,72,73,76],"fulli":[0,27,31,35,41,43,46,67,68,72],"function":[0,3,8,11,12,13,14,16,18,21,22,26,27,31,33,35,37,39,41,43,46,48,49,54,55,57,58,60,62,64,66,67,69,70,72,74,76],"fundament":[2,6,11,72],"furthest":72,"futher":56,"future_snapshot":59,"g":[0,8,9,11,12,13,18,19,20,21,23,24,26,27,29,31,33,35,41,43,46,49,50,51,52,53,54,55,60,61,62,68,69,70,72,73,74,76],"g_":[31,41,43,68,72],"g_c":52,"g_clc_dorf":52,"g_clc_lv":52,"g_custom":53,"g_dist":52,"g_dist_raw":52,"g_dmax":[15,18,21],"g_i":[11,27,31,41,43,68,73,74],"g_max":[15,18,21],"g_n":[73,74],"g_s":52,"g_sw_dorf":52,"g_sw_lv":52,"g_syn":54,"g_tran":52,"gamma":[0,14,15,18,19,21,31,32,35,39,43,44,46,52,53,54,55,60,62,64,67,68,72,76],"gamma_":[31,43,48,68,73],"gap":[19,21,72],"gaug":[0,31,43,48,67,68],"gaussian":[4,31,38,43],"gaussian_kd":[17,21,68],"gc":[3,31,37,43,69,70],"ge":[3,31,37,43,48],"gegner":[50,76],"gen":[0,3,27,31,35,37,41,43,46,51,53,54,55,57,58,59,60,61,62,64,67,68,69],"gen_custom":53,"gen_d":52,"gen_dist":55,"gen_from_kd":53,"gen_lv":52,"gen_mw":53,"geneartor":76,"general":[3,14,31,32,37,39,43,44,50,68,70,73,76],"generalis":60,"generat":[0,1,3,4,5,7,8,9,10,11,12,13,14,16,17,18,19,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,46,47,48,49,50,59,60,61,63,64,66,67,69,70,71,75,77],"generate_edg":[25,28,31,40,42,43],"generate_feed":[19,21,52,53,54,55,68],"generate_from_param":24,"generate_from_spec":24,"generate_grid":[0,28,31,32,42,43,44,52,57,58,59,61,62,64,67,68],"generate_transformer_edg":[28,31,36,42,43,47],"generation_dispatch":[0,1,43,73],"generationdispatch":[0,27,31,41,43,56,57,58,59,61,67,68],"genloadset":60,"geo":57,"geograph":72,"geq":[34,36,45,47,69,72,73,74,76],"get":[31,32,43,44,52,53,54,55,57,59,60,61,62,68],"get_2_windings_transform":[59,61],"get_basic_stat":[2,6,11],"get_bus":[55,59,61],"get_busbar_sect":59,"get_clustering_metr":[2,6,11],"get_export_format":57,"get_gener":[59,61],"get_lin":[55,59,61],"get_load":[55,59,61],"get_network_area_diagram":[57,59],"get_path_metr":[2,6,11],"get_reference_stat":[4,11,31,38,43],"get_subst":59,"get_switch":59,"get_voltage_level":[59,61],"getsiz":[55,61],"gg":[3,31,37,43,69,70],"git":0,"github":0,"giuliano":[50,71,72],"give":[3,4,31,37,38,43,68,70,73,74,76],"given":[3,9,11,14,17,21,22,24,31,34,35,37,39,43,45,46,51,62,68,70,72,74,76],"gl":[3,31,37,43,69,70],"global":[2,5,6,7,10,11,28,30,31,42,43,51,56,62,68,76],"goal":[67,69],"good":76,"googl":64,"govern":72,"grain":[0,67,76],"graph":[0,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,37,38,40,41,42,43,46,47,48,49,50,51,52,53,54,55,56,59,60,61,62,67,69,71,72,74,76,77],"graph1":[5,7,11,31],"graph2":[5,7,11,31],"graph_from_cgm":61,"graph_real":[57,58],"graph_ref":[59,61],"graph_reload":61,"graph_syn":[59,61],"graphcompar":[5,7,11,31,52,54,57,58,59,61,68,76],"gray":[52,53,54],"greater":70,"green":53,"grid":[2,3,4,5,6,7,8,9,10,11,12,13,21,22,23,24,26,27,28,29,30,31,32,33,35,36,37,38,41,42,43,44,46,47,48,49,50,56,59,63,65,69,72,73,74,75],"grid_300":60,"grid_custom":60,"grid_graph":[0,1,11,51,55,56,62],"grid_ref":60,"grid_syn":60,"gridanalyz":[2,6,10,11,30,31,52],"gridexport":[0,8,22,26,55,57,58,61,67,68],"gridvisu":[0,11,13,31,49,51,52,53,54,55,56,57,59,60,61,62,64,67,68],"group":[27,41],"grow":[3,24,31,37,43,68,70,71,74],"gt":[51,52,54,55,56,57,58,59,60,61,62],"guarante":[25,40,52,73,76],"guid":76,"guidelin":[31,32,43,44,68],"h":[3,4,9,11,15,16,18,19,21,31,32,35,37,38,43,44,46,52,53,54,55,56,57,58,59,60,61,62,68,72,74,76],"h_":72,"hadi":[50,76],"halappanavar":[50,76],"halfway":72,"hamid":[50,69,70,73,74],"hamidreza":[50,73],"handl":[11,13,16,21,31,49,54,68,72],"hard":[22,31,43,48],"hausdorff":[5,7,11,31,57,58,59,61,62,68,76],"hcsh":76,"head":60,"heavi":[4,31,35,38,43,46,52,60,68,72,74],"height":[3,11,13,31,37,43,49,68],"help":70,"helper":[0,5,7,11,13,31,49,72],"heurist":[4,31,38,43,48,68,73],"hierarch":[11,13,31,49,51,52,56,62],"hierarchi":[51,56,62],"hierarchical_analysi":[0,1,11],"hierarchical_tre":[52,53,54,55],"hierarchicalanalyz":[10,11,30,31,62],"high":[0,4,11,13,24,27,31,32,36,38,41,43,44,47,48,49,52,57,64,66,67,73,74],"higher":[23,69,70,72],"highest":[11,13,31,49,52,68,73,74],"highlight":52,"hine":[50,76],"hist":[52,53,54,55,56,57],"histogram":[2,6,11,20,21,55,72],"hogan":[50,76],"hold":72,"hop":[0,9,11,15,16,18,19,20,21,31,53,54,55,68,72],"hop_clc":52,"hop_clc_d":52,"hop_clc_lv":52,"hop_dist":[52,53,54,55,68],"hop_distance_kl":[53,54,55],"hop_ref":52,"hop_ref_d":52,"hop_sw":52,"hop_sw_d":52,"hops_ref":[54,55],"hops_syn":[54,55],"horizont":[11,13,31,49],"host":11,"html":[0,31,43,68],"https":[0,3,4,31,37,38,43,68],"hu":[0,11,13,31,49,68],"huang":[50,76],"hub":[3,31,37,43,52,70,76],"hv":[60,72],"hydro":[27,31,41,43,68,73],"hypermut":[3,31,37,43,68,69],"hypothesi":76,"i_":[23,72],"i_est":[18,19,21],"i_est_ka":[19,21,68],"i_i":76,"i_nom":[18,19,21],"i_nom_target":[19,21],"i_x":76,"id":[3,4,11,25,27,28,31,34,37,38,40,41,42,43,45,57,58,59,68],"idea":[24,70,72,74],"ideal":[14,39],"ident":61,"identif":69,"identifi":[69,70,72],"ieee":[3,31,35,37,43,46,50,55,60,64,66,68,69,70,71,72,73,76],"ieee118":[46,68],"ieee118_cgmes_ref":61,"ieee118_cgmes_ref_eq":61,"ieee118_cgmes_ref_ssh":61,"ieee118_cgmes_ref_sv":61,"ieee118_cgmes_ref_tp":61,"ieee118_clon":60,"ieee118_clone_cgm":60,"ieee118_custom":60,"ieee118_syn":[57,61],"ieee118_syn_cgm":[57,61],"ieee118_syn_cgmes_eq":61,"ieee118_syn_cgmes_ssh":61,"ieee118_syn_cgmes_sv":61,"ieee118_syn_cgmes_tp":61,"ieee14":[46,68],"ieee_test":60,"ignor":[21,22,35,46,68],"ii":[0,11,22,24,31,32,35,43,44,46,62,67,68,73],"iii":[0,17,18,19,21,22,27,31,41,43,54,55,67,68,72],"ij":[3,11,31,37,43,70,73],"ill":58,"illustr":[64,65],"immateri":72,"immun":[3,31,37,43,67,68,70],"immunolog":69,"impact":70,"imped":[0,11,13,19,21,22,23,31,43,48,49,54,57,58,67,68,72,74,77],"implement":[3,4,8,11,13,19,25,26,27,28,31,36,37,38,40,41,42,43,47,49,61,68,69,70,73,74,76],"implic":70,"import":[0,22,35,46,51,52,53,54,55,56,57,58,59,60,61,62,64,67,72,74],"impos":72,"improv":[3,31,35,37,43,46,50,68,69,70],"in_servic":57,"inch":[3,31,37,43,68],"incid":[72,73,74,76],"includ":[2,5,6,7,8,11,13,19,21,26,31,49,57,58,64,68,73,76],"include_result":[8,26,68],"inclus":72,"incoming_graph_data":[9,11,29,31],"incorpor":72,"increas":[70,72,76],"independ":[25,31,32,40,43,44,76],"index":[9,11,29,31,34,36,45,47,68],"indic":[8,25,26,34,40,45,57,68,72,73,74,76],"indistinguish":[57,72],"individu":[3,4,31,37,38,43,64,66,67,68,69,72,74],"induc":76,"induct":74,"industri":[57,58,61,67,72],"inf":[20,21],"inf_":76,"infer":68,"inflat":[25,28,31,34,40,42,43,45,76],"inform":[24,51],"infrastructur":[50,76],"infti":72,"inher":74,"inherit":[9,11,29,31,68,76],"initi":[3,31,32,37,43,44,62,68],"inj":[19,21,72],"inject":[3,9,11,15,16,18,19,20,21,31,37,43,48,53,54,68,69,73,74],"injection_devi":68,"injection_frac":[54,68],"injection_hop":68,"input":[0,11,12,17,21,28,31,32,33,34,42,43,44,45,55,60,61,64,68,69],"input_configur":[0,1,43,64],"input_diamet":[34,45],"input_extractor":[1,11],"input_model":53,"inputconfigur":[0,31,32,43,44,51,52,56,62,64,67,68],"insert":[28,31,42,43,62,68],"inspect":61,"instal":[31,43,64,68,72],"instead":[31,43,57,58,60],"insuffici":15,"int":[3,4,7,9,11,12,13,14,17,19,20,21,22,23,24,25,27,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,68],"int_":72,"integ":[3,4,31,37,38,43,73,74],"integr":0,"intellig":67,"intens":[3,31,37,43,68,69],"intent":52,"inter":[0,35,46,52,60,67],"inter_connect":[31,32,43,44,52,68],"interact":[0,11,13,31,49,51,58,68,72],"interconnect":76,"intermedi":[9,11,15,16,18,19,20,21,22,31,35,46,53,54,55,68],"intermediate_frac":[54,68],"intermediate_hop":68,"intern":[8,20,21,26,67],"internconnect":76,"interplay":72,"interpret":[72,76],"interv":72,"intra":[0,11,12,31,33],"introduc":[31,43,48,68,73],"invalid":[21,22,55,60,68],"invers":[73,74],"investig":[51,70,76],"io":52,"ipynb":[0,51,56],"irrelev":52,"is_connect":52,"is_radi":[9,11,31,52,53,54,68,72],"is_tre":[16,21,52,55,68],"is_tree_clc":52,"isinst":[53,54,55,57,61],"isol":[34,45,51,52,56,57,58,59,60,61,62,76],"issu":[20,21,53],"item":[52,53,54,55,56,57,58,60,61],"iter":[0,3,5,7,10,11,13,15,27,30,31,37,41,43,48,49,51,55,56,57,58,59,60,61,67,68,69,73,74,76],"iteration_count":[55,57,58,59,61],"iterrow":61,"iv":[20,31,43,48],"j":[3,4,11,12,28,31,32,33,36,37,38,42,43,44,47,50,68,70,72,73,74,76],"jetca":[50,71,72],"jiidm":[0,8,26,55,57,58,61,67,68],"jin":76,"join":[54,55,59,61],"joint":[0,4,27,31,38,41,43,48,67,68,73,74],"journal":[50,71,72,76],"json":[0,8,21,22,26,35,46,55,58,60,61,67,68],"junction":72,"jupyt":[0,64,65,67],"jx_l":73,"k":[0,3,4,11,13,25,28,31,32,35,36,37,38,40,42,43,44,46,47,49,51,54,56,60,62,64,67,68,69,70,72,74,76],"k2":[57,61],"k_bar":[4,31,38,43,68],"k_bar_n":[4,31,38,43],"k_i":74,"k_n":74,"k_t":70,"kamada":[11,13,31,49,52,68],"kamada_kawai":[11,13,31,49,51,52,56,57,60,61,62,68],"kamada_kawai_layout":52,"kathleen":[50,76],"kawai":[11,13,31,49,52,68],"kde":[17,21,68,72],"kdrive":[55,60],"keep":[3,31,34,35,37,43,45,46,60,62,68,70],"keep_lcc":[28,31,35,42,43,46,52,57,58,59,60,61,62,68],"keep_original_s":24,"kept":[51,52,56,57,58,59,60,61,62,76],"kernel":[17,72],"key":[11,16,21,24,31,32,35,43,44,46,52,53,54,55,56,57,58,60,61,62,68,72,73,74,76],"kl":[15,20,21,55],"kl_divergence_discret":[20,21,53],"kl_key":55,"kl_result":53,"kl_score":55,"km":[15,16,21,23,53,54,68,72],"knob":60,"know":72,"known":61,"kolda":[14,39,50,76],"kolmogorov":[5,7,11,31,68,76],"komal":[50,76],"kpps14":76,"ks":[5,7,11,31,57,58,59,61,62,68,76],"ks_2samp":62,"ks_stat":62,"kullback":72,"kv":[8,19,21,22,23,26,35,46,53,60,61,68],"kwarg":68,"l":[23,31,35,43,46,60,68,69,70,73,74],"l_i":[11,73],"l_m":73,"l_n":74,"l_x":76,"lab":[14,39],"label":[3,11,12,13,24,31,33,37,43,49,52,54,55,62,68,76],"lack":52,"lag":[31,43,68,74],"lambda":[31,32,43,44,52,55,56,57,58,73,74],"landnetz":52,"larg":[3,4,27,31,37,38,41,43,52,57,68,70,72,73,74,76],"larger":[52,69,70,72,73,74,76],"largest":[11,12,28,31,33,35,42,43,46,48,51,52,56,57,58,59,60,61,62,68,73],"later":72,"law":[0,4,14,15,18,21,31,32,38,39,43,44,52,60,64,68,72,73,74,76],"layer":[11,13,31,49,52,67,68],"layer_sep":[11,13,31,49],"layout":[0,11,13,31,49,51,52,53,54,55,56,57,60,61,62,67,68],"layout_nam":[11,13,31,49],"lc":[3,31,37,43,69,70],"lcc":[51,52,54,56,57,58,59,60,61,62,76],"ldot":[27,41,72,73,74],"le":[3,31,37,43,48,68],"lead":[70,72],"leaf":[3,15,31,37,43,69,72,76],"least":[11,12,16,21,31,33,68,72,73,76],"leav":[36,47,72,76],"left":[11,13,31,49,69,70,72],"leftarrow":[34,45,72,76],"leftov":[27,31,36,41,43,47,76],"leftrightarrow":70,"legend":[52,54,55,62],"legend_bbox":[11,13,31,49],"legend_loc":[11,13,31,49],"leibler":72,"len":[52,53,54,55,57,58,59,61,62],"len_ref":54,"len_syn":54,"length":[0,2,3,5,6,7,11,14,15,16,18,19,20,21,22,23,24,31,32,37,39,43,44,51,52,53,54,55,56,62,67,68,71,76],"length_clip":[54,55,68],"length_km":[15,16,19,21,23,53,54,68],"length_param":23,"leq":[36,47,70,72,73,74,76],"less":70,"level":[0,5,7,8,9,10,11,12,13,19,21,24,26,27,28,29,30,31,32,33,35,36,41,42,43,44,46,47,49,50,51,52,56,58,59,61,62,64,66,67,72,73,76,77],"level_i":[35,46,60,68],"level_index":[35,46,60,68],"level_j":[35,46,60,68],"level_node_count":[28,31,42,43],"level_offset":[28,31,42,43],"level_spec":[0,32,35,44,46,52,60,62,64,67,68],"lf":67,"lib":55,"librari":[0,18,19,21,57,58,61,67,72],"lie":[4,31,38,43,68,74],"light":[31,35,43,46,60,68,74],"lightsim2grid":0,"lightweight":[0,11],"like":[2,3,5,6,7,9,14,17,20,21,29,31,37,39,43,52,54,68,70,74,76],"limit":[23,31,43,48,51,58,68,70,72,73,76,77],"linalg":11,"line":[0,11,13,16,21,22,23,28,31,32,34,35,42,43,44,45,46,48,49,51,54,57,58,59,60,61,67,68,72,74,76,77],"line_cap":[57,58],"line_index":[31,43,48],"line_typ":23,"line_type_prob":23,"linear":[0,2,3,6,10,11,30,31,37,43,57,58,67,70],"linearis":11,"liner":[55,64],"link":[3,31,37,43,68,69,70,74,76],"link_ratio":[3,31,37,43],"linux":67,"list":[3,9,11,12,13,16,17,19,20,21,22,24,25,28,31,32,33,34,35,36,37,40,42,43,44,45,46,47,48,52,54,55,56,57,60,61,62,68,69,74,76],"listdir":[55,61],"literatur":72,"live":67,"ll":[3,31,37,43,69,70],"ln":[3,31,37,43],"lname":54,"load":[0,3,4,9,11,13,15,16,17,18,19,20,21,22,27,31,35,37,38,41,43,46,48,49,50,51,52,53,64,66,67,68,69,70,71,73,75,76,77],"load_alloc":[0,4,38,56,57,58,74],"load_devi":[54,68],"load_grid":[0,59,61,67,68,72],"load_mw":53,"load_val":[53,56,57],"loadalloc":[0,31,43,56,57,58,59,61,67,68,74],"loadflow":[0,55,57,58,59,61,67],"loading_level":[31,35,43,46,56,57,58,59,60,61,68],"loads_ref":54,"loads_syn":54,"local":[2,3,6,11,28,31,36,37,42,43,47,51,56,60,62,64,68,69,70,76],"locat":[15,18,21,59,70,72],"log":[2,4,5,6,7,10,11,14,30,31,32,34,38,39,43,44,45,51,52,55,56,57,60,62,64,68,69,70,72,74,76],"log10":[4,31,38,43,68],"log_":[31,43,48,73,74],"log_scal":[2,5,6,7,10,11,30,31,52,54,57,58,59,61,62,68],"logic":[31,43,72],"lognorm":[0,31,43,48,67,68],"long":[25,40,76],"look":[56,74],"loop":[4,25,27,31,38,40,41,43,68,73,76],"lose":52,"loss":73,"low":[4,11,13,27,31,38,41,43,48,49,52,55,57,68,72,73,74,76],"lower":[14,39,73],"lowest":[11,13,31,49,72,74],"lt":[51,54,56,57,58,59,60,61,62],"lu":[25,28,34,36,40,42,45,47,51,52,62,67,74,77],"lv":[0,23,55,60,64,67,71,72],"lv_feeder":52,"l\u00e9vi":[0,31,43,48,67,68],"m":[3,4,11,14,23,27,31,35,37,38,39,41,43,46,48,50,51,52,54,56,57,58,59,60,61,68,69,70,72,73,74,76],"m_":[3,31,37,43,69,70],"m_clc":52,"m_k":[25,40],"magnitud":[0,11,13,31,43,48,49,67,68,72],"mahantesh":[50,76],"main":[0,11,13,28,31,42,49,68,72,76],"maintain":[3,31,37,43,68],"makarov":[50,76],"make":0,"makedir":[55,61],"manag":[10,11,30,31],"mani":[61,70,72,76],"maosheng":[55,60],"map":[3,4,8,19,20,21,25,26,27,28,31,32,34,35,37,38,40,41,42,43,44,45,46,48,54,57,59,60,61,68,74],"margin":[4,31,38,43,74],"mark":[19,21,72],"market":73,"mass":72,"match":[0,3,14,19,23,24,27,31,32,34,36,37,39,41,43,44,45,47,48,52,54,55,67,68,69,72,73,76],"mathbb":[3,31,37,43,68,70,72,76],"mathbf":[11,25,28,31,34,36,40,42,43,45,47,68,73,74,76],"mathcal":[3,31,37,43,72,74,76],"mathrm":[31,43,48],"matlab":[3,4,14,27,31,37,38,39,41,43,48,68,69,70,73,74],"matplotlib":[0,2,5,6,7,11,13,31,49,52,53,54,55,57,61,62,68],"matplotlibdropdown":[13,49],"matpow":[0,8,16,21,26,35,46,55,57,58,60,61,67,68,72],"matrix":[4,11,31,38,43,68,73,74],"matur":69,"max":[4,11,13,14,15,18,19,21,23,27,31,32,38,39,41,43,44,48,49,52,53,54,55,58,59,61,62,68,70,72,73,74,76],"max_":76,"max_deg":[14,39,55],"max_degre":[24,31,32,43,44],"max_h":52,"max_hd":52,"max_hop":[9,11,16,20,21,31,52,53,54,55,68,72],"max_i":[73,74,76],"max_i_ka":[19,21,23,68],"max_it":[3,31,37,43,51,57,58,68,69],"max_iteration_reach":58,"max_k":[31,32,35,43,44,46,68],"max_l":73,"max_length_km":[20,21,53,54,55],"max_r_pgmax":[4,31,38,43],"max_r_pl":[31,43],"max_vm_pu":57,"maxima":[4,31,38,43,68],"maximum":[3,4,9,11,14,20,21,24,31,32,34,37,38,39,43,44,45,57,68,73,74,76],"may":[11,35,46,48,54,57,58,61,68,69,70,73,76],"mbox":70,"mead":[14,39],"mean":[20,21,23,31,32,43,44,48,52,54,55,57,68,69,70,72,73,74,76],"mean_degre":[20,21,53,54,55],"mean_length_km":[20,21,53,54,55],"meaning":72,"measur":[3,31,37,43,48,51,57,68,70,72,76],"medium":[24,27,31,35,41,43,46,50,68,71,72,73,74],"mediumpurpl":53,"meet":[50,73,76],"memori":68,"menu":[11,13,31,49],"merg":[54,72],"mesh":[9,11,24,31,52,68,72],"method":[0,3,4,9,10,11,13,15,17,21,29,30,31,37,38,43,49,51,57,58,67,68,70,73,74,75,76],"methodolog":[4,11,31,38,43,68,74,76],"metric":[0,2,3,5,6,7,11,31,37,43,50,51,52,53,54,55,56,58,62,68,70,72,74],"mid":73,"mimic":[11,12,31,33,52,69],"min":[23,31,32,43,44,48,55,59,61,68,72,73,74,76],"min_":70,"min_vm_pu":57,"minim":[14,15,39,69,72],"minimum":[31,43,48,68,73,76],"mir":[50,76],"mirror":[31,43,60,68],"mismatch":[57,61,76],"miss":[21,22,35,46,68],"mixtur":[15,18,21,52,55,72],"mixturegammaparam":[15,18,21,68],"mixturenormalparam":[18,21,68],"mixturepoissonparam":[18,21,68],"mle":15,"mode":[11,12,21,22,24,31,32,33,35,43,44,46,55,67,68,72],"model":[0,3,4,8,11,12,15,17,21,24,25,26,28,31,32,33,34,35,37,38,40,42,43,44,45,46,48,50,51,52,55,56,59,60,61,62,64,65,67,68,69,70,72,77],"moder":[51,52,72],"modifi":[18,19,21,72,76],"modifiedcauchyparam":[15,18,21,53,54,68],"modul":[11,31,57,58,64,65,67,68,72,75],"modular":72,"moment":15,"mont":[3,31,37,43,68,69,72],"monte_carlo_it":[3,31,37,43,69],"monti":[50,71,72],"move":[56,70],"ms":0,"mu":[3,4,31,37,38,43,48,68,70,72,74],"mu_":[27,31,41,43,48,68,70,73],"mu_1":72,"mu_2":72,"mu_beta":[31,43,48,68],"mu_commit":[27,31,41,43,68],"mu_w":69,"mu_z":73,"much":76,"multi":[9,10,11,28,30,31,42,43,52,68,72,77],"multipl":[52,53,55,67],"multipli":[4,31,38,43,60,74],"must":[3,11,17,21,24,27,31,35,37,41,43,46,68,73,76],"mutat":[3,28,31,37,42,43,68,69],"mv":[0,19,21,23,24,52,53,60,67,68,71],"mva":[8,11,19,21,26,57,58,60,68,72,73,76],"mvar":[31,43,68],"mw":[4,9,11,19,20,21,22,27,31,38,41,43,48,53,54,55,56,57,58,59,60,61,68,73],"my_net":60,"n":[0,3,4,14,24,27,31,32,34,35,37,38,39,41,43,44,45,46,48,51,52,53,54,55,56,57,58,59,60,61,62,64,67,68,69,70,72,73,74,76],"n_":[72,74],"n_bin":[20,21],"n_c":[3,31,37,43,68,69,70],"n_clc":52,"n_comm":[27,31,41,43],"n_d":[14,39,52,76],"n_edg":[16,20,21,53,54,55,68],"n_feeder":[0,21,22,24,55,67,68],"n_g":[4,27,31,38,41,43,68,70,73,74],"n_i":[31,32,43,44,72,76],"n_j":[31,32,43,44,72,76],"n_k":[3,31,37,43,70],"n_l":[31,43,68,70],"n_level":[9,11,31,62,68,72],"n_mv_buse":24,"n_node":[0,16,17,19,20,21,22,24,31,32,43,44,52,53,54,55,67,68],"n_rc":[4,31,38,43],"n_ref":[52,54],"n_sampl":[17,21,52,68],"n_target":55,"n_transform":24,"nad_explor":[57,59],"name":[12,20,21,22,33,35,46,51,52,55,56,57,58,59,60,61,68],"nat":[20,21],"nation":[14,39],"nativ":68,"natur":[69,72],"nblink":67,"nbusbar":59,"nbuse":59,"ncustom":60,"ndarray":[3,4,11,13,14,15,17,20,21,25,27,31,34,37,38,39,40,41,43,45,48,68],"ndc":[59,61],"near":[17,21,70,72],"necessari":[51,76],"necessarili":[3,31,37,43],"need":[0,11,17,21,34,35,45,46,55,61,62,67,68,72,73,74,76],"neg":52,"negat":[15,16,17,18,19,20,21,27,31,41,43,48,52,55,68,70,72,73],"negbinom":52,"negbinomparam":[15,18,21,53,68],"neglect":73,"neglig":[72,73],"neighbor":[72,73],"neighborhood":[73,76],"nelder":[14,39],"neq":76,"nest":[4,31,38,43],"net":[0,11,16,21,22,52,60,67,68,73],"net_dorf":52,"net_from_cgm":55,"net_lv":52,"net_pp":55,"net_ppl":[55,61],"net_real":[57,58],"net_ref":[52,54],"net_syn":55,"net_syn_pp":[59,61],"net_syn_ppl":[55,61],"network":[0,3,8,9,11,14,16,21,22,23,26,31,35,37,39,43,46,48,50,52,54,55,59,61,64,67,68,69,70,71,72,73,74],"network_explor":[57,59],"networkx":[0,2,3,4,6,7,8,9,10,11,12,13,15,19,20,21,22,26,27,29,31,33,37,38,41,43,46,48,51,52,53,54,55,56,57,58,59,67,68,72],"new":[2,5,6,7,11,31,51,53,57,60,68,69],"newaxi":60,"newli":59,"newton":[0,57,58,67],"next":69,"ngen":59,"ngener":55,"nl":[31,43,68],"nlayout":54,"nline":59,"nload":59,"nn":52,"nodal":[4,31,38,43,48,68,74,76],"node":[0,2,3,4,5,6,7,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,31,32,33,35,36,37,38,39,40,41,42,43,44,46,47,49,51,53,54,55,56,58,59,60,61,62,64,67,68,69,70,73,74,76],"node_color":[52,54],"node_s":[52,54],"node_sep":[11,13,31,49],"node_typ":[9,11,15,16,19,21,31,53,54,55,68],"nodeid":[4,31,38,43,69],"nodes_at_hop":[9,11,31,68,72],"nodes_by_typ":[9,11,31,53,54,68,72],"nodes_per_feed":24,"nom":72,"nomin":[18,19,21,22,23,53,68,76],"nominal_v":61,"non":[3,4,19,20,21,31,34,37,38,43,45,68,69,70,72,73,74,76],"none":[2,3,4,5,6,7,8,9,11,13,17,19,20,21,22,23,24,26,28,29,31,32,35,37,38,42,43,44,46,49,60,68,76],"nonlinear":70,"nonparametr":76,"nonzero":[20,21,34,45,76],"norm":[18,21],"norm_cap":[4,27,31,38,41,43],"norm_deg_pair":[4,31,38,43],"norm_pg_max":[27,31,41,43],"norm_val":[31,43],"normal":[3,4,14,18,20,21,31,32,37,38,39,43,44,52,57,60,64,68,70,72,74,76],"normalis":[27,31,41,43,48,68],"normalised_capac":[27,31,41,43],"normalised_flow":[31,43,48],"normalized_r_pgmax":[4,31,38,43],"normalized_r_pl":[31,43],"normalizedcapac":[4,31,38,43],"normalizeddegre":[4,31,38,43],"normalizedvalu":[31,43],"normalparam":[18,21,68],"note":[25,36,40,47,57,58,69,72,73,76],"notebook":[51,52,55,56,60,61,62,64,65,66,67,72],"notion":52,"novel":[50,73],"now":74,"np":[3,4,24,31,37,38,43,52,53,54,55,57,58,60,61,62,68],"npypowsybl":55,"nreload":[55,61],"nsampl":61,"nschweitzer":52,"nsubstat":59,"nswitch":59,"nsynthesis":60,"nsynthet":54,"ntop":[56,57,58],"ntr":59,"nu":72,"null":76,"nullifi":76,"num_edg":[2,6,11],"num_lin":[31,43,48],"num_nod":[2,6,11],"numba":0,"number":[3,9,11,13,14,17,19,20,21,22,24,27,28,31,32,34,36,37,39,41,42,43,44,45,47,48,49,55,60,61,62,68,70,72,73,74,76],"number_of_edg":[52,53,54,55,57,58,59,60,61,62],"number_of_nod":[52,53,54,55,57,58,59,60,61,62],"numer":[51,70,73],"numpi":[0,11,13,14,15,17,20,21,25,27,31,34,38,39,40,41,43,45,48,52,53,54,55,57,58,61,62,68],"nvoltag":61,"nvoltage_level":59,"nx":[2,3,4,6,9,11,13,15,16,17,19,21,22,23,24,29,31,35,37,38,43,46,49,51,52,53,54,55,56,57,58,59,61,68],"nx_to_pandapow":[55,57,58,59,60,61,67,68],"nyi":[50,76],"nyiso":[0,3,4,27,31,37,38,41,43,48,67,68,73,74],"o":76,"obj":[22,46],"object":[2,6,8,11,14,16,17,18,21,22,26,39,46,54,61,68,70,72],"observ":[3,4,27,31,37,38,41,43,68,72,73,74,76],"obtain":[31,43,48,68,72,73,74,76],"occasion":72,"occur":72,"offset":[28,31,42,43],"oh":23,"oh1":23,"oh2":23,"ok":[55,61],"omega":72,"omiss":72,"on_select":[13,49],"onc":[8,26,73],"one":[0,2,6,8,9,11,12,13,16,21,22,25,26,28,31,32,33,34,35,40,42,43,44,45,46,49,52,59,60,62,64,67,68,70,72,73,74,76],"onli":[3,9,10,11,28,29,30,31,32,35,37,42,43,44,46,60,62,68,72],"open":[11,13,31,49,64,67,68,72],"oper":[11,12,21,22,31,32,33,35,43,44,46,60,68,72,73,74,76],"opertaion":62,"opposit":[36,47],"optim":[3,14,31,32,37,39,43,44,55,68,70,76],"optima":[3,31,37,43,68,69],"optimis":[0,67],"optimum":[31,32,43,44],"option":[0,3,4,6,7,8,11,13,14,17,19,20,21,22,24,26,27,28,31,32,34,35,37,38,39,41,42,43,44,45,46,48,49,55,68],"orang":[56,57,62],"orchestr":0,"order":[4,11,12,31,33,38,43,72,73,74,76],"org":[3,4,37,38],"organiz":31,"origin":[27,31,41,43,52,69,70,73],"os":[51,55,56,59,61,62],"otherwis":[27,31,41,43,68,72,73,76],"outlier":[4,31,38,43,68,74,76],"outlin":69,"output":[0,4,8,24,26,28,31,35,38,42,43,46,52,55,57,58,60,61,67,68,73,76],"output_dir":[0,21,22,35,46,55,60,67,68],"output_nam":[21,22,35,46,55,60,68],"outsid":[4,31,38,43,72,73],"overby":[50,76],"overhaul":73,"overhead":23,"overlaid":[5,7,11,31,68],"overlap":[5,7,11,31,68,76],"overlay":[3,11,13,31,37,43,49,68],"overload":[31,43,48,68,73],"overload_b":[31,43,48,68],"overly":73,"overridden":55,"p":[4,5,7,8,11,14,20,21,26,27,31,32,38,39,41,43,44,48,52,53,54,55,57,68,72,73,74,76],"p_":[11,27,31,41,43,68,72,73,74],"p_act":62,"p_bar":[4,31,38,43,68],"p_bar_gn_max":[4,31,38,43],"p_bar_ln":[31,43],"p_c":69,"p_cap":[4,31,38,43],"p_count":[20,21],"p_d":52,"p_g":[27,69,73,74],"p_gen":17,"p_i":[11,73],"p_i_j":[31,32,43,44,68],"p_j_i":[31,32,43,44,68],"p_l":[69,73,74],"p_load":[17,31,43],"p_lv":52,"p_mw":[15,16,17,19,21,53,54,55,60,68],"p_pre":62,"packag":[55,64,67],"pad":[31,32,43,44],"pagani":[50,71,72],"page":[1,73,74],"pair":[3,11,12,25,27,28,31,33,37,40,41,42,43,48,62,68,70,73,76],"pairwis":[11,12,31,33],"panda":[0,7,11,31,57,58,62],"pandapow":[0,8,16,21,22,26,35,46,52,54,55,64,67,68,71,72,74],"pandapower_to_feed":[0,16,21,52,54,68,72],"pandapower_to_nx":[57,58,67,68],"pandapower_to_pypowsybl":[55,57,58,59,61,67,68],"pandapowernet":[16,21,22,35,46,60,68],"paper":[3,18,31,32,37,43,44,54,68,73,74,76],"param":[0,10,11,14,19,21,22,24,30,31,32,39,44,52,53,54,55,57,58,59,61,62,64,67,68],"paramet":[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,52,57,58,59,61,62,64,67,68,69,70,71,72,73,76],"parameter":[35,46,60],"parameteris":[35,46,68],"parametr":[15,22],"parent":[3,31,37,43,68,69],"pareto":[48,72],"part":[5,7,67,70],"partial":[27,31,41,43,67,68,73],"particip":[27,31,32,41,43,44,76],"particular":[74,76],"partit":[0,4,27,31,36,38,41,43,47,67,68,74,76],"pass":[17,21,60,68],"past":72,"path":[0,2,5,6,7,8,11,21,22,25,26,31,34,40,45,46,51,52,54,55,56,57,58,59,61,62,68,72,73,76],"pattern":[72,73],"paul":[50,76],"pd":[5,7,11,31,57,58,62,68],"pdf":[3,4,14,17,21,31,32,37,38,39,43,44,68,70,74],"pdfs":70,"pearson":[4,31,38,43,68,70,73,74],"pegas":[64,66,73],"pegase9241_syn":58,"pegase9241_syn_cgm":58,"penalti":[14,39],"per":[0,5,7,11,12,13,15,16,21,22,23,24,25,28,31,32,33,40,42,43,44,49,53,54,59,60,61,62,67,68,73,76],"percent":76,"percentag":[69,76],"perfect":76,"perform":[2,6,10,11,30,31,34,45,55,69,70,72,73],"perhap":[5,7],"peripher":70,"permut":70,"perspect":[50,72,76],"perturb":73,"pesgm":[50,73,76],"pf":[16,19,21,31,43,53,54,68,74],"pf_cdf":68,"pf_max":[31,43,68],"pf_min":[31,43,68],"pf_ref":54,"pf_syn":54,"pf_val":53,"pg":[11,57,58,61],"pg_max":[0,4,27,31,38,41,43,56,57,58,61,68],"pg_tot":[4,31,38,43,68],"pgmax":[4,31,38,43,68],"phase":[11,12,28,31,33,42,43,48,62,68,73,74],"phasetophas":[31,43,68],"phi":73,"phi_l":73,"physic":[72,73],"pi":[53,54,72],"pick":[19,21,72],"pickl":[0,8,21,22,26,35,46,57,58,60,67,68],"piecewis":[3,31,37,43,70],"pinar":[50,76],"pip":0,"pipelin":[3,4,11,19,21,22,27,31,35,37,38,41,43,46,48,53,54,55,59,60,61,64,66,68,72],"pl":[0,11,27,31,41,43,56,57,58,61,68],"pl_tot":[31,43],"place":[3,11,13,28,31,34,37,42,43,45,49,76],"placement":[70,73],"plantenga":[50,76],"plot":[0,2,3,5,6,7,10,11,13,30,31,37,43,49,51,54,56,62,68],"plot_all_level":[10,11,30,31],"plot_all_levels_comparison":[5,7,11,31,57,68],"plot_bus_typ":[11,13,31,49,51,57,68],"plot_degree_comparison":[5,7,11,31,52,54,57,58,59,61,68],"plot_degree_distribut":[2,6,11],"plot_entropy_pdf":[3,31,37,43,51,68],"plot_grid":[0,11,13,31,49,52,53,54,55,57,60,61,62,67,68],"plot_imped":[11,13,31,49,54,57,68],"plot_interact":[11,13,31,49,68],"plot_interactive_bus_typ":[11,13,31,49,68],"plot_interactive_voltage_level":[11,13,31,49,68],"plot_level_topology_comparison":[5,7,11,31,57,68],"plot_load_gen_bubbl":[11,13,31,49,57,68],"plot_subgraph":[11,13,31,49,62,68],"plt":[52,53,54,55,56,57,61,62],"plus":72,"pm":[31,32,43,44,68],"pmf":[0,27,31,41,43,48,67,68],"pn":[52,54,55,57,58,60],"point":[17,21,31,43,48,55,61,64,66,68,74,76],"poisson":[0,18,21,31,32,35,43,44,46,52,60,64,67,68,72],"poland":76,"poly_cost":57,"pool":[69,76],"poor":52,"popul":[3,31,37,43,68,69],"population_s":[3,31,37,43,51,68],"port":[3,4,11,14,27,31,37,38,39,41,43,48,69,70,74],"pos":[11,13,31,49,52,54],"pos_clc":52,"pos_sw":52,"pose":58,"posit":[3,4,15,16,17,19,20,21,31,37,38,43,68,70],"possibl":[4,31,38,43,70],"power":[2,3,5,6,7,8,9,10,11,12,13,14,15,16,18,19,21,23,26,27,28,29,30,31,32,33,35,36,37,39,41,42,43,44,46,47,48,49,50,51,52,53,54,56,57,58,62,64,65,68,69,77],"powergrid":[0,55],"powergrid_synth":[0,1,51,52,53,54,55,56,57,58,59,60,61,62,64,67,68,72],"powergridgener":[0,28,31,32,42,43,44,51,52,56,59,61,62,64,67,68],"powergridgraph":[0,9,11,24,28,29,31,35,42,43,46,68,72],"powergridsynth":[0,31,57,58,60],"powerlawclip":[15,18,21,68],"pp":[0,3,22,31,37,43,54,55,57,58,59,60,61,67,68],"ppl":[55,57,58,59,61],"ppl_net":[57,58,59],"pr":[4,31,38,43,74,76],"practic":55,"pre":[0,4,21,22,31,35,38,43,46,60,68],"preced":[21,22,35,46,68],"predecessor":[19,52,72],"predomin":72,"prefer":[11,13,31,34,45,49,62,69,76],"preferenti":[3,24,31,37,43,76],"preliminari":72,"prepar":[34,45],"preprint":[50,74,76],"preprocess":[0,1,43,76],"preprocessor":[25,28,31,34,40,42,43,45],"prescrib":[0,24,51,56,67],"prescribed_degre":62,"presenc":[70,76],"present":[9,11,31,52,68,70],"preserv":[4,31,38,43,48,52,68,74],"prevent":69,"previous":[51,56,73,74],"primari":72,"prime":74,"principl":[3,31,37,43,68,69,72,73],"print":[2,5,6,7,11,14,31,39,51,52,53,54,55,56,57,58,59,60,61,62,68],"print_level_metr":[5,7,11,31,57,58,68],"print_metric_comparison":[5,7,11,31,52,54,57,68],"prior":72,"prioriti":[22,46],"prob":[14,31,32,39,43,44],"prob_bound":[14,39],"probabilist":[31,32,43,44],"probabl":[0,4,14,17,20,21,23,31,32,38,39,43,44,52,62,67,68,70,72,73,74,76],"procedur":[4,31,34,38,43,45,48,68,69,70,73,74],"proceed":[36,47,72,73,74],"process":[50,72,73,76],"produc":[3,4,16,17,21,31,34,37,38,43,45,52,62,67,68,73,76],"profil":[0,52,60,67,71],"progress":[14,39],"project":[62,67],"prolifer":69,"prop":53,"properti":[2,3,6,9,11,19,20,21,24,31,37,43,55,68,74,76],"proport":[3,4,11,13,25,31,37,38,40,43,49,68,69,73,74,76],"propos":[51,69,70,74,76],"props_ref":[54,55],"props_syn":[54,55],"propto":[14,31,32,39,43,44,72,76],"provid":[2,4,5,6,7,11,15,20,25,31,32,34,35,38,40,43,44,45,46,57,58,60,64,65,66,67,68,70,72,76],"proxi":[52,72],"pr\u00fcfer":24,"pseudo":69,"pss":[0,8,26,46,55,57,58,60,61,67,68,72],"psse":[35,46,60,68],"public":[22,35,46],"pump":[27,31,41,43,68,73],"pure":52,"purpos":[52,62,72,73],"purvin":[50,76],"pv":[0,72],"py":[0,55,60,67,69,70,73,74],"pyplot":[6,7,11,31,52,53,54,55,57,61,62],"pypowsybl":[0,8,16,21,22,26,46,58,60,63,64,66,67,68,72,74],"pypowsybl_jupt":57,"pypowsybl_jupyt":[57,59],"pypowsybl_to_feed":[0,16,21,55,68,72],"pypowsybl_to_nx":[61,67,68,72],"pytest":0,"python":[51,56,67],"python3":55,"q":[20,21,72],"q_":74,"q_count":[20,21],"q_l":74,"q_mvar":[19,21,60,68],"ql":[0,31,43,61,68,74],"qquad":[11,27,41,72,73],"quad":[14,39,73,74],"qualiti":72,"quantifi":[3,31,37,43,68,70,72],"quantit":[70,76],"quantiti":72,"r":[0,3,4,23,31,37,38,43,48,50,53,54,55,61,68,69,70,72,73,74,76],"r_":[3,31,37,43,69,70],"r_c":[3,31,37,43,68],"r_cc":[3,31,37,43],"r_g":[3,31,37,43,68],"r_gc":[3,31,37,43],"r_gg":[3,31,37,43],"r_gl":[3,31,37,43],"r_k":[3,31,37,43,70],"r_l":[3,31,37,43,68,73],"r_lc":[3,31,37,43],"r_ll":[3,31,37,43],"r_ohm":[19,21,23,68],"radial":[0,9,11,13,19,21,24,31,49,50,53,54,67,68,71,72],"radial_tre":54,"radian":11,"radius_step":[11,13,31,49],"rais":[3,21,22,31,35,37,43,46,68],"rand":[31,43,48,68],"random":[0,3,4,17,19,21,22,23,24,25,27,28,31,32,34,35,36,37,38,40,41,42,43,44,45,46,47,48,52,60,62,68,69,70,72,73,74,77],"randomst":24,"rang":[4,31,38,43,48,52,53,54,55,57,72,73,74,76],"rank":[3,31,37,43,68,69],"raphson":[0,57,58,67],"rate":[23,69,72,73],"rather":[23,31,32,43,44,68,72],"ratio":[0,3,18,19,21,23,31,35,37,43,46,48,57,67,68,69,70,72,76],"ratio_typ":[3,31,37,43],"raw":[3,4,20,21,31,37,38,43,68,70,76],"raw_feed":[52,54],"rc":74,"re":[20,21],"reach":58,"reactanc":[11,73,76],"reactiv":[0,31,43,67,68,72,76,77],"reader":[51,56],"readi":[15,21,31,32,43,44,68],"real":[0,2,3,4,5,6,7,9,11,15,19,21,31,36,37,38,43,47,54,57,58,62,67,68,70,72,73,74,76,77],"realis":[36,47],"realism":[50,76],"realist":[0,3,4,12,17,21,31,33,37,38,43,51,52,62,67,68,70,71,73,74],"realiz":[25,40,76],"reason":[73,74],"reassembl":[4,31,38,43],"reassign":73,"receiv":[27,31,41,43,68,72,73],"receptor":[3,31,37,43,68,69],"recogn":70,"recommend":[64,66],"reconfigur":72,"rect":[13,49],"red":[11,13,31,49,53,57,68,73],"redefin":70,"redirect_stdout":52,"redistribut":72,"redraw":76,"reduc":[31,43,48,70,72,73],"reduct":74,"reed":48,"ref":[52,54,55],"ref_dorf":52,"ref_feed":[52,54,55],"ref_feeders_raw":55,"ref_graph":[5,7,11,31,54,57,58,68],"ref_label":[5,7,11,31,52,54,57,58,68],"ref_lv":52,"ref_synthesi":60,"ref_sys_id":[4,11,27,31,35,38,41,43,46,48,56,57,58,60,68],"refer":[0,3,4,5,7,11,12,15,16,17,20,21,22,23,24,27,31,33,35,37,38,41,43,46,48,51,56,57,58,59,62,63,64,67,69,71,72,73,74,76,77],"reference_bus_id":[57,58,59],"reference_cas":[0,21,22,35,46,55,60,67,68],"reference_data":[0,4,31,38,43,74],"reference_fil":[21,22,46,68],"reference_net":[21,22,35,46,60,68],"refin":[31,43,48,68],"refine_topolog":[31,35,43,46,48,60,68],"reflect":[3,31,37,43,70,72],"region":[70,72,74],"regular":[17,21],"reject":76,"relat":[3,5,7,11,31,37,43,57,58,59,61,62,68,70,72,74,76],"relationship":70,"relative_hausdorff":62,"releas":59,"relev":72,"reli":[4,31,38,43],"reload":[55,61],"remain":[19,21,27,31,36,41,43,47,64,66,72,73,76],"remaind":[27,31,41,43,68],"remark":76,"remov":[11,19,21,31,35,43,46,48,51,52,56,57,58,59,60,61,62,68,73,76],"reparametr":72,"repeat":[31,43,48,73,76],"replac":[4,31,38,43,74],"replic":[36,47,76],"report":[5,7,11,31,62,68],"repositori":0,"repres":[2,3,4,6,11,27,31,37,38,41,43,68,70,73,74],"represent":[9,11,31,68],"reproduc":[0,17,19,21,22,24,27,28,31,32,35,41,42,43,44,46,48,60,67,68,73],"request":[52,55],"requir":[3,21,22,27,31,35,37,41,43,46,52,55,62,68,69,72,73,76],"res_bus":[55,57,58,59,60,61],"res_ext_grid":[57,58],"res_gen":[57,58],"res_lin":[57,58],"res_load":[57,58],"res_shunt":57,"res_trafo":[57,58],"resampl":[31,43,48,72],"rescal":[4,31,38,43,73,74],"reserv":[57,58,60],"reshap":62,"resist":73,"resolv":[22,46],"respect":[4,19,21,31,32,38,43,44,68,69,72,76],"respect_switch":57,"respons":[8,26],"restrict":[70,72],"result":[5,7,8,11,26,28,31,32,35,42,43,44,46,54,55,57,58,60,61,68,72,74,76],"return":[2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,62,68,69,72],"return_count":52,"reveal":73,"revers":[27,28,31,41,42,43,56,57,58,68],"revert":73,"rh":[5,7,11,31,57,58,59,61,62,68,76],"rho":[4,31,38,43,68,70,73,74],"right":[11,13,31,49,69,70,72],"rise":70,"rmse":70,"rng":24,"robert":[50,74],"role":[3,31,37,43,70],"root":[9,11,13,15,16,19,21,24,31,49,52,53,54,55,68,72],"root_bus":55,"root_c":52,"root_cd":52,"root_clc":52,"rotat":[11,13,31,49,55],"rough":[72,76],"round":[3,4,31,34,37,38,43,45,61,62,68,69,72,74,76],"rout":[25,40],"routin":[0,15],"row":[4,11,13,31,38,43,49,52,54,57,61,62,68,73,74],"rte":[64,66],"ruisheng":[50,76],"run":[0,3,4,5,7,10,11,19,21,22,27,28,30,31,35,37,38,41,42,43,46,48,51,55,56,57,58,60,61,62,64,66,67,68,73,76],"run_ac":[0,55,57,58,59,61,67],"run_dc":[0,57,58,67],"run_full_comparison":[5,7,11,31,68],"run_full_report":[10,11,30,31,62],"run_global_analysi":[10,11,30,31],"run_level_analysi":[10,11,30,31],"run_setup":[25,28,31,34,40,42,43,45],"rundcpp":[0,55,57,58,59,61,67],"runpp":[0,57,58,60,67],"runtimewarn":[55,60],"rv":55,"r\u00e9nyi":76,"s":[0,3,4,8,19,21,25,26,31,34,37,38,40,43,45,48,50,52,53,54,55,57,58,61,67,68,69,72,73,74,76],"s_":[11,23,72,73],"sadeghian":[11,27,31,41,43,48,50,68,73],"safeti":68,"sampl":[0,3,4,17,19,21,23,25,31,32,37,38,40,43,44,48,52,53,61,67,68,69,70,72,74,76],"sanchez":[50,76],"sandia":[14,39],"satisfi":[24,73],"save":[8,26,55,61,68],"saw":56,"sc":55,"scaglion":[50,71,72,76],"scalabl":[50,76],"scalar":[55,72],"scale":[3,4,5,7,10,11,13,14,15,18,21,23,27,30,31,37,38,39,41,43,49,51,52,56,57,62,68,69,72,74,76],"schweetzerfeedergener":[0,15,16,19,21,52,53,54,55,68,72],"schweitzer":[9,11,15,16,17,18,19,20,21,22,24,31,50,64,67,68,71,72,76],"scienc":72,"scientif":[50,76],"scipi":[0,11,17,21,55,62,68],"score":[3,14,31,37,39,43,51,55,56,57,58,59,60,61],"scratch":60,"seagreen":53,"search":[3,14,31,37,39,43,51,68,70,72],"sec":[27,31,41,43,48],"second":[72,76],"secondari":72,"section":[17,20,27,31,32,34,36,41,43,44,45,47,48,55,61,68,72,76],"sector":[11,13,31,49,67],"see":[0,3,14,25,31,32,34,36,37,39,40,43,44,45,47,52,60,67,68,69,70,72],"seed":[0,17,19,21,22,23,24,28,31,32,35,42,43,44,46,52,53,54,55,57,58,59,60,61,62,64,67,68],"seed_i":52,"segment":[3,31,37,43],"select":[3,4,11,13,21,22,27,31,34,35,37,38,41,43,45,46,49,50,68,69,71,72,73,76],"self":[3,5,7,11,17,21,25,31,37,40,43,64,68,76],"sensibl":54,"sensit":76,"separ":[16,21,24,68,70,72],"sept":[3,31,37,43,68],"seq_a":62,"seq_b":62,"sequenc":[11,12,15,16,17,19,21,22,24,25,28,31,32,33,34,35,36,40,42,43,44,45,46,47,52,62,68,76],"sequenti":[27,31,41,43,72],"serv":72,"seshadhri":[50,76],"set":[4,14,15,21,22,25,31,32,34,38,39,40,43,44,45,48,50,54,55,62,64,66,68,69,70,72,73,75,76,77],"set_node_attribut":[51,56,57,58,59,61],"set_titl":[52,53,54,55,62],"set_xlabel":[52,53,55,62],"set_xtick":[54,55,62],"set_xticklabel":[54,55,62],"set_ylabel":[52,55,62],"setup":[0,34,45,69,76],"seven":[31,43,48,68],"sever":72,"sew18":73,"seyi":[50,69,70,73,74],"sg_bus_typ":[3,37,69,70],"sg_flow_lim":[31,43,48,68,73],"sg_gen_dist":[27,41],"sg_line":[31,43,48,68,73],"sg_refsys_stat":[4,11,31,38,43,74],"sgen":[54,55],"shape":[3,4,14,27,31,37,38,39,41,43,48,52,76],"share":[11,15,31,43,76],"sharey":52,"shety":[50,76],"shift":[15,28,31,42,43],"ship":55,"short":[21,22,46,68,73,76],"shorter":[23,53,73],"shortest":[2,6,11,51,56,62,76],"show":[11,13,31,49,51,52,53,54,55,56,57,61,62,64,68,70,72,73,74],"show_bus_typ":[11,13,31,49,68],"show_imped":[11,13,31,49,68],"show_label":[11,13,31,49,68],"show_lin":[5,7,11,31,54,57,58,68],"show_pvalu":[5,7,11,31,68],"showcas":59,"shown":[57,58],"shuffl":[24,31,32,43,44],"shunt":57,"siam":[50,76],"side":[0,5,7,11,13,24,31,49,55,68,70,72],"sigma":[3,31,37,43,48,68,70,72,73],"sigma_1":72,"sigma_2":72,"sigma_w":69,"sigma_z":73,"signific":[62,72,73],"sim":[31,43,48,68,72,73,74,76],"similar":[22,35,46,60,62,72,73,74,76],"simpl":[31,32,35,43,44,46,60,68,76],"simple_plot":[54,57],"simplifi":[15,70,72],"simul":[4,31,38,43,67,69],"sin":[31,43,48,68,73],"sinan":[50,76],"sinc":[52,72,76],"singl":[0,5,7,10,11,17,18,19,21,22,30,31,34,35,36,45,46,47,52,54,55,60,64,66,68,72,76],"single_source_shortest_path_length":52,"singular":[17,21],"site":55,"six":70,"size":[2,3,6,11,13,14,17,21,24,27,31,32,35,37,39,41,43,44,46,48,49,51,52,54,55,56,57,61,62,68,69,70,72,73,74,76],"skyblu":[56,57],"slack":[11,55,73],"slack_bus_result":[57,58,59],"slackbusresult":[57,58,59],"slight":61,"slow":74,"small":[27,31,41,43,54,61,69,72,73,74,76],"smaller":[69,72,76],"smirnov":[5,7,11,31,68,76],"snap":59,"snapshot":59,"societi":[50,73,76],"solut":[3,31,37,43,68,69],"solv":[11,73],"solver":[11,57,58,60,61,68],"someth":57,"sort":[3,4,9,11,27,31,37,38,41,43,48,54,55,56,57,58,60,61,62,68,69,72,73,74,76],"sorted_gen":[56,57,58],"sourc":[6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,31,37,38,39,40,41,42,43,44,45,46,47,48,55,61,67,68,72],"source_format":[57,58],"space":[17,20,21,68,74],"span":[25,40,76],"spars":[11,73],"sparsiti":52,"spatial":[0,62],"spec":[24,32,35,44,46,60,68],"specif":[0,4,5,7,8,9,11,13,24,26,31,35,38,43,46,49,54,68,69,70],"specifi":[0,9,11,14,29,31,32,35,39,43,44,46,60,62,67,68,71,73,76],"spectrum":70,"sphinx":1,"split":72,"spread":[31,43,48,68,73],"spsolv":11,"sqlite":[0,8,21,22,26,35,46,57,58,60,67,68],"sqrt":[23,55,72,76],"squar":[11,13,14,31,39,49,68],"ssmp17":[71,72],"stab_param":[31,43,48,68],"stabil":73,"stabl":[0,3,31,37,43,48,67,68,70],"stage":[0,4,25,31,34,36,38,40,43,45,47,60,64,66,67,68,74,76],"standard":[3,8,23,26,31,35,37,43,46,55,57,58,60,61,67,68,69,72,76],"star":[0,28,31,32,35,36,42,43,44,46,47,51,56,60,62,64,67,68],"start":[28,42,51,52,54,56,57,58,59,60,61,62,64,66],"stat":[10,11,17,21,30,31,51,55,62,68],"static":[11,13,31,49,68],"stationari":70,"statist":[0,4,5,7,11,14,18,20,22,24,27,31,35,38,39,41,43,46,48,50,51,52,55,57,58,59,60,61,62,67,68,69,77],"statistc":74,"status":[55,57,58,59,61],"status_text":[57,58,59],"std":[23,51,52,54,55,56,57,58,59,60,61],"std_w":[3,31,37,43],"steelblu":[52,53,54],"steep":76,"step":[4,15,19,21,22,31,34,38,43,45,48,51,55,60,64,66,68,73,76],"stephen":[50,76],"stochast":71,"stop":70,"storag":[27,31,41,43,68,73],"store":[68,74],"str":[2,3,6,7,8,9,11,13,14,17,20,21,22,23,31,32,35,37,39,43,44,46,49,52,54,55,68],"strategi":[31,43,68,74],"strengthen":73,"strict":52,"string":[8,26,68],"stringio":52,"strong":[11,13,31,49,68,72],"structur":[0,20,21,22,35,36,46,47,50,60,62,68,72,73,76],"studi":74,"style":[51,56,57],"sub":[51,56,62,72],"sub_1_0":59,"sub_6692_0":58,"sub_71_0":57,"sub_lv0":62,"sub_lv1":62,"subclass":[0,72],"subdiamet":[25,34,40,45,76],"subgraph":[9,10,11,12,13,25,28,29,30,31,32,33,34,36,40,42,43,44,45,47,49,52,62,68,72,76],"subpackag":[31,72],"subplot":[10,11,30,31,52,53,54,55,56,57,62],"subsequ":[70,73],"substanti":76,"substat":[59,72,76],"subtract":55,"suffici":[36,47,72,76],"suggest":[31,32,43,44,68,76],"suitabl":[11,13,16,21,31,49,52,68],"sum":[3,4,20,21,24,31,37,38,43,51,55,56,57,58,68,72,73,74,76],"sum_":[3,31,36,37,43,47,70,72,73,74,76],"sum_i":[34,45,76],"sum_j":[11,73,76],"sum_n":72,"summari":[2,6,11,16,21,68],"sup_":76,"super":[4,27,31,38,41,43,68,74],"suppli":[3,21,22,31,37,43,55,68],"support":[3,8,9,11,14,15,21,22,24,26,29,31,32,34,35,37,39,43,44,45,46,68,72],"suppress":52,"suptitl":[52,53,54,62],"surviv":[3,31,37,43,68],"suscept":[11,73],"sv":55,"svg":57,"sw_gen":52,"sw_gen2":52,"sw_stat":52,"swap":[0,11,31,43,48,67,68,72],"switch":[16,21,54,59,61,68,72],"symbol":72,"symmetr":[36,47,76],"syn_feed":55,"syn_synthesi":60,"synchronous_component_num":[57,58,59],"syngrid":[3,4,11,27,31,37,38,41,43,48,68,69,70,73,74],"synth_graph":[5,7,11,31,54,57,58,68],"synth_label":[5,7,11,31,52,54,57,58,68],"synthes":[0,1,21,43,51,61,64,66,67,68,71,74,77],"synthesi":[11,18,19,21,22,31,35,43,46,59,63,66,72,75],"synthesis":[60,67],"synthesize_distribut":[0,21,22,55,67,68],"synthet":[0,2,3,4,5,6,7,8,10,11,12,13,20,21,22,23,24,26,27,28,30,31,32,33,35,37,38,41,42,43,44,46,48,49,50,59,61,64,65,67,68,69,70,71,73],"synthetic_500":60,"synthetic_feed":[21,22,68],"synthetic_graph":[57,58],"synthetic_grid":[35,46,68],"synthetic_net":[57,58],"sys":[51,56,62],"syst":[3,31,37,43,68],"system":[0,3,4,8,11,24,26,27,31,35,37,38,41,43,46,48,50,56,57,58,59,60,61,67,68,70,71,72,76],"systhet":76,"t":[3,15,18,21,28,31,36,37,42,43,47,54,55,68,70,72,73,74,76],"t_i":[31,32,43,44,76],"t_i_j":[28,31,42,43,68],"t_j":[31,32,43,44],"t_j_i":[28,31,42,43,68],"t_xi":[36,47],"t_yx":[36,47],"tab_2d":[4,31,38,43,68],"tab_2d_flbeta":[31,43,48,68,73],"tab_2d_load":[31,43,68,74],"tab_2d_pg":[27,31,41,43,68,73],"tab_2d_pgmax":[4,31,38,43,68,74],"tab_fl_beta":[31,43,48,68],"tabl":[0,4,5,7,11,18,19,21,22,27,31,35,38,41,43,46,48,52,54,55,57,58,60,67,68,72,73,74],"tabular":[5,7,11,31,68],"tail":[4,27,31,38,41,43,68,72,73,74],"take":[21,22,32,35,44,46,62,68,76],"taken":[18,21,68],"tamara":[50,76],"tan":[31,43,68,72,74],"target":[0,3,4,14,19,21,24,27,31,32,35,37,38,39,41,43,44,46,51,52,54,56,57,58,59,60,61,68,70,72,73,74,76],"target_avg":[14,39],"target_depth":24,"task":52,"tempfil":61,"tend":[27,31,41,43,70,73,74],"term":[14,39,70,72,73,74,76],"test":[55,61,64,66,76],"test_net":52,"texa":76,"text":[2,3,6,11,14,18,21,27,31,34,37,39,41,43,45,48,68,69,70,72,73,74,76],"theorem":70,"theoret":24,"theori":[31,43,68,76],"therefor":69,"thermal":[0,23,48,77],"theta":[11,31,43,48,72,73,74],"theta_":[31,43,48,73],"theta_i":[11,73],"theta_j":[11,73],"thicker":73,"third":[4,31,38,43,68,72],"thoma":[4,31,38,43,50,68,74,76],"three":[0,3,4,16,21,25,27,31,37,38,40,41,43,51,52,67,68,70,72,76],"threshold":[3,18,19,21,31,37,43,48,68,69,72,73],"throughout":72,"thus":[72,76],"ti":[50,76],"tight":[72,76],"tight_layout":[52,53,54,55,61,62],"tighten":[31,43,48],"tild":70,"time":[3,11,24,27,31,37,41,43,48,68,69,70,73,74],"titl":[0,2,5,6,7,11,13,31,49,51,52,53,54,55,56,57,60,61,62,67,68],"tlocationscaleparam":[15,18,21,68],"tmp":72,"to_cgm":[0,8,26,57,58,61,67,68],"to_excel":[0,8,26,57,58,67,68],"to_json":[0,8,26,57,58,61,67,68],"to_matpow":[0,8,26,57,58,67,68],"to_pickl":[0,8,26,57,58,67,68],"to_pss":[0,8,26,57,58,67,68],"to_pypowsybl":[0,8,26,57,58,61,67,68],"to_sqlit":[0,8,26,57,58,67,68],"todd":[50,76],"todo":[5,7],"togeth":73,"toggl":[27,31,41,43,68],"toler":[27,31,41,43,68,73,74],"tomato":53,"tool":[2,6],"toolbox":[3,4,31,37,38,43,48,68,69,70,73,74],"top":[3,11,13,31,37,43,48,49,56,57,58,68,69,73,74],"topic":[50,71,72],"topolog":[0,2,3,5,6,7,10,11,12,13,14,24,28,30,31,32,33,35,37,39,42,43,44,46,48,49,50,55,59,60,61,63,64,66,67,69,72,74,75,77],"topologygener":[51,60],"tot":[73,74],"total":[0,4,9,11,19,20,21,22,27,31,38,41,43,51,53,54,55,56,57,58,59,60,61,68,70,72,73,74,76],"total_cap":[57,58],"total_gen":[4,17,21,31,38,43,55,56,57,58,68],"total_gen_capac":[31,43],"total_gen_mw":[9,11,16,19,20,21,22,31,52,53,54,55,68,72],"total_length_km":[20,21,53,54,55],"total_lin":[57,58],"total_load":[17,21,31,43,55,56,57,58,68],"total_load_mw":[0,9,11,16,19,20,21,22,31,52,53,54,55,67,68,72],"total_units_count":[27,31,41,43],"toward":[28,31,36,42,43,47,51,68,72,73],"tpwrs":[3,37],"trafo":[55,57,58,59,61],"train":72,"tran":[3,31,37,43,68],"trans_alloc":[57,58],"trans_gen":52,"transact":[50,69,70,76],"transform":[0,11,12,16,21,24,28,31,32,33,35,36,42,43,44,46,47,51,52,54,55,56,57,58,59,60,61,67,68,72,73,74],"transformer_degre":[0,11,12,28,31,32,33,42,43,44,57,58,59,61,62,64,67,68],"transformer_edg":[0,1,43],"transformerconnector":[28,31,36,42,43,47],"transit":[52,54,57,58,70,72],"transmiss":[1,9,11,13,23,24,31,35,49,50,51,57,58,59,60,70,72,74,75,76],"transmissiongrid":[0,9,11,31,59,61,68,72],"transmissionlinealloc":[0,11,31,43,48,56,57,58,59,61,67,68],"travers":[27,31,41,43,48],"treat":[72,76],"tree":[0,9,11,13,19,21,24,31,49,52,54,67,68,71,72,76],"trend":[70,72],"tri":[52,55,59,61,72],"triangl":76,"triangul":76,"trip":61,"tripl":[17,21,68],"trivial":[3,4,31,37,38,43,68,70,73,74],"true":[2,5,6,7,8,9,10,11,14,19,21,22,24,26,28,30,31,35,39,42,43,46,48,51,52,53,54,55,56,57,58,59,60,61,62,68,72],"truncat":69,"trunk":24,"tsos":61,"tt":[31,43,48,73],"tunabl":52,"tupl":[3,6,7,11,13,20,25,31,32,35,36,37,38,39,40,41,43,44,45,46,47,48,49,60,68],"turbin":72,"turn":73,"two":[3,5,7,11,14,15,16,18,20,21,22,24,31,32,35,36,37,39,43,44,46,47,50,52,55,56,60,61,68,70,72,73,74,76],"type":[0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,52,53,54,55,59,61,62,64,66,67,68,71,73,74,75,76,77],"type_conn":68,"type_count":53,"type_gen":68,"type_load":68,"types_ref":[54,55],"types_syn":[54,55],"typic":[23,52,70,74,76],"u":[11,23,25,28,31,36,40,42,43,47,48,61,68,69,72,73,74],"uct":[0,8,26,46,55,57,58,61,67,68],"ug":23,"ug1":23,"ultim":67,"unambigu":72,"unassign":[4,31,34,38,43,45,74],"unavail":62,"unbound":72,"unchang":70,"uncommit":[27,31,41,43,67,68],"undefin":76,"undergo":69,"underground":[23,72],"underlying":60,"undirect":[74,76],"unifi":[57,58],"uniform":[4,15,18,21,23,27,31,34,38,41,43,45,68,72,73,74],"union":76,"uniqu":[52,72],"unit":[4,11,27,31,38,41,43,68,74,76],"unitari":74,"unknown":55,"unlik":[23,76],"unpack":[31,32,43,44,68],"updat":69,"upper":[11,13,14,31,39,49],"upstream":72,"us":[70,76],"use":[0,2,3,4,5,6,7,8,10,11,13,14,15,17,18,19,21,22,24,25,26,28,30,31,32,34,35,37,38,39,40,42,43,44,45,46,48,49,50,51,52,55,56,61,62,64,65,67,68,69,70,71,72,73,74,76,77],"user":[0,3,14,21,22,31,32,35,37,39,43,44,46,55,60,62,64,67,68,76],"util":[11,16,31,68,72],"uv":0,"v":[0,11,23,25,28,31,34,36,40,42,43,45,47,48,54,61,68,69,72,76],"v2":[57,61],"v_":[23,72],"v_nom_kv":[19,21,22,53,54,68],"va_degre":[55,59,60,61],"val":[52,53,54,55,57,61],"valid":[0,20,21,22,31,43,50,52,54,67,69,73],"validate_tre":[20,21,52,53,54],"valu":[0,3,4,5,7,8,11,14,18,19,20,21,23,26,27,31,37,38,39,41,43,48,51,52,53,54,55,56,57,58,59,60,61,67,68,70,72,73,74,76],"valueerror":[3,21,22,31,35,37,43,46,68],"vari":[62,73],"variabl":[51,56,70,74],"varianc":[31,43,48,68,72],"variat":76,"various":[13,49],"varphi":[31,43,48,68],"varphi_x":72,"vector":[3,11,14,31,37,39,43,69,70,72,73,74],"venv":0,"verbos":[14,39,52],"veri":[52,70,73],"verifi":[61,70],"versa":76,"version":64,"versus":[70,72],"vert":76,"vertex":[25,34,40,45,62,76],"vertex_index":[34,45],"vertic":[25,34,36,40,45,47,62,76],"via":[0,3,4,8,11,15,20,21,24,25,26,27,28,31,36,37,38,40,41,42,43,47,48,54,57,58,59,60,61,64,67,68,69,72,74],"vice":76,"view":[0,9,11,29,31,68,76],"violat":[52,72],"virtual":0,"vis":60,"visual":[0,1,5,7,11,31,51,52,56,60,61,64,67,68],"visualis":[35,46,57,58],"viz":[51,52,53,54,55,57,61,62],"vl":61,"vl1":61,"vl10":61,"vl100":61,"vl101":61,"vl102":61,"vl103":61,"vl104":61,"vl105":61,"vl106":61,"vl107":61,"vl108":61,"vl109":61,"vl11":61,"vl110":61,"vl111":61,"vl112":61,"vl113":61,"vl114":61,"vl115":61,"vl116":61,"vl117":61,"vl118":61,"vl12":61,"vl12_0":61,"vl13":61,"vl14":61,"vl15":61,"vl16":61,"vl17":61,"vl18":61,"vl19":61,"vl1_0":61,"vl2":61,"vl20":61,"vl21":61,"vl22":61,"vl23":61,"vl24":61,"vl25":61,"vl26":61,"vl27":61,"vl28":61,"vl29":61,"vl2_0":61,"vl3":61,"vl30":61,"vl31":61,"vl32":61,"vl33":61,"vl34":61,"vl35":61,"vl36":61,"vl37":61,"vl38":61,"vl39":61,"vl3_0":61,"vl4":61,"vl40":61,"vl41":61,"vl42":61,"vl43":61,"vl44":61,"vl45":61,"vl46":61,"vl47":61,"vl48":61,"vl49":61,"vl5":61,"vl50":61,"vl51":61,"vl52":61,"vl53":61,"vl54":61,"vl55":61,"vl56":61,"vl57":61,"vl58":61,"vl59":61,"vl6":61,"vl60":61,"vl61":61,"vl62":61,"vl63":61,"vl64":61,"vl65":61,"vl66":61,"vl67":61,"vl68":61,"vl69":61,"vl7":61,"vl70":61,"vl71":61,"vl72":61,"vl73":61,"vl74":61,"vl75":61,"vl76":61,"vl77":61,"vl78":61,"vl79":61,"vl8":61,"vl80":61,"vl81":61,"vl82":61,"vl83":61,"vl84":61,"vl85":61,"vl86":61,"vl87":61,"vl88":61,"vl89":61,"vl9":61,"vl90":61,"vl91":61,"vl92":61,"vl93":61,"vl94":61,"vl95":61,"vl96":61,"vl97":61,"vl98":61,"vl99":61,"vl_id":61,"vm_pu":[55,60],"vn_kv":[23,57,61,68],"vol":[3,31,37,43,68],"voltag":[0,5,7,8,9,10,11,12,13,19,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,40,42,43,44,45,46,47,49,50,51,52,53,55,56,58,59,60,61,62,64,67,68,71,73,76],"voltage_level":[9,11,12,13,23,24,28,29,31,33,42,43,49,61,68,72],"vorstadtnetz":52,"vr":54,"vs":[0,11,13,23,31,49,51,52,55,56,57,68],"w":[3,25,31,37,40,43,51,55,56,57,58,59,60,61,68,70,74],"w_":70,"w_0":[3,31,37,43,68,70],"w_1":[3,31,37,43,68,70],"w_s":69,"w_sampl":[3,31,37,43,68],"w_star":[3,31,37,43],"walkthrough":[0,67],"wang":[3,4,31,37,38,43,50,68,69,70,73,74,76],"want":62,"warn":[59,61],"way":[52,61,62,76],"weak":[11,13,31,43,48,49,52,68,73],"wecc":[0,3,4,27,31,37,38,41,43,48,67,68,73,74],"weight":[0,3,4,31,35,37,38,43,46,60,68,72],"well":[0,10,11,12,30,31,33,52,57,72,74],"wherea":74,"whether":[5,7,8,10,11,13,19,21,26,30,31,49,68,72],"white":52,"whose":[3,27,31,36,37,41,43,47,48,60,62,68,72,73,76],"wider":73,"widget":[13,49],"width":[3,11,13,31,37,43,49,52,62,68],"will":[11,13,27,31,41,43,49,57,68,72],"wind":[16,21,68,72],"window":[11,13,31,49,68],"with_der":52,"with_label":52,"within":[25,27,31,40,41,43,48,68,70,72,73,76],"without":[4,21,22,31,35,38,43,46,68,69,72,74],"work":[57,58,72,74],"workflow":[22,35,46,54,55,72],"world":[2,3,5,6,7,11,31,37,43,62,68,70,72,73,74,76],"wors":[3,31,37,43,68,69],"worst":[57,76],"wrap":[54,57,58,72],"wrapper":[10,11,30,31],"write_network_area_diagram_svg":57,"written":60,"www":[31,43,68],"x":[0,11,14,23,31,36,39,43,47,48,55,56,57,58,61,62,68,72,73,76],"x0":[15,53,54],"x_":[11,72,73],"x_0":72,"x_1":[28,31,42,43,68,76],"x_i":[28,42,76],"x_j":[28,42,76],"x_k":[28,31,42,43,68,76],"x_l":73,"x_ohm":[19,21,23,68],"x_pos":54,"xiidm":[0,8,16,21,26,35,46,55,57,58,59,60,61,67,68,72],"xlabel":[56,57],"xlsx":[0,8,26,57,68],"xml":[55,61],"xu":[50,76],"y":[36,47,52,62,73,74,76],"y_l":[73,74],"yes":[51,52,54,56,57,58,62],"yet":[3,31,37,43,67,68],"yield":[74,76],"yifan":[0,11,13,31,49,68],"yifan_hu":[0,60,67],"ylabel":[56,57],"ymd18":76,"young":[50,76],"yuri":[50,76],"z":[3,4,11,13,31,37,38,43,48,49,57,68,72,73],"z_l":[73,74],"zero":[19,20,21,31,32,34,43,44,45,55,60,72,73,76],"zhenyu":[50,76],"zhifang":[50,69,70,73,74,76],"zip":52,"zone":57,"\u00e9":[50,76],"\u0151":[50,76],"\u03b1":0,"\u03b2":0,"\u03b3":0,"\u03c6":53},"titles":["Getting Started","API Reference","powergrid_synth.analysis","powergrid_synth.bus_type_allocator","powergrid_synth.capacity_allocator","powergrid_synth.comparison","powergrid_synth.core.analysis","powergrid_synth.core.comparison","powergrid_synth.core.exporter","powergrid_synth.core.grid_graph","powergrid_synth.core.hierarchical_analysis","powergrid_synth.core","powergrid_synth.core.input_extractor","powergrid_synth.core.visualization","powergrid_synth.deg_dist_optimizer","powergrid_synth.distribution.distribution_analysis","powergrid_synth.distribution.distribution_converter","powergrid_synth.distribution.distribution_input_model","powergrid_synth.distribution.distribution_params","powergrid_synth.distribution.distribution_synthesis","powergrid_synth.distribution.distribution_validation","powergrid_synth.distribution","powergrid_synth.distribution.synthesize","powergrid_synth.distribution_lines","powergrid_synth.distribution_topology","powergrid_synth.edge_creation","powergrid_synth.exporter","powergrid_synth.generation_dispatcher","powergrid_synth.generator","powergrid_synth.grid_graph","powergrid_synth.hierarchical_analysis","powergrid_synth","powergrid_synth.input_configurator","powergrid_synth.input_extractor","powergrid_synth.preprocessing","powergrid_synth.synthesize","powergrid_synth.transformer_edges","powergrid_synth.transmission.bus_type_allocator","powergrid_synth.transmission.capacity_allocator","powergrid_synth.transmission.deg_dist_optimizer","powergrid_synth.transmission.edge_creation","powergrid_synth.transmission.generation_dispatcher","powergrid_synth.transmission.generator","powergrid_synth.transmission","powergrid_synth.transmission.input_configurator","powergrid_synth.transmission.preprocessing","powergrid_synth.transmission.synthesize","powergrid_synth.transmission.transformer_edges","powergrid_synth.transmission.transmission","powergrid_synth.visualization","Bibliography","Bus Type Assignment in a Synthetic Grid","CLC for Distribution Topology Generation","Distribution Feeder Synthesis \u2014 Schweitzer et al. (2017)","Distribution Feeder Synthesis from a Reference Grid","Distribution Feeder Synthesis from pypowsybl-Supported Formats","Generation Capacities and Load Settings","IEEE grids for testing","PEGASE 9241 large-scale test","RTE 7000 test","High-Level Synthesis with synthesize()","Transmission Grid Synthesis from pypowsybl-Supported Formats","Grid Topology Generation","Distribution","Examples","Examples","Transmission","PowerGridSynth","API Reference","Artificial Immune System (AIS) for Bus Type Allocation","Bus Type Assignment based on Bus Type Entropy","Distribution Grid Synthesis","Automated generation of synthetic MV distribution feeders","Generation Dispatch and Transmission Capacity Assignment","Synthetic Generation and Load Settings","Theory","Chung-Lu-Chain grid topology generation","Transmission Grid Synthesis"],"titleterms":{"3d":53,"Between":53,"For":70,"From":0,"I":[60,61],"Some":76,"The":[70,76],"Underlying":57,"What":[70,76],"ac":59,"aggreg":[54,55],"ai":69,"al":53,"algorithm":[11,70,72,73,74,76],"alloc":[69,74],"alpha":73,"analysi":[0,2,6,52,57,58,61,68,70,72],"analyz":62,"angl":73,"api":[1,68],"area":57,"artifici":69,"assign":[51,56,57,58,68,70,72,73,74],"autom":72,"balanc":73,"base":[60,61,70,73],"basic":[51,56,62],"bibliographi":50,"branch":73,"build":0,"built":57,"bus":[51,56,57,58,60,69,70],"bus_type_alloc":[3,37],"cabl":72,"cablelength":72,"cabletyp":72,"capac":[56,57,58,73,74],"capacity_alloc":[4,38],"categori":73,"cgmes":[55,61],"chain":76,"characterist":[57,58],"chung":76,"cigr":[52,54],"class":68,"clc":[52,62,76],"clcstar":76,"clip":72,"combin":76,"commit":73,"compar":[53,54,57],"comparison":[5,7,52,53,54,55,57,61,76],"compat":[57,58],"configur":62,"connect":[62,72],"connectnod":72,"consumpt":72,"content":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"convers":68,"convert":[54,55,58,61,68],"core":[6,7,8,9,10,11,12,13,68],"correl":73,"current":72,"custom":[53,60],"d":73,"data":[57,58,59,67],"dc":73,"dcpf":73,"default":53,"defin":62,"definit":72,"deg_dist_optim":[14,39],"degre":[57,62,72,76],"develop":0,"diagram":57,"differ":61,"direct":72,"dispatch":73,"distanc":52,"distribut":[0,15,16,17,18,19,20,21,22,52,53,54,55,57,62,63,64,67,68,71,72,73,76],"distribution_analysi":15,"distribution_convert":16,"distribution_input_model":17,"distribution_lin":23,"distribution_param":18,"distribution_synthesi":19,"distribution_topolog":24,"distribution_valid":20,"diverg":[53,54,72],"document":0,"dorfnetz":52,"downstream":72,"drop":72,"edg":76,"edge_cr":[25,40],"electr":68,"emergent":[53,72],"empir":73,"ensembl":[52,53,54,55],"entropi":[69,70],"estim":69,"et":53,"evalu":72,"exampl":[57,60,64,65],"exponenti":73,"export":[0,8,26,57,58,60,61,68],"extract":[57,58],"factor":73,"feeder":[53,54,55,72],"file":[59,61],"final":69,"find":70,"fit":[53,54,55],"flow":[0,55,59,60,61,67,73],"format":[0,54,55,57,58,60,61,67,68],"fulli":[60,73],"function":68,"futur":72,"gaug":73,"general":72,"generat":[28,42,51,52,53,54,55,56,57,58,62,68,72,73,74,76],"generatenod":72,"generation_dispatch":[27,41],"get":0,"global":57,"graph":[57,58,68],"grid":[0,51,52,54,55,57,58,60,61,62,64,67,68,70,71,76,77],"grid_graph":[9,29],"hierarchical_analysi":[10,30],"high":[60,68],"histogram":57,"hop":52,"ieee":[57,61],"ii":60,"iii":53,"immun":69,"imped":73,"implement":72,"infrastructur":0,"initi":69,"inject":72,"input":[53,62,72,76],"input_configur":[32,44],"input_extractor":[12,33],"inspect":60,"instal":0,"interact":57,"intermedi":72,"json":57,"kde":53,"kerber":52,"kl":[53,54,72],"larg":58,"length":72,"level":[57,60,68],"line":[55,73],"load":[54,55,56,57,58,59,60,61,72,74],"lognorm":73,"loop":69,"lu":76,"lv":[52,54],"l\u00e9vi":73,"magnitud":73,"maximum":72,"medium":60,"method":52,"methodolog":72,"metric":[57,76],"mode":[0,60,61,62],"model":[53,73,74,76],"modul":[0,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,44,45,46,47,48,49],"multipl":61,"mv":72,"network":[57,58,60,76],"networkx":61,"node":[52,57,72],"nomin":72,"normal":73,"notat":72,"note":[61,70],"notion":70,"observ":[52,70],"one":55,"onli":52,"oper":62,"optim":69,"option":[60,73],"output":69,"overview":72,"packag":[11,21,31,43],"pandapow":[57,58,59,60,61],"paramet":[53,54,55,60],"pegas":58,"per":[57,72],"phase":76,"pipelin":[0,67],"plot":57,"pmf":73,"posit":72,"positiveload":72,"power":[0,55,59,60,61,67,70,72,73,74,76],"powergrid_synth":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"powergridgener":[57,58],"powergridsynth":67,"powerinject":72,"powsybl":[57,58,59],"preliminari":76,"preprocess":[34,45],"prescrib":62,"prior":76,"procedur":72,"properti":[53,54,70,72,73],"pseudo":76,"pypi":0,"pypowsybl":[55,57,59,61],"quick":[0,67],"radial":52,"random":76,"ratio":[60,73],"raw":[51,56],"reactiv":74,"real":52,"refer":[1,52,54,55,60,61,68],"refin":73,"result":70,"round":[53,55],"rte":59,"run":59,"save":57,"scale":[58,70,73],"schweitzer":[52,53,54,55],"set":[56,57,58,74],"share":0,"side":[52,54],"singl":53,"softwar":72,"solver":[0,67,73],"sourc":[0,59],"specif":52,"stabl":73,"stage":73,"star":76,"start":[0,67],"statist":[53,54,70,72,73,74,76],"step":[0,67,70,72],"structur":[52,53],"submodul":[11,21,31,43],"summari":[55,61,72],"support":[55,57,58,60,61,67],"swap":73,"synther":70,"synthes":[22,35,46,59,60],"synthesi":[0,53,54,55,60,61,64,67,68,71,77],"synthet":[51,52,53,54,55,56,57,58,60,62,72,74,76],"system":[69,73,74],"tabl":53,"target":69,"test":[0,57,58,59],"theori":75,"three":73,"todo":48,"topolog":[51,52,53,56,57,58,62,68,70,73,76],"transform":[62,76],"transformer_edg":[36,47],"transmiss":[0,37,38,39,40,41,42,43,44,45,46,47,48,52,61,64,66,67,68,73,77],"tree":53,"trip":[53,55],"tune":60,"two":[53,57,62],"type":[51,56,57,58,60,69,70,72],"uncommit":73,"unit":[72,73],"usag":[0,67],"use":[54,57,58,59,60],"valid":[53,55,60,61,72,76],"verif":72,"via":[55,73,76],"visual":[13,49,53,54,55,57,62],"visualis":[0,68],"voltag":[57,72],"vs":[54,62],"w":69,"want":70,"whi":70,"work":76}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 2a97df2..d9c9948 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -6,10 +6,10 @@ # Point Sphinx to the source code so it can read docstrings sys.path.insert(0, os.path.abspath('../')) -project = 'PowerGridSynth' -copyright = '2025-2026, PowerGridSynth Developers' -author = 'PowerGridSynth Developers' -release = '0.1.1' +project = 'GridStudio' +copyright = '2025-2026, GridStudio Developers' +author = 'GridStudio Developers' +release = '0.2.0' # -- General configuration --------------------------------------------------- @@ -92,8 +92,8 @@ def never_skip_init_or_new(app, what, name, obj, would_skip, options): html_context = { 'display_github': True, - 'github_user': 'cookbook-ms', - 'github_repo': 'Chung_Lu_Chain-synthesizer', + 'github_user': 'mshyang', + 'github_repo': 'GridStudio', 'github_version': 'main', 'conf_py_path': '/docs/', } diff --git a/docs/examples/index.rst b/docs/examples/index.rst index 2408dcb..f7a7f90 100644 --- a/docs/examples/index.rst +++ b/docs/examples/index.rst @@ -19,51 +19,49 @@ control over individual pipeline stages. * - Notebook - Open in Colab - * - :doc:`High-Level Synthesis ` + * - :doc:`High-Level Synthesis ` - (recommended starting point) - * - :doc:`Synthesis with pypowsybl ` + * - :doc:`Synthesis with pypowsybl ` - - * - :doc:`Topology Generation ` + * - :doc:`Topology Generation ` - |colab_topo| - * - :doc:`Bus Type Assignment ` + * - :doc:`Bus Type Assignment ` - |colab_bus| - * - :doc:`Generation and Load Settings ` + * - :doc:`Generation and Load Settings ` - |colab_gen| - * - :doc:`IEEE Test ` + * - :doc:`IEEE Test ` - |colab_ieee| - * - :doc:`PEGASE 9241 Test ` + * - :doc:`PEGASE 9241 Test ` - |colab_pegase| - * - :doc:`RTE 7000 Test ` + * - :doc:`RTE 7000 Test ` - |colab_rte7k| .. |colab_topo| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/TopologyGeneration_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/TopologyGeneration_colab.ipynb .. |colab_bus| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/BusTypeAssignment_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/BusTypeAssignment_colab.ipynb .. |colab_gen| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/GenLoadSettings_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/GenLoadSettings_colab.ipynb .. |colab_ieee| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/ieee_test_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/ieee_test_colab.ipynb .. |colab_pegase| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/pegase9241_test_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/pegase9241_test_colab.ipynb .. |colab_rte7k| image:: https://colab.research.google.com/assets/colab-badge.svg - :target: https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/rte7k_from_source_file_colab.ipynb + :target: https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/rte7k_from_source_file_colab.ipynb Here is a brief example showing how to configure the user input, and then generate, and visualize a synthetic power grid. .. code-block:: python :linenos: - from powergrid_synth.generator import PowerGridGenerator - from powergrid_synth.input_configurator import InputConfigurator - from powergrid_synth.visualization import GridVisualizer + from powergrid_synth import PowerGridGenerator, InputConfigurator, GridVisualizer # 1. Configuration # Define the voltage levels (Node count, Avg Degree, Diameter, Distribution Type) @@ -100,11 +98,11 @@ Distribution Grid Synthesis * - Notebook - Description - * - :doc:`Distribution Feeder Synthesis ` + * - :doc:`Distribution Feeder Synthesis ` - Schweitzer algorithm with default/custom parameters - * - :doc:`Distribution Synthesis from Reference Grid ` + * - :doc:`Distribution Synthesis from Reference Grid ` - Fit parameters from a pandapower network - * - :doc:`Distribution Synthesis with pypowsybl ` + * - :doc:`Distribution Synthesis with pypowsybl ` - Load CIGRE LV via CGMES, run full pipeline + one-liner diff --git a/docs/index.rst b/docs/index.rst index 2f89abd..12a4e41 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,12 +1,14 @@ -PowerGridSynth -============== +GridStudio +========== -**PowerGridSynth** is an open-source Python package for generating realistic **synthetic power grids** at both the transmission and distribution level. +**GridStudio** is an open-source Python package for generating realistic **synthetic power grids** at both the transmission and distribution level. - **Transmission grids** are synthesized using a `Chung-Lu-Chain (CLC) `_ graph model that reproduces prescribed degree distributions and diameters across multiple voltage levels, then layers on bus-type assignment, generation/load capacity allocation (active *and* reactive power), generation dispatch, and transmission-line impedance/capacity assignment drawn from empirical statistics of real grids (NYISO, WECC). -- **Distribution feeders** are synthesized using the algorithm of `Schweitzer et al. (2017) `_, producing radial MV/LV tree graphs with realistic cable types, lengths, and load/generation profiles. +- **Distribution feeders** are synthesized using the algorithm of `Schweitzer et al. (2017) `_, producing radial MV/LV tree graphs with realistic cable types, lengths, and load/generation profiles. -Synthesised grids can be **exported to 12+ industry-standard formats** via `pandapower `_ and `pypowsybl `_ and validated with **DC and AC power-flow solvers** from both libraries. +The Python package is called ``powergrid_synth``, the project's earlier name; install and import it under that name (see :doc:`README`). + +Synthesised grids can be **exported to 11 standard formats** via `pandapower `_ and `pypowsybl `_ and validated with **DC and AC power-flow solvers** from both libraries. The goal of the project is to provide synthetic yet realistic power grids for grid modeling, simulation and analysis, with the ultimate goal of building **Foundation Models** for power grids. It is part of `LF Energy `_, a Linux Foundation focused on the energy sector. This project is supported by `AI-EFFECT `_ (Artificial Intelligence Experimentation Facility For the Energy Sector). @@ -77,7 +79,7 @@ The high-level ``synthesize()`` function runs the entire CLC transmission pipeli export_formats=["json", "matpower"], ) -See :doc:`examples/Synthesize.nblink` for a full walkthrough. +See :doc:`examples/Synthesize` for a full walkthrough. Step-by-Step Usage ~~~~~~~~~~~~~~~~~~ @@ -112,14 +114,19 @@ For fine-grained control over individual pipeline stages: degrees_by_level=params['degrees_by_level'], diameters_by_level=params['diameters_by_level'], transformer_degrees=params['transformer_degrees'], + keep_lcc=True, # drop disconnected fragments ) - # 3. Assign bus types, generation/load, dispatch, and line parameters - BusTypeAllocator(grid).allocate() - CapacityAllocator(grid).allocate() - LoadAllocator(grid).allocate() - GenerationDispatcher(grid).dispatch() - TransmissionLineAllocator(grid).allocate() + # 3. Assign bus types, generation/load, dispatch, and line parameters. + # Run the stages in this order: each one stores its result on the + # graph (and returns it), and the next one reads it from there. + BusTypeAllocator(grid).allocate() # writes bus_type + CapacityAllocator(grid).allocate() # writes pg_max + loads = LoadAllocator(grid) + loads.allocate() # writes pl + loads.allocate_reactive() # writes ql + GenerationDispatcher(grid).dispatch() # writes pg + TransmissionLineAllocator(grid).allocate() # writes r, x, z, capacity # 4. Visualize GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid") @@ -160,7 +167,7 @@ The high-level ``synthesize_distribution()`` function generates realistic radial seed=7, ) -See :doc:`examples/DistributionSynth.nblink` and :doc:`examples/DistributionSynthFromRef.nblink` for detailed walkthroughs. +See :doc:`examples/DistributionSynth` and :doc:`examples/DistributionSynthFromRef` for detailed walkthroughs. Supported Data Formats & Power-Flow Solvers @@ -182,7 +189,7 @@ Synthetic grids live as **NetworkX graphs** internally and can be converted / ex - JSON, Excel, SQLite, Pickle - ``to_json()``, ``to_excel()``, ``to_sqlite()``, ``to_pickle()`` * - pypowsybl - - **CGMES, XIIDM, MATPOWER, PSS/E**, UCTE, AMPL, BIIDM, JIIDM + - **CGMES, XIIDM, MATPOWER, PSS/E**, AMPL, BIIDM, JIIDM - ``to_cgmes()``, ``to_matpower()``, ``to_psse()``, ``to_pypowsybl(format=...)`` **Conversion chain**:: diff --git a/docs/reference/api_reference.md b/docs/reference/api_reference.md index dcbc6f1..d923519 100644 --- a/docs/reference/api_reference.md +++ b/docs/reference/api_reference.md @@ -74,14 +74,7 @@ ### Core Classes ```{eval-rst} -.. autoclass:: powergrid_synth.distribution.SchweetzerFeederGenerator - :members: - :undoc-members: - :show-inheritance: -``` - -```{eval-rst} -.. autoclass:: powergrid_synth.distribution.FeederParams +.. autoclass:: powergrid_synth.distribution.SchweitzerFeederGenerator :members: :undoc-members: :show-inheritance: diff --git a/docs/theory/distribution_feeder_generation.rst b/docs/theory/distribution_feeder_generation.rst index 6d326b5..b6a7eec 100644 --- a/docs/theory/distribution_feeder_generation.rst +++ b/docs/theory/distribution_feeder_generation.rst @@ -510,7 +510,7 @@ direct conversion from any pypowsybl-supported file format to a NetworkX graph compatible with the synthesis pipeline. The fitted parameters can be fed directly to -:class:`~powergrid_synth.distribution.SchweetzerFeederGenerator` for synthesis. +:class:`~powergrid_synth.distribution.SchweitzerFeederGenerator` for synthesis. See the ``DistributionSynthFromRef`` example notebook for a complete workflow. .. bibliography:: diff --git a/examples/colab/BusTypeAssignment_colab.ipynb b/examples/colab/BusTypeAssignment_colab.ipynb index d8a9943..28f6fde 100644 --- a/examples/colab/BusTypeAssignment_colab.ipynb +++ b/examples/colab/BusTypeAssignment_colab.ipynb @@ -24,7 +24,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", diff --git a/examples/colab/GenLoadSettings_colab.ipynb b/examples/colab/GenLoadSettings_colab.ipynb index 5574c96..028d4c5 100644 --- a/examples/colab/GenLoadSettings_colab.ipynb +++ b/examples/colab/GenLoadSettings_colab.ipynb @@ -22,7 +22,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", diff --git a/examples/colab/TopologyGeneration_colab.ipynb b/examples/colab/TopologyGeneration_colab.ipynb index 8d9735d..18d0383 100644 --- a/examples/colab/TopologyGeneration_colab.ipynb +++ b/examples/colab/TopologyGeneration_colab.ipynb @@ -22,7 +22,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", diff --git a/examples/colab/ieee_test_colab.ipynb b/examples/colab/ieee_test_colab.ipynb index 7aac564..319cdfe 100644 --- a/examples/colab/ieee_test_colab.ipynb +++ b/examples/colab/ieee_test_colab.ipynb @@ -22,7 +22,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\" \"pypowsybl>=1.14,<2\" \"pypowsybl-jupyter>=1.0\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", diff --git a/examples/colab/pegase9241_test_colab.ipynb b/examples/colab/pegase9241_test_colab.ipynb index c8ecfd0..bf8be6c 100644 --- a/examples/colab/pegase9241_test_colab.ipynb +++ b/examples/colab/pegase9241_test_colab.ipynb @@ -25,7 +25,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\" \"pypowsybl>=1.14,<2\" \"pypowsybl-jupyter>=1.0\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", diff --git a/examples/colab/rte7k_from_source_file_colab.ipynb b/examples/colab/rte7k_from_source_file_colab.ipynb index 43996e1..b3e0688 100644 --- a/examples/colab/rte7k_from_source_file_colab.ipynb +++ b/examples/colab/rte7k_from_source_file_colab.ipynb @@ -28,7 +28,7 @@ "# upgrade NumPy, but the old .so files stay loaded and cause ImportError.\n", "# Pinning versions + restarting the runtime fixes this.\n", "%pip install -q \"numpy>=2.2,<3\" \"scipy>=1.15,<2\" \"pandapower>=3.3,<4\" \"pypowsybl>=1.14,<2\" \"pypowsybl-jupyter>=1.0\"\n", - "%pip install -q git+https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git@main\n", + "%pip install -q git+https://github.com/mshyang/GridStudio.git@main\n", "\n", "# Restart the Colab runtime so the new NumPy C extensions are loaded.\n", "# After the restart, skip this cell and run the next one.\n", @@ -87,7 +87,7 @@ "source": [ "!mkdir -p data\n", "\n", - "!wget -O data/future_snapshot.xiidm.bz2 https://raw.githubusercontent.com/cookbook-ms/Chung_Lu_Chain-synthesizer/main/examples/transmission/data/future_snapshot.xiidm.bz2\n", + "!wget -O data/future_snapshot.xiidm.bz2 https://raw.githubusercontent.com/mshyang/GridStudio/main/examples/transmission/data/future_snapshot.xiidm.bz2\n", "\n", "!ls data/" ] diff --git a/examples/distribution/CLC4Distribution.ipynb b/examples/distribution/CLC4Distribution.ipynb index 12a4fab..abb01a0 100644 --- a/examples/distribution/CLC4Distribution.ipynb +++ b/examples/distribution/CLC4Distribution.ipynb @@ -37,7 +37,7 @@ " DistributionGrid,\n", ")\n", "from powergrid_synth.distribution import (\n", - " SchweetzerFeederGenerator,\n", + " SchweitzerFeederGenerator,\n", " DistributionSynthParams,\n", " validate_tree,\n", " compute_emergent_properties,\n", @@ -82,7 +82,7 @@ ], "source": [ "# --- Schweitzer feeder (topology only) ---\n", - "dist_gen = SchweetzerFeederGenerator(seed=SEED)\n", + "dist_gen = SchweitzerFeederGenerator(seed=SEED)\n", "G_dist_raw = dist_gen.generate_feeder(\n", " n_nodes=N_NODES,\n", " total_load_mw=2.5, # required but irrelevant for topology\n", @@ -446,7 +446,7 @@ " clc_stats['diameter'].append(nx.diameter(lcc))\n", "\n", " # Schweitzer\n", - " dg = SchweetzerFeederGenerator(seed=seed_i)\n", + " dg = SchweitzerFeederGenerator(seed=seed_i)\n", " G_s = dg.generate_feeder(\n", " n_nodes=N_NODES, total_load_mw=2.5, total_gen_mw=0.0,\n", " assign_cable_types=False, assign_cable_lengths=False,\n", @@ -601,7 +601,7 @@ " f\"diameter={diam_ref}, max_hop={ref_lv.max_hop}, radial={ref_lv.is_radial}\")\n", "\n", "# --- Schweitzer topology (matching reference size) ---\n", - "sw_gen = SchweetzerFeederGenerator(seed=SEED)\n", + "sw_gen = SchweitzerFeederGenerator(seed=SEED)\n", "G_sw_lv = DistributionGrid.from_nx(sw_gen.generate_feeder(\n", " n_nodes=n_ref, total_load_mw=0.5, assign_cable_types=False, assign_cable_lengths=False\n", "))\n", @@ -855,7 +855,7 @@ " f\"diameter={diam_d}, max_hop={ref_dorf.max_hop}, radial={ref_dorf.is_radial}\")\n", "\n", "# --- Schweitzer topology ---\n", - "sw_gen2 = SchweetzerFeederGenerator(seed=SEED)\n", + "sw_gen2 = SchweitzerFeederGenerator(seed=SEED)\n", "G_sw_dorf = DistributionGrid.from_nx(sw_gen2.generate_feeder(\n", " n_nodes=n_d, total_load_mw=1.0, assign_cable_types=False, assign_cable_lengths=False\n", "))\n", diff --git a/examples/distribution/DistributionSynth.ipynb b/examples/distribution/DistributionSynth.ipynb index 4321469..4e16395 100644 --- a/examples/distribution/DistributionSynth.ipynb +++ b/examples/distribution/DistributionSynth.ipynb @@ -26,7 +26,7 @@ "\n", "from powergrid_synth import DistributionGrid, GridVisualizer\n", "from powergrid_synth.distribution import (\n", - " SchweetzerFeederGenerator,\n", + " SchweitzerFeederGenerator,\n", " DistributionSynthParams,\n", " DistributionInputModel,\n", " compute_emergent_properties,\n", @@ -62,7 +62,7 @@ } ], "source": [ - "gen = SchweetzerFeederGenerator(seed=42)\n", + "gen = SchweitzerFeederGenerator(seed=42)\n", "G = DistributionGrid.from_nx(\n", " gen.generate_feeder(n_nodes=50, total_load_mw=8.0, total_gen_mw=1.0, v_nom_kv=10.0)\n", ")\n", @@ -296,7 +296,7 @@ "# Generate multiple feeders with different seeds\n", "ensemble = []\n", "for seed in range(10):\n", - " g = SchweetzerFeederGenerator(seed=seed)\n", + " g = SchweitzerFeederGenerator(seed=seed)\n", " feeder = DistributionGrid.from_nx(\n", " g.generate_feeder(n_nodes=50, total_load_mw=8.0, total_gen_mw=1.0)\n", " )\n", @@ -401,7 +401,7 @@ ], "source": [ "# Generate feeders from sampled inputs\n", - "gen_from_kde = SchweetzerFeederGenerator(seed=99)\n", + "gen_from_kde = SchweitzerFeederGenerator(seed=99)\n", "for i, s in enumerate(samples):\n", " f = DistributionGrid.from_nx(\n", " gen_from_kde.generate_feeder(s.n_nodes, s.total_load_mw, s.total_gen_mw)\n", @@ -495,7 +495,7 @@ " hop_dist=NegBinomParams(r=5.0, p=0.3), # more hops\n", " cable_length=ModifiedCauchyParams(x0=0.05, gamma=0.08), # shorter cables\n", ")\n", - "gen_custom = SchweetzerFeederGenerator(params=custom, seed=77)\n", + "gen_custom = SchweitzerFeederGenerator(params=custom, seed=77)\n", "G_custom = DistributionGrid.from_nx(\n", " gen_custom.generate_feeder(n_nodes=60, total_load_mw=10.0, total_gen_mw=2.0)\n", ")\n", diff --git a/examples/distribution/DistributionSynthFromRef.ipynb b/examples/distribution/DistributionSynthFromRef.ipynb index 5e15c73..e083c34 100644 --- a/examples/distribution/DistributionSynthFromRef.ipynb +++ b/examples/distribution/DistributionSynthFromRef.ipynb @@ -34,7 +34,7 @@ " DistributionGrid,\n", ")\n", "from powergrid_synth.distribution import (\n", - " SchweetzerFeederGenerator,\n", + " SchweitzerFeederGenerator,\n", " DistributionSynthParams,\n", " compute_emergent_properties,\n", " validate_tree,\n", @@ -255,7 +255,7 @@ "print(f\"Reference feeder: {n_ref} nodes, {ref.total_load_mw:.4f} MW load, {ref.total_gen_mw:.4f} MW gen\")\n", "\n", "# Generate a single synthetic feeder with fitted parameters\n", - "gen = SchweetzerFeederGenerator(params=fitted_params, seed=42)\n", + "gen = SchweitzerFeederGenerator(params=fitted_params, seed=42)\n", "G_syn = DistributionGrid.from_nx(\n", " gen.generate_feeder(\n", " n_nodes=n_ref,\n", @@ -584,7 +584,7 @@ "# Generate 10 synthetic feeders matching the reference size\n", "ensemble = []\n", "for seed in range(10):\n", - " g = SchweetzerFeederGenerator(params=fitted_params, seed=seed)\n", + " g = SchweitzerFeederGenerator(params=fitted_params, seed=seed)\n", " feeder = DistributionGrid.from_nx(\n", " g.generate_feeder(\n", " n_nodes=n_ref,\n", diff --git a/examples/distribution/DistributionSynthPypowsybl.ipynb b/examples/distribution/DistributionSynthPypowsybl.ipynb index 632964d..f3eea55 100644 --- a/examples/distribution/DistributionSynthPypowsybl.ipynb +++ b/examples/distribution/DistributionSynthPypowsybl.ipynb @@ -188,7 +188,7 @@ " pypowsybl_to_feeders,\n", " feeder_summary,\n", " DistributionSynthParams,\n", - " SchweetzerFeederGenerator,\n", + " SchweitzerFeederGenerator,\n", " fit_params_from_feeders,\n", " compute_emergent_properties,\n", " compare_feeders,\n", @@ -292,7 +292,7 @@ "print(f\"Reference feeder: {n_target} nodes, load={total_load:.3f} MW, gen={total_gen:.3f} MW\")\n", "\n", "# Generate synthetic feeder\n", - "gen_dist = SchweetzerFeederGenerator(params=fitted_params, seed=42)\n", + "gen_dist = SchweitzerFeederGenerator(params=fitted_params, seed=42)\n", "syn_feeder = gen_dist.generate_feeder(\n", " n_nodes=n_target,\n", " total_load_mw=total_load if total_load > 0 else 1.0,\n", @@ -537,7 +537,7 @@ "# Generate 10 synthetic feeders\n", "ensemble = []\n", "for i in range(10):\n", - " g = SchweetzerFeederGenerator(params=fitted_params, seed=i)\n", + " g = SchweitzerFeederGenerator(params=fitted_params, seed=i)\n", " f = g.generate_feeder(\n", " n_nodes=n_target,\n", " total_load_mw=total_load if total_load > 0 else 1.0,\n", diff --git a/examples/transmission/BusTypeAssignment.ipynb b/examples/transmission/BusTypeAssignment.ipynb index 0caa3cf..7fb1254 100644 --- a/examples/transmission/BusTypeAssignment.ipynb +++ b/examples/transmission/BusTypeAssignment.ipynb @@ -5,7 +5,7 @@ "id": "584bffcf", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/BusTypeAssignment_colab.ipynb)" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/BusTypeAssignment_colab.ipynb)" ] }, { diff --git a/examples/transmission/GenLoadSettings.ipynb b/examples/transmission/GenLoadSettings.ipynb index 17a5883..a28a665 100644 --- a/examples/transmission/GenLoadSettings.ipynb +++ b/examples/transmission/GenLoadSettings.ipynb @@ -5,7 +5,7 @@ "id": "6a2db9ec", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/GenLoadSettings_colab.ipynb)\n" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/GenLoadSettings_colab.ipynb)\n" ] }, { diff --git a/examples/transmission/TopologyGeneration.ipynb b/examples/transmission/TopologyGeneration.ipynb index f713bc3..42ea258 100644 --- a/examples/transmission/TopologyGeneration.ipynb +++ b/examples/transmission/TopologyGeneration.ipynb @@ -5,7 +5,7 @@ "id": "7bd88bdd", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/TopologyGeneration_colab.ipynb)\n" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/TopologyGeneration_colab.ipynb)\n" ] }, { diff --git a/examples/transmission/ieee_test.ipynb b/examples/transmission/ieee_test.ipynb index ddd152a..6a5a6cc 100644 --- a/examples/transmission/ieee_test.ipynb +++ b/examples/transmission/ieee_test.ipynb @@ -5,7 +5,7 @@ "id": "e9e85440", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/ieee_test_colab.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/ieee_test_colab.ipynb)\n", "\n" ] }, diff --git a/examples/transmission/pegase9241_test.ipynb b/examples/transmission/pegase9241_test.ipynb index 7938231..40fc78f 100644 --- a/examples/transmission/pegase9241_test.ipynb +++ b/examples/transmission/pegase9241_test.ipynb @@ -5,7 +5,7 @@ "id": "850bf263", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/pegase9241_test_colab.ipynb)\n" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/pegase9241_test_colab.ipynb)\n" ] }, { diff --git a/examples/transmission/rte7k_from_source_file.ipynb b/examples/transmission/rte7k_from_source_file.ipynb index 87744cb..82ef8e1 100644 --- a/examples/transmission/rte7k_from_source_file.ipynb +++ b/examples/transmission/rte7k_from_source_file.ipynb @@ -5,7 +5,7 @@ "id": "baf4915e", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/rte7k_from_source_file_colab.ipynb)\n" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mshyang/GridStudio/blob/main/examples/colab/rte7k_from_source_file_colab.ipynb)\n" ] }, { diff --git a/output/nad_ieee118_example.png b/output/nad_ieee118_example.png deleted file mode 100644 index 19c7eea..0000000 Binary files a/output/nad_ieee118_example.png and /dev/null differ diff --git a/output/synthetic_grid.json b/output/synthetic_grid.json deleted file mode 100644 index d9961bb..0000000 --- a/output/synthetic_grid.json +++ /dev/null @@ -1,3473 +0,0 @@ -{ - "_module": "pandapower.auxiliary", - "_class": "pandapowerNet", - "_object": { - "bus": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"vn_kv\",\"type\",\"zone\",\"in_service\",\"geo\",\"min_vm_pu\",\"max_vm_pu\"],\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[[\"Bus_0\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_1\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_2\",132.0,\"n\",1,true,null,0.95,1.05],[\"Bus_3\",132.0,\"n\",1,true,null,0.95,1.05],[\"Bus_4\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_5\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_6\",132.0,\"n\",1,true,null,0.95,1.05],[\"Bus_7\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_8\",132.0,\"n\",1,true,null,0.95,1.05],[\"Bus_9\",132.0,\"n\",1,true,null,0.95,1.05],[\"Bus_10\",132.0,\"b\",1,true,null,0.95,1.05],[\"Bus_11\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_12\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_13\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_14\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_15\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_16\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_17\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_18\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_19\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_20\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_21\",33.0,\"n\",1,true,null,0.95,1.05],[\"Bus_22\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_23\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_24\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_25\",33.0,\"n\",1,true,null,0.95,1.05],[\"Bus_26\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_27\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_28\",33.0,\"b\",1,true,null,0.95,1.05],[\"Bus_29\",11.0,\"n\",1,true,null,0.95,1.05],[\"Bus_30\",11.0,\"n\",1,true,null,0.95,1.05],[\"Bus_31\",1.0,\"b\",1,true,null,0.95,1.05]]}", - "orient": "split", - "dtype": { - "name": "object", - "vn_kv": "float64", - "type": "object", - "zone": "object", - "in_service": "bool", - "geo": "object", - "min_vm_pu": "float64", - "max_vm_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "bus_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"vn_kv\",\"type\",\"zone\",\"in_service\",\"geo\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "vn_kv": "float64", - "type": "object", - "zone": "object", - "in_service": "bool", - "geo": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "load": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_mw\",\"q_mvar\",\"const_z_p_percent\",\"const_i_p_percent\",\"const_z_q_percent\",\"const_i_q_percent\",\"sn_mva\",\"scaling\",\"in_service\",\"type\"],\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"data\":[[\"Load_4\",4,226.304582546206944,116.651224993028236,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_10\",10,24.884120580953716,12.841358089030521,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_11\",11,210.884526614415932,75.442391667388961,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_12\",12,33.396175994629722,13.413751827045742,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_13\",13,93.876872738145892,57.765084924934129,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_14\",14,186.16270971494211,101.415413215095199,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_15\",15,6.909832576251161,3.465782522109734,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_19\",19,141.508555010020302,73.666658352502765,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_22\",22,24.268926466353129,7.164368834318944,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_24\",24,268.083276052933343,144.98068765548183,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_26\",26,10.269798964935006,3.612424296053938,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_27\",27,3.591343061261623,0.934244371415335,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_28\",28,27.33968181555969,14.503821581614076,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"],[\"Load_31\",31,233.485910366517999,108.175062108872069,0.0,0.0,0.0,0.0,100.0,1.0,true,\"wye\"]]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "p_mw": "float64", - "q_mvar": "float64", - "const_z_p_percent": "float64", - "const_i_p_percent": "float64", - "const_z_q_percent": "float64", - "const_i_q_percent": "float64", - "sn_mva": "float64", - "scaling": "float64", - "in_service": "bool", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "sgen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_mw\",\"q_mvar\",\"min_q_mvar\",\"max_q_mvar\",\"sn_mva\",\"scaling\",\"controllable\",\"id_q_capability_characteristic\",\"reactive_capability_curve\",\"curve_style\",\"in_service\",\"type\",\"current_source\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "int64", - "p_mw": "float64", - "q_mvar": "float64", - "min_q_mvar": "float64", - "max_q_mvar": "float64", - "sn_mva": "float64", - "scaling": "float64", - "controllable": "bool", - "id_q_capability_characteristic": "Int64", - "reactive_capability_curve": "bool", - "curve_style": "object", - "in_service": "bool", - "type": "object", - "current_source": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "motor": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"pn_mech_mw\",\"loading_percent\",\"cos_phi\",\"cos_phi_n\",\"efficiency_percent\",\"efficiency_n_percent\",\"lrc_pu\",\"vn_kv\",\"scaling\",\"in_service\",\"rx\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "int64", - "pn_mech_mw": "float64", - "loading_percent": "float64", - "cos_phi": "float64", - "cos_phi_n": "float64", - "efficiency_percent": "float64", - "efficiency_n_percent": "float64", - "lrc_pu": "float64", - "vn_kv": "float64", - "scaling": "float64", - "in_service": "bool", - "rx": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "asymmetric_load": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\",\"sn_mva\",\"scaling\",\"in_service\",\"type\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64", - "sn_mva": "float64", - "scaling": "float64", - "in_service": "bool", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "asymmetric_sgen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\",\"sn_mva\",\"scaling\",\"in_service\",\"type\",\"current_source\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "int64", - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64", - "sn_mva": "float64", - "scaling": "float64", - "in_service": "bool", - "type": "object", - "current_source": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "storage": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_mw\",\"q_mvar\",\"sn_mva\",\"soc_percent\",\"min_e_mwh\",\"max_e_mwh\",\"scaling\",\"in_service\",\"type\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "int64", - "p_mw": "float64", - "q_mvar": "float64", - "sn_mva": "float64", - "soc_percent": "float64", - "min_e_mwh": "float64", - "max_e_mwh": "float64", - "scaling": "float64", - "in_service": "bool", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "gen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"p_mw\",\"vm_pu\",\"sn_mva\",\"min_q_mvar\",\"max_q_mvar\",\"scaling\",\"slack\",\"controllable\",\"id_q_capability_characteristic\",\"reactive_capability_curve\",\"curve_style\",\"in_service\",\"slack_weight\",\"type\"],\"index\":[0,1,2,3,4,5,6,7],\"data\":[[\"Gen_0\",0,0.000004615851603,1.0,4.043655794603265,-1.083038228202109,1.61479766197697,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_1\",1,282.773884109860092,1.0,282.773884109860092,-72.647398677298384,168.002833212496938,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_5\",5,135.905552548692583,1.0,135.905552548692583,-1.199510515906935,89.369360541119747,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_16\",16,0.000079144724555,1.0,8.338856740859903,-1.633504809388561,5.382291901375444,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_17\",17,86.937741682179009,1.0,86.937741682179009,-9.048386592902423,33.370228713880408,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_18\",18,603.345605105270465,1.0,603.345605105270465,-96.567792769447806,202.22168886642595,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_20\",20,0.000210642342267,1.0,29.384309001810966,-4.224274716763221,19.405732031024453,1.0,false,true,null,false,null,true,0.0,null],[\"Gen_23\",23,0.000132591522615,1.0,63.079520747137764,-18.191146342895948,34.413449501233899,1.0,false,true,null,false,null,true,0.0,null]]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "p_mw": "float64", - "vm_pu": "float64", - "sn_mva": "float64", - "min_q_mvar": "float64", - "max_q_mvar": "float64", - "scaling": "float64", - "slack": "bool", - "controllable": "bool", - "id_q_capability_characteristic": "Int64", - "reactive_capability_curve": "bool", - "curve_style": "object", - "in_service": "bool", - "slack_weight": "float64", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "switch": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"bus\",\"element\",\"et\",\"type\",\"closed\",\"name\",\"z_ohm\",\"in_ka\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "bus": "int64", - "element": "int64", - "et": "object", - "type": "object", - "closed": "bool", - "name": "object", - "z_ohm": "float64", - "in_ka": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "shunt": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"bus\",\"name\",\"q_mvar\",\"p_mw\",\"vn_kv\",\"step\",\"max_step\",\"id_characteristic_table\",\"step_dependency_table\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "bus": "uint32", - "name": "object", - "q_mvar": "float64", - "p_mw": "float64", - "vn_kv": "float64", - "step": "uint32", - "max_step": "uint32", - "id_characteristic_table": "Int64", - "step_dependency_table": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "svc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"x_l_ohm\",\"x_cvar_ohm\",\"set_vm_pu\",\"thyristor_firing_angle_degree\",\"controllable\",\"in_service\",\"min_angle_degree\",\"max_angle_degree\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "x_l_ohm": "float64", - "x_cvar_ohm": "float64", - "set_vm_pu": "float64", - "thyristor_firing_angle_degree": "float64", - "controllable": "bool", - "in_service": "bool", - "min_angle_degree": "float64", - "max_angle_degree": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "ssc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"r_ohm\",\"x_ohm\",\"vm_internal_pu\",\"va_internal_degree\",\"set_vm_pu\",\"controllable\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "r_ohm": "float64", - "x_ohm": "float64", - "vm_internal_pu": "float64", - "va_internal_degree": "float64", - "set_vm_pu": "float64", - "controllable": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "vsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"bus_dc\",\"r_ohm\",\"x_ohm\",\"r_dc_ohm\",\"pl_dc_mw\",\"control_mode_ac\",\"control_value_ac\",\"control_mode_dc\",\"control_value_dc\",\"controllable\",\"in_service\",\"ref_bus\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "bus_dc": "uint32", - "r_ohm": "float64", - "x_ohm": "float64", - "r_dc_ohm": "float64", - "pl_dc_mw": "float64", - "control_mode_ac": "object", - "control_value_ac": "float64", - "control_mode_dc": "object", - "control_value_dc": "float64", - "controllable": "bool", - "in_service": "bool", - "ref_bus": "uint32" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "ext_grid": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"vm_pu\",\"va_degree\",\"slack_weight\",\"in_service\",\"controllable\",\"min_q_mvar\",\"max_q_mvar\"],\"index\":[0],\"data\":[[\"Ext_Grid_7\",7,1.0,0.0,1.0,true,false,-59.193406832406879,220.065968527052064]]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "vm_pu": "float64", - "va_degree": "float64", - "slack_weight": "float64", - "in_service": "bool", - "controllable": "bool", - "min_q_mvar": "float64", - "max_q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "line": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"std_type\",\"from_bus\",\"to_bus\",\"length_km\",\"r_ohm_per_km\",\"x_ohm_per_km\",\"c_nf_per_km\",\"g_us_per_km\",\"max_i_ka\",\"df\",\"parallel\",\"type\",\"in_service\",\"geo\"],\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[[\"Line_1_5\",null,1,5,1.0,0.218101206925954,10.494785481817523,0.0,0.0,0.872683366315208,1.0,1,\"ol\",true,null],[\"Line_1_8\",null,1,8,1.0,0.022639562433366,3.043139427771,0.0,0.0,3.251529152365075,1.0,1,\"ol\",true,null],[\"Line_1_10\",null,1,10,1.0,0.86716799648375,7.769662007456218,0.0,0.0,0.326895422923704,1.0,1,\"ol\",true,null],[\"Line_5_2\",null,5,2,1.0,26.511736620213977,55.928004904047789,0.0,0.0,0.156081241533621,1.0,1,\"ol\",true,null],[\"Line_8_9\",null,8,9,1.0,6.060566102342002,86.908940498196984,0.0,0.0,0.129753744743302,1.0,1,\"ol\",true,null],[\"Line_8_4\",null,8,4,1.0,0.135587107163285,3.084222189431897,0.0,0.0,3.744355982988874,1.0,1,\"ol\",true,null],[\"Line_0_3\",null,0,3,1.0,0.693017951155168,82.690070711148891,0.0,0.0,0.326094552084636,1.0,1,\"ol\",true,null],[\"Line_0_6\",null,0,6,1.0,2.513363288605718,53.958939964659166,0.0,0.0,0.305593366079499,1.0,1,\"ol\",true,null],[\"Line_3_2\",null,3,2,1.0,2.980460786379241,36.19984763992634,0.0,0.0,0.050638803811943,1.0,1,\"ol\",true,null],[\"Line_3_6\",null,3,6,1.0,6.150835786914461,34.773506094842887,0.0,0.0,0.186971031033152,1.0,1,\"ol\",true,null],[\"Line_7_9\",null,7,9,1.0,23.870003090993382,83.786140574894404,0.0,0.0,0.239342408482646,1.0,1,\"ol\",true,null],[\"Line_16_26\",null,16,26,1.0,0.032865148447554,1.265307001367491,0.0,0.0,0.920270151450315,1.0,1,\"ol\",true,null],[\"Line_16_11\",null,16,11,1.0,0.02680334223423,1.800069580364937,0.0,0.0,1.311257318667652,1.0,1,\"ol\",true,null],[\"Line_21_22\",null,21,22,1.0,0.024180878799476,0.678227999525927,0.0,0.0,3.014859359097724,1.0,1,\"ol\",true,null],[\"Line_21_17\",null,21,17,1.0,0.008972708504318,1.258665703974784,0.0,0.0,2.71528728399797,1.0,1,\"ol\",true,null],[\"Line_21_14\",null,21,14,1.0,0.000831288326149,0.485603416172551,0.0,0.0,6.83528631290529,1.0,1,\"ol\",true,null],[\"Line_22_20\",null,22,20,1.0,0.021038615125133,0.228507899635142,0.0,0.0,20.743086234867263,1.0,1,\"ol\",true,null],[\"Line_22_27\",null,22,27,1.0,0.008654867586695,0.253380801594082,0.0,0.0,9.641319665911805,1.0,1,\"ol\",true,null],[\"Line_14_27\",null,14,27,1.0,0.00147913437353,0.066795725884493,0.0,0.0,54.003046661028876,1.0,1,\"ol\",true,null],[\"Line_14_12\",null,14,12,1.0,0.002943009817905,0.068487223139601,0.0,0.0,38.021365622947876,1.0,1,\"ol\",true,null],[\"Line_14_17\",null,14,17,1.0,0.018611880329586,1.234268528866088,0.0,0.0,11.782347934444104,1.0,1,\"ol\",true,null],[\"Line_27_20\",null,27,20,1.0,0.059615881566081,0.20112839335457,0.0,0.0,35.507120566122644,1.0,1,\"ol\",true,null],[\"Line_27_24\",null,27,24,1.0,0.020406654598198,0.161538056609723,0.0,0.0,20.268173420044612,1.0,1,\"ol\",true,null],[\"Line_17_28\",null,17,28,1.0,0.053278703154372,0.695016822386947,0.0,0.0,1.37449935669067,1.0,1,\"ol\",true,null],[\"Line_18_25\",null,18,25,1.0,0.004305204775964,0.056445660912281,0.0,0.0,31.238271217401273,1.0,1,\"ol\",true,null],[\"Line_25_20\",null,25,20,1.0,0.002034158994599,0.014069536835426,0.0,0.0,47.288255088725378,1.0,1,\"ol\",true,null],[\"Line_12_11\",null,12,11,1.0,0.000978404135293,0.083066533616656,0.0,0.0,33.433246519505474,1.0,1,\"ol\",true,null],[\"Line_12_13\",null,12,13,1.0,0.058161329103845,0.296084370061978,0.0,0.0,3.188264308693172,1.0,1,\"ol\",true,null],[\"Line_12_15\",null,12,15,1.0,0.094436383904643,2.039706262505021,0.0,0.0,1.91447283354443,1.0,1,\"ol\",true,null],[\"Line_19_24\",null,19,24,1.0,0.020024215596321,0.235497866122105,0.0,0.0,9.169247332101746,1.0,1,\"ol\",true,null],[\"Line_24_23\",null,24,23,1.0,1.249386928751666,2.430892416050016,0.0,0.0,0.900748824200764,1.0,1,\"ol\",true,null]]}", - "orient": "split", - "dtype": { - "name": "object", - "std_type": "object", - "from_bus": "uint32", - "to_bus": "uint32", - "length_km": "float64", - "r_ohm_per_km": "float64", - "x_ohm_per_km": "float64", - "c_nf_per_km": "float64", - "g_us_per_km": "float64", - "max_i_ka": "float64", - "df": "float64", - "parallel": "uint32", - "type": "object", - "in_service": "bool", - "geo": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "line_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"std_type\",\"from_bus_dc\",\"to_bus_dc\",\"length_km\",\"r_ohm_per_km\",\"g_us_per_km\",\"max_i_ka\",\"df\",\"parallel\",\"type\",\"in_service\",\"geo\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "std_type": "object", - "from_bus_dc": "uint32", - "to_bus_dc": "uint32", - "length_km": "float64", - "r_ohm_per_km": "float64", - "g_us_per_km": "float64", - "max_i_ka": "float64", - "df": "float64", - "parallel": "uint32", - "type": "object", - "in_service": "bool", - "geo": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "trafo": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"std_type\",\"hv_bus\",\"lv_bus\",\"sn_mva\",\"vn_hv_kv\",\"vn_lv_kv\",\"vk_percent\",\"vkr_percent\",\"pfe_kw\",\"i0_percent\",\"shift_degree\",\"tap_side\",\"tap_neutral\",\"tap_min\",\"tap_max\",\"tap_step_percent\",\"tap_step_degree\",\"tap_pos\",\"tap_changer_type\",\"id_characteristic_table\",\"tap_dependency_table\",\"parallel\",\"df\",\"in_service\",\"oltc\"],\"index\":[0,1,2,3,4,5,6],\"data\":[[\"Trafo_5_11\",null,5,11,707.286667065708571,132.0,33.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_5_31\",null,5,31,234.556967003529451,132.0,1.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_8_24\",null,8,24,36.310941270525248,132.0,33.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_3_12\",null,3,12,14.92751048344109,132.0,33.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_12_30\",null,12,30,20.474724005099883,33.0,11.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_11_31\",null,11,31,970.953891494194863,33.0,1.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false],[\"Trafo_31_29\",null,29,31,95.213718142964566,11.0,1.0,10.0,0.1,0.0,0.0,0.0,null,null,null,null,null,null,null,null,null,false,1,1.0,true,false]]}", - "orient": "split", - "dtype": { - "name": "object", - "std_type": "object", - "hv_bus": "uint32", - "lv_bus": "uint32", - "sn_mva": "float64", - "vn_hv_kv": "float64", - "vn_lv_kv": "float64", - "vk_percent": "float64", - "vkr_percent": "float64", - "pfe_kw": "float64", - "i0_percent": "float64", - "shift_degree": "float64", - "tap_side": "object", - "tap_neutral": "float64", - "tap_min": "float64", - "tap_max": "float64", - "tap_step_percent": "float64", - "tap_step_degree": "float64", - "tap_pos": "float64", - "tap_changer_type": "object", - "id_characteristic_table": "Int64", - "tap_dependency_table": "bool", - "parallel": "uint32", - "df": "float64", - "in_service": "bool", - "oltc": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "trafo3w": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"std_type\",\"hv_bus\",\"mv_bus\",\"lv_bus\",\"sn_hv_mva\",\"sn_mv_mva\",\"sn_lv_mva\",\"vn_hv_kv\",\"vn_mv_kv\",\"vn_lv_kv\",\"vk_hv_percent\",\"vk_mv_percent\",\"vk_lv_percent\",\"vkr_hv_percent\",\"vkr_mv_percent\",\"vkr_lv_percent\",\"pfe_kw\",\"i0_percent\",\"shift_mv_degree\",\"shift_lv_degree\",\"tap_side\",\"tap_neutral\",\"tap_min\",\"tap_max\",\"tap_step_percent\",\"tap_step_degree\",\"tap_pos\",\"tap_at_star_point\",\"tap_changer_type\",\"id_characteristic_table\",\"tap_dependency_table\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "std_type": "object", - "hv_bus": "uint32", - "mv_bus": "uint32", - "lv_bus": "uint32", - "sn_hv_mva": "float64", - "sn_mv_mva": "float64", - "sn_lv_mva": "float64", - "vn_hv_kv": "float64", - "vn_mv_kv": "float64", - "vn_lv_kv": "float64", - "vk_hv_percent": "float64", - "vk_mv_percent": "float64", - "vk_lv_percent": "float64", - "vkr_hv_percent": "float64", - "vkr_mv_percent": "float64", - "vkr_lv_percent": "float64", - "pfe_kw": "float64", - "i0_percent": "float64", - "shift_mv_degree": "float64", - "shift_lv_degree": "float64", - "tap_side": "object", - "tap_neutral": "float64", - "tap_min": "float64", - "tap_max": "float64", - "tap_step_percent": "float64", - "tap_step_degree": "float64", - "tap_pos": "float64", - "tap_at_star_point": "bool", - "tap_changer_type": "object", - "id_characteristic_table": "Int64", - "tap_dependency_table": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "impedance": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"from_bus\",\"to_bus\",\"rft_pu\",\"xft_pu\",\"rtf_pu\",\"xtf_pu\",\"gf_pu\",\"bf_pu\",\"gt_pu\",\"bt_pu\",\"sn_mva\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "from_bus": "uint32", - "to_bus": "uint32", - "rft_pu": "float64", - "xft_pu": "float64", - "rtf_pu": "float64", - "xtf_pu": "float64", - "gf_pu": "float64", - "bf_pu": "float64", - "gt_pu": "float64", - "bt_pu": "float64", - "sn_mva": "float64", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "tcsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"from_bus\",\"to_bus\",\"x_l_ohm\",\"x_cvar_ohm\",\"set_p_to_mw\",\"thyristor_firing_angle_degree\",\"controllable\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "from_bus": "uint32", - "to_bus": "uint32", - "x_l_ohm": "float64", - "x_cvar_ohm": "float64", - "set_p_to_mw": "float64", - "thyristor_firing_angle_degree": "float64", - "controllable": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "dcline": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"from_bus\",\"to_bus\",\"p_mw\",\"loss_percent\",\"loss_mw\",\"vm_from_pu\",\"vm_to_pu\",\"max_p_mw\",\"min_q_from_mvar\",\"min_q_to_mvar\",\"max_q_from_mvar\",\"max_q_to_mvar\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "from_bus": "uint32", - "to_bus": "uint32", - "p_mw": "float64", - "loss_percent": "float64", - "loss_mw": "float64", - "vm_from_pu": "float64", - "vm_to_pu": "float64", - "max_p_mw": "float64", - "min_q_from_mvar": "float64", - "min_q_to_mvar": "float64", - "max_q_from_mvar": "float64", - "max_q_to_mvar": "float64", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "ward": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"ps_mw\",\"qs_mvar\",\"qz_mvar\",\"pz_mw\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "ps_mw": "float64", - "qs_mvar": "float64", - "qz_mvar": "float64", - "pz_mw": "float64", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "xward": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"ps_mw\",\"qs_mvar\",\"qz_mvar\",\"pz_mw\",\"r_ohm\",\"x_ohm\",\"vm_pu\",\"slack_weight\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "ps_mw": "float64", - "qs_mvar": "float64", - "qz_mvar": "float64", - "pz_mw": "float64", - "r_ohm": "float64", - "x_ohm": "float64", - "vm_pu": "float64", - "slack_weight": "float64", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "measurement": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"measurement_type\",\"element_type\",\"element\",\"value\",\"std_dev\",\"side\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "measurement_type": "object", - "element_type": "object", - "element": "uint32", - "value": "float64", - "std_dev": "float64", - "side": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "pwl_cost": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"power_type\",\"element\",\"et\",\"points\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "power_type": "object", - "element": "uint32", - "et": "object", - "points": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "poly_cost": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"element\",\"et\",\"cp0_eur\",\"cp1_eur_per_mw\",\"cp2_eur_per_mw2\",\"cq0_eur\",\"cq1_eur_per_mvar\",\"cq2_eur_per_mvar2\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "element": "uint32", - "et": "object", - "cp0_eur": "float64", - "cp1_eur_per_mw": "float64", - "cp2_eur_per_mw2": "float64", - "cq0_eur": "float64", - "cq1_eur_per_mvar": "float64", - "cq2_eur_per_mvar2": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "controller": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"object\",\"in_service\",\"order\",\"level\",\"initial_run\",\"recycle\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "object": "object", - "in_service": "bool", - "order": "float64", - "level": "object", - "initial_run": "bool", - "recycle": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "group": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"element_type\",\"element_index\",\"reference_column\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "element_type": "object", - "element_index": "object", - "reference_column": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "source_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus_dc\",\"vm_pu\",\"in_service\",\"type\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus_dc": "uint32", - "vm_pu": "float64", - "in_service": "bool", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "load_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus_dc\",\"p_dc_mw\",\"scaling\",\"in_service\",\"controllable\",\"type\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus_dc": "uint32", - "p_dc_mw": "float64", - "scaling": "float64", - "in_service": "bool", - "controllable": "bool", - "type": "object" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "b2b_vsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"bus_dc_plus\",\"bus_dc_minus\",\"r_ohm\",\"x_ohm\",\"r_dc_ohm\",\"pl_dc_mw\",\"control_mode_ac\",\"control_value_ac\",\"control_mode_dc\",\"control_value_dc\",\"controllable\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "bus_dc_plus": "uint32", - "bus_dc_minus": "uint32", - "r_ohm": "float64", - "x_ohm": "float64", - "r_dc_ohm": "float64", - "pl_dc_mw": "float64", - "control_mode_ac": "object", - "control_value_ac": "float64", - "control_mode_dc": "object", - "control_value_dc": "float64", - "controllable": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "bi_vsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"name\",\"bus\",\"bus_dc_plus\",\"bus_dc_minus\",\"r_ohm\",\"x_ohm\",\"r_dc_ohm\",\"pl_dc_mw\",\"control_mode_ac\",\"control_value_ac\",\"control_mode_dc\",\"control_value_dc\",\"controllable\",\"in_service\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "name": "object", - "bus": "uint32", - "bus_dc_plus": "uint32", - "bus_dc_minus": "uint32", - "r_ohm": "float64", - "x_ohm": "float64", - "r_dc_ohm": "float64", - "pl_dc_mw": "float64", - "control_mode_ac": "object", - "control_value_ac": "float64", - "control_mode_dc": "object", - "control_value_dc": "float64", - "controllable": "bool", - "in_service": "bool" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "version": "3.3.0", - "format_version": "3.1.0", - "converged": false, - "OPF_converged": false, - "name": "", - "f_hz": 50.0, - "sn_mva": 100.0, - "std_types": { - "line": { - "NAYY 4x50 SE": { - "c_nf_per_km": 210, - "r_ohm_per_km": 0.642, - "x_ohm_per_km": 0.083, - "max_i_ka": 0.142, - "type": "cs", - "q_mm2": 50, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "NAYY 4x120 SE": { - "c_nf_per_km": 264, - "r_ohm_per_km": 0.225, - "x_ohm_per_km": 0.08, - "max_i_ka": 0.242, - "type": "cs", - "q_mm2": 120, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "NAYY 4x150 SE": { - "c_nf_per_km": 261, - "r_ohm_per_km": 0.208, - "x_ohm_per_km": 0.08, - "max_i_ka": 0.27, - "type": "cs", - "q_mm2": 150, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "NA2XS2Y 1x95 RM/25 12/20 kV": { - "c_nf_per_km": 216, - "r_ohm_per_km": 0.313, - "x_ohm_per_km": 0.132, - "max_i_ka": 0.252, - "type": "cs", - "q_mm2": 95, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x185 RM/25 12/20 kV": { - "c_nf_per_km": 273, - "r_ohm_per_km": 0.161, - "x_ohm_per_km": 0.117, - "max_i_ka": 0.362, - "type": "cs", - "q_mm2": 185, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x240 RM/25 12/20 kV": { - "c_nf_per_km": 304, - "r_ohm_per_km": 0.122, - "x_ohm_per_km": 0.112, - "max_i_ka": 0.421, - "type": "cs", - "q_mm2": 240, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x95 RM/25 6/10 kV": { - "c_nf_per_km": 315, - "r_ohm_per_km": 0.313, - "x_ohm_per_km": 0.123, - "max_i_ka": 0.249, - "type": "cs", - "q_mm2": 95, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x185 RM/25 6/10 kV": { - "c_nf_per_km": 406, - "r_ohm_per_km": 0.161, - "x_ohm_per_km": 0.11, - "max_i_ka": 0.358, - "type": "cs", - "q_mm2": 185, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x240 RM/25 6/10 kV": { - "c_nf_per_km": 456, - "r_ohm_per_km": 0.122, - "x_ohm_per_km": 0.105, - "max_i_ka": 0.416, - "type": "cs", - "q_mm2": 240, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x150 RM/25 12/20 kV": { - "c_nf_per_km": 250, - "r_ohm_per_km": 0.206, - "x_ohm_per_km": 0.116, - "max_i_ka": 0.319, - "type": "cs", - "q_mm2": 150, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x120 RM/25 12/20 kV": { - "c_nf_per_km": 230, - "r_ohm_per_km": 0.253, - "x_ohm_per_km": 0.119, - "max_i_ka": 0.283, - "type": "cs", - "q_mm2": 120, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x70 RM/25 12/20 kV": { - "c_nf_per_km": 190, - "r_ohm_per_km": 0.443, - "x_ohm_per_km": 0.132, - "max_i_ka": 0.22, - "type": "cs", - "q_mm2": 70, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x150 RM/25 6/10 kV": { - "c_nf_per_km": 360, - "r_ohm_per_km": 0.206, - "x_ohm_per_km": 0.11, - "max_i_ka": 0.315, - "type": "cs", - "q_mm2": 150, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x120 RM/25 6/10 kV": { - "c_nf_per_km": 340, - "r_ohm_per_km": 0.253, - "x_ohm_per_km": 0.113, - "max_i_ka": 0.28, - "type": "cs", - "q_mm2": 120, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "NA2XS2Y 1x70 RM/25 6/10 kV": { - "c_nf_per_km": 280, - "r_ohm_per_km": 0.443, - "x_ohm_per_km": 0.123, - "max_i_ka": 0.217, - "type": "cs", - "q_mm2": 70, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "N2XS(FL)2Y 1x120 RM/35 64/110 kV": { - "c_nf_per_km": 112, - "r_ohm_per_km": 0.153, - "x_ohm_per_km": 0.166, - "max_i_ka": 0.366, - "type": "cs", - "q_mm2": 120, - "alpha": 0.00393, - "voltage_rating": "HV" - }, - "N2XS(FL)2Y 1x185 RM/35 64/110 kV": { - "c_nf_per_km": 125, - "r_ohm_per_km": 0.099, - "x_ohm_per_km": 0.156, - "max_i_ka": 0.457, - "type": "cs", - "q_mm2": 185, - "alpha": 0.00393, - "voltage_rating": "HV" - }, - "N2XS(FL)2Y 1x240 RM/35 64/110 kV": { - "c_nf_per_km": 135, - "r_ohm_per_km": 0.075, - "x_ohm_per_km": 0.149, - "max_i_ka": 0.526, - "type": "cs", - "q_mm2": 240, - "alpha": 0.00393, - "voltage_rating": "HV" - }, - "N2XS(FL)2Y 1x300 RM/35 64/110 kV": { - "c_nf_per_km": 144, - "r_ohm_per_km": 0.06, - "x_ohm_per_km": 0.144, - "max_i_ka": 0.588, - "type": "cs", - "q_mm2": 300, - "alpha": 0.00393, - "voltage_rating": "HV" - }, - "15-AL1/3-ST1A 0.4": { - "c_nf_per_km": 11, - "r_ohm_per_km": 1.8769, - "x_ohm_per_km": 0.35, - "max_i_ka": 0.105, - "type": "ol", - "q_mm2": 16, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "24-AL1/4-ST1A 0.4": { - "c_nf_per_km": 11.25, - "r_ohm_per_km": 1.2012, - "x_ohm_per_km": 0.335, - "max_i_ka": 0.14, - "type": "ol", - "q_mm2": 24, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "48-AL1/8-ST1A 0.4": { - "c_nf_per_km": 12.2, - "r_ohm_per_km": 0.5939, - "x_ohm_per_km": 0.3, - "max_i_ka": 0.21, - "type": "ol", - "q_mm2": 48, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "94-AL1/15-ST1A 0.4": { - "c_nf_per_km": 13.2, - "r_ohm_per_km": 0.306, - "x_ohm_per_km": 0.29, - "max_i_ka": 0.35, - "type": "ol", - "q_mm2": 94, - "alpha": 0.00403, - "voltage_rating": "LV" - }, - "34-AL1/6-ST1A 10.0": { - "c_nf_per_km": 9.7, - "r_ohm_per_km": 0.8342, - "x_ohm_per_km": 0.36, - "max_i_ka": 0.17, - "type": "ol", - "q_mm2": 34, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "48-AL1/8-ST1A 10.0": { - "c_nf_per_km": 10.1, - "r_ohm_per_km": 0.5939, - "x_ohm_per_km": 0.35, - "max_i_ka": 0.21, - "type": "ol", - "q_mm2": 48, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "70-AL1/11-ST1A 10.0": { - "c_nf_per_km": 10.4, - "r_ohm_per_km": 0.4132, - "x_ohm_per_km": 0.339, - "max_i_ka": 0.29, - "type": "ol", - "q_mm2": 70, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "94-AL1/15-ST1A 10.0": { - "c_nf_per_km": 10.75, - "r_ohm_per_km": 0.306, - "x_ohm_per_km": 0.33, - "max_i_ka": 0.35, - "type": "ol", - "q_mm2": 94, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "122-AL1/20-ST1A 10.0": { - "c_nf_per_km": 11.1, - "r_ohm_per_km": 0.2376, - "x_ohm_per_km": 0.323, - "max_i_ka": 0.41, - "type": "ol", - "q_mm2": 122, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "149-AL1/24-ST1A 10.0": { - "c_nf_per_km": 11.25, - "r_ohm_per_km": 0.194, - "x_ohm_per_km": 0.315, - "max_i_ka": 0.47, - "type": "ol", - "q_mm2": 149, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "34-AL1/6-ST1A 20.0": { - "c_nf_per_km": 9.15, - "r_ohm_per_km": 0.8342, - "x_ohm_per_km": 0.382, - "max_i_ka": 0.17, - "type": "ol", - "q_mm2": 34, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "48-AL1/8-ST1A 20.0": { - "c_nf_per_km": 9.5, - "r_ohm_per_km": 0.5939, - "x_ohm_per_km": 0.372, - "max_i_ka": 0.21, - "type": "ol", - "q_mm2": 48, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "70-AL1/11-ST1A 20.0": { - "c_nf_per_km": 9.7, - "r_ohm_per_km": 0.4132, - "x_ohm_per_km": 0.36, - "max_i_ka": 0.29, - "type": "ol", - "q_mm2": 70, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "94-AL1/15-ST1A 20.0": { - "c_nf_per_km": 10, - "r_ohm_per_km": 0.306, - "x_ohm_per_km": 0.35, - "max_i_ka": 0.35, - "type": "ol", - "q_mm2": 94, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "122-AL1/20-ST1A 20.0": { - "c_nf_per_km": 10.3, - "r_ohm_per_km": 0.2376, - "x_ohm_per_km": 0.344, - "max_i_ka": 0.41, - "type": "ol", - "q_mm2": 122, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "149-AL1/24-ST1A 20.0": { - "c_nf_per_km": 10.5, - "r_ohm_per_km": 0.194, - "x_ohm_per_km": 0.337, - "max_i_ka": 0.47, - "type": "ol", - "q_mm2": 149, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "184-AL1/30-ST1A 20.0": { - "c_nf_per_km": 10.75, - "r_ohm_per_km": 0.1571, - "x_ohm_per_km": 0.33, - "max_i_ka": 0.535, - "type": "ol", - "q_mm2": 184, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "243-AL1/39-ST1A 20.0": { - "c_nf_per_km": 11, - "r_ohm_per_km": 0.1188, - "x_ohm_per_km": 0.32, - "max_i_ka": 0.645, - "type": "ol", - "q_mm2": 243, - "alpha": 0.00403, - "voltage_rating": "MV" - }, - "48-AL1/8-ST1A 110.0": { - "c_nf_per_km": 8, - "r_ohm_per_km": 0.5939, - "x_ohm_per_km": 0.46, - "max_i_ka": 0.21, - "type": "ol", - "q_mm2": 48, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "70-AL1/11-ST1A 110.0": { - "c_nf_per_km": 8.4, - "r_ohm_per_km": 0.4132, - "x_ohm_per_km": 0.45, - "max_i_ka": 0.29, - "type": "ol", - "q_mm2": 70, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "94-AL1/15-ST1A 110.0": { - "c_nf_per_km": 8.65, - "r_ohm_per_km": 0.306, - "x_ohm_per_km": 0.44, - "max_i_ka": 0.35, - "type": "ol", - "q_mm2": 94, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "122-AL1/20-ST1A 110.0": { - "c_nf_per_km": 8.5, - "r_ohm_per_km": 0.2376, - "x_ohm_per_km": 0.43, - "max_i_ka": 0.41, - "type": "ol", - "q_mm2": 122, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "149-AL1/24-ST1A 110.0": { - "c_nf_per_km": 8.75, - "r_ohm_per_km": 0.194, - "x_ohm_per_km": 0.41, - "max_i_ka": 0.47, - "type": "ol", - "q_mm2": 149, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "184-AL1/30-ST1A 110.0": { - "c_nf_per_km": 8.8, - "r_ohm_per_km": 0.1571, - "x_ohm_per_km": 0.4, - "max_i_ka": 0.535, - "type": "ol", - "q_mm2": 184, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "243-AL1/39-ST1A 110.0": { - "c_nf_per_km": 9, - "r_ohm_per_km": 0.1188, - "x_ohm_per_km": 0.39, - "max_i_ka": 0.645, - "type": "ol", - "q_mm2": 243, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "305-AL1/39-ST1A 110.0": { - "c_nf_per_km": 9.2, - "r_ohm_per_km": 0.0949, - "x_ohm_per_km": 0.38, - "max_i_ka": 0.74, - "type": "ol", - "q_mm2": 305, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "490-AL1/64-ST1A 110.0": { - "c_nf_per_km": 9.75, - "r_ohm_per_km": 0.059, - "x_ohm_per_km": 0.37, - "max_i_ka": 0.96, - "type": "ol", - "q_mm2": 490, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "679-AL1/86-ST1A 110.0": { - "c_nf_per_km": 9.95, - "r_ohm_per_km": 0.042, - "x_ohm_per_km": 0.36, - "max_i_ka": 1.15, - "type": "ol", - "q_mm2": 679, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "490-AL1/64-ST1A 220.0": { - "c_nf_per_km": 10, - "r_ohm_per_km": 0.059, - "x_ohm_per_km": 0.285, - "max_i_ka": 0.96, - "type": "ol", - "q_mm2": 490, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "679-AL1/86-ST1A 220.0": { - "c_nf_per_km": 11.7, - "r_ohm_per_km": 0.042, - "x_ohm_per_km": 0.275, - "max_i_ka": 1.15, - "type": "ol", - "q_mm2": 679, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "490-AL1/64-ST1A 380.0": { - "c_nf_per_km": 11, - "r_ohm_per_km": 0.059, - "x_ohm_per_km": 0.253, - "max_i_ka": 0.96, - "type": "ol", - "q_mm2": 490, - "alpha": 0.00403, - "voltage_rating": "HV" - }, - "679-AL1/86-ST1A 380.0": { - "c_nf_per_km": 14.6, - "r_ohm_per_km": 0.042, - "x_ohm_per_km": 0.25, - "max_i_ka": 1.15, - "type": "ol", - "q_mm2": 679, - "alpha": 0.00403, - "voltage_rating": "HV" - } - }, - "line_dc": { - "95-CU": { - "r_ohm_per_km": 0.193, - "max_i_ka": 0.404, - "type": "cs", - "q_mm2": 95, - "alpha": 0.00393 - }, - "400-CU": { - "r_ohm_per_km": 0.047, - "max_i_ka": 0.922, - "type": "cs", - "q_mm2": 400, - "alpha": 0.00393 - }, - "1200-CU": { - "r_ohm_per_km": 0.0151, - "max_i_ka": 1.791, - "type": "cs", - "q_mm2": 1200, - "alpha": 0.00393 - }, - "2400-CU": { - "r_ohm_per_km": 0.0073, - "max_i_ka": 2.678, - "type": "cs", - "q_mm2": 2400, - "alpha": 0.00393 - }, - "95-AL": { - "r_ohm_per_km": 0.32, - "max_i_ka": 0.31, - "type": "cs", - "q_mm2": 95, - "alpha": 0.00403 - }, - "400-AL": { - "r_ohm_per_km": 0.0778, - "max_i_ka": 0.705, - "type": "cs", - "q_mm2": 400, - "alpha": 0.00403 - }, - "1200-AL": { - "r_ohm_per_km": 0.0247, - "max_i_ka": 1.371, - "type": "cs", - "q_mm2": 1200, - "alpha": 0.00403 - }, - "2400-AL": { - "r_ohm_per_km": 0.0121, - "max_i_ka": 2.066, - "type": "cs", - "q_mm2": 2400, - "alpha": 0.00403 - } - }, - "trafo": { - "160 MVA 380/110 kV": { - "i0_percent": 0.06, - "pfe_kw": 60, - "vkr_percent": 0.25, - "sn_mva": 160, - "vn_lv_kv": 110.0, - "vn_hv_kv": 380.0, - "vk_percent": 12.2, - "shift_degree": 0, - "vector_group": "Yy0", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "100 MVA 220/110 kV": { - "i0_percent": 0.06, - "pfe_kw": 55, - "vkr_percent": 0.26, - "sn_mva": 100, - "vn_lv_kv": 110.0, - "vn_hv_kv": 220.0, - "vk_percent": 12.0, - "shift_degree": 0, - "vector_group": "Yy0", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "63 MVA 110/20 kV": { - "i0_percent": 0.04, - "pfe_kw": 22, - "vkr_percent": 0.32, - "sn_mva": 63, - "vn_lv_kv": 20.0, - "vn_hv_kv": 110.0, - "vk_percent": 18, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "40 MVA 110/20 kV": { - "i0_percent": 0.05, - "pfe_kw": 18, - "vkr_percent": 0.34, - "sn_mva": 40, - "vn_lv_kv": 20.0, - "vn_hv_kv": 110.0, - "vk_percent": 16.2, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "25 MVA 110/20 kV": { - "i0_percent": 0.07, - "pfe_kw": 14, - "vkr_percent": 0.41, - "sn_mva": 25, - "vn_lv_kv": 20.0, - "vn_hv_kv": 110.0, - "vk_percent": 12, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "63 MVA 110/10 kV": { - "sn_mva": 63, - "vn_hv_kv": 110, - "vn_lv_kv": 10, - "vk_percent": 18, - "vkr_percent": 0.32, - "pfe_kw": 22, - "i0_percent": 0.04, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "40 MVA 110/10 kV": { - "sn_mva": 40, - "vn_hv_kv": 110, - "vn_lv_kv": 10, - "vk_percent": 16.2, - "vkr_percent": 0.34, - "pfe_kw": 18, - "i0_percent": 0.05, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "25 MVA 110/10 kV": { - "sn_mva": 25, - "vn_hv_kv": 110, - "vn_lv_kv": 10, - "vk_percent": 12, - "vkr_percent": 0.41, - "pfe_kw": 14, - "i0_percent": 0.07, - "shift_degree": 150, - "vector_group": "YNd5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -9, - "tap_max": 9, - "tap_step_degree": 0, - "tap_step_percent": 1.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.25 MVA 20/0.4 kV": { - "sn_mva": 0.25, - "vn_hv_kv": 20, - "vn_lv_kv": 0.4, - "vk_percent": 6, - "vkr_percent": 1.44, - "pfe_kw": 0.8, - "i0_percent": 0.32, - "shift_degree": 150, - "vector_group": "Yzn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.4 MVA 20/0.4 kV": { - "sn_mva": 0.4, - "vn_hv_kv": 20, - "vn_lv_kv": 0.4, - "vk_percent": 6, - "vkr_percent": 1.425, - "pfe_kw": 1.35, - "i0_percent": 0.3375, - "shift_degree": 150, - "vector_group": "Dyn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.63 MVA 20/0.4 kV": { - "sn_mva": 0.63, - "vn_hv_kv": 20, - "vn_lv_kv": 0.4, - "vk_percent": 6, - "vkr_percent": 1.206, - "pfe_kw": 1.65, - "i0_percent": 0.2619, - "shift_degree": 150, - "vector_group": "Dyn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.25 MVA 10/0.4 kV": { - "sn_mva": 0.25, - "vn_hv_kv": 10, - "vn_lv_kv": 0.4, - "vk_percent": 4, - "vkr_percent": 1.2, - "pfe_kw": 0.6, - "i0_percent": 0.24, - "shift_degree": 150, - "vector_group": "Dyn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.4 MVA 10/0.4 kV": { - "sn_mva": 0.4, - "vn_hv_kv": 10, - "vn_lv_kv": 0.4, - "vk_percent": 4, - "vkr_percent": 1.325, - "pfe_kw": 0.95, - "i0_percent": 0.2375, - "shift_degree": 150, - "vector_group": "Dyn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "0.63 MVA 10/0.4 kV": { - "sn_mva": 0.63, - "vn_hv_kv": 10, - "vn_lv_kv": 0.4, - "vk_percent": 4, - "vkr_percent": 1.0794, - "pfe_kw": 1.18, - "i0_percent": 0.1873, - "shift_degree": 150, - "vector_group": "Dyn5", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -2, - "tap_max": 2, - "tap_step_degree": 0, - "tap_step_percent": 2.5, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - } - }, - "trafo3w": { - "63/25/38 MVA 110/20/10 kV": { - "sn_hv_mva": 63, - "sn_mv_mva": 25, - "sn_lv_mva": 38, - "vn_hv_kv": 110, - "vn_mv_kv": 20, - "vn_lv_kv": 10, - "vk_hv_percent": 10.4, - "vk_mv_percent": 10.4, - "vk_lv_percent": 10.4, - "vkr_hv_percent": 0.28, - "vkr_mv_percent": 0.32, - "vkr_lv_percent": 0.35, - "pfe_kw": 35, - "i0_percent": 0.89, - "shift_mv_degree": 0, - "shift_lv_degree": 0, - "vector_group": "YN0yn0yn0", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -10, - "tap_max": 10, - "tap_step_percent": 1.2, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - }, - "63/25/38 MVA 110/10/10 kV": { - "sn_hv_mva": 63, - "sn_mv_mva": 25, - "sn_lv_mva": 38, - "vn_hv_kv": 110, - "vn_mv_kv": 10, - "vn_lv_kv": 10, - "vk_hv_percent": 10.4, - "vk_mv_percent": 10.4, - "vk_lv_percent": 10.4, - "vkr_hv_percent": 0.28, - "vkr_mv_percent": 0.32, - "vkr_lv_percent": 0.35, - "pfe_kw": 35, - "i0_percent": 0.89, - "shift_mv_degree": 0, - "shift_lv_degree": 0, - "vector_group": "YN0yn0yn0", - "tap_side": "hv", - "tap_neutral": 0, - "tap_min": -10, - "tap_max": 10, - "tap_step_percent": 1.2, - "tap_changer_type": "Ratio", - "trafo_characteristic_table": false - } - }, - "fuse": { - "HV 100A": { - "fuse_type": "HV 100A", - "i_rated_a": 100.0, - "t_avg": 0, - "t_min": [ - 10.0, - 3.64, - 0.854, - 0.281, - 0.1, - 0.0531, - 0.022, - 0.01 - ], - "t_total": [ - 10.0, - 4.267, - 1.21, - 0.403, - 0.1, - 0.058, - 0.022, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 300.0, - 350.0, - 450.0, - 550.0, - 700.0, - 850.0, - 1200.0, - 1752.0 - ], - "x_total": [ - 600.0, - 700.0, - 900.0, - 1150.0, - 1665.0, - 2000.0, - 3000.0, - 4313.0 - ] - }, - "HV 10A": { - "fuse_type": "HV 10A", - "i_rated_a": 10.0, - "t_avg": 0, - "t_min": [ - 10.0, - 1675.0, - 0.344, - 0.156, - 0.1, - 0.0417, - 0.0171, - 0.01 - ], - "t_total": [ - 10.0, - 1.3, - 0.3, - 0.155, - 0.1, - 0.0555, - 0.023, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 30.0, - 32.0, - 35.0, - 37.0, - 39.0, - 50.0, - 70.0, - 88.0 - ], - "x_total": [ - 60.0, - 70.0, - 80.0, - 87.0, - 94.0, - 110.0, - 150.0, - 216.0 - ] - }, - "HV 125A": { - "fuse_type": "HV 125A", - "i_rated_a": 125.0, - "t_avg": 0, - "t_min": [ - 10.0, - 1.82, - 0.344, - 0.1, - 0.0467, - 0.0269, - 0.01 - ], - "t_total": [ - 10.0, - 2.478, - 0.426, - 0.1, - 0.0427, - 0.0211, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 375.0, - 500.0, - 700.0, - 925.0, - 1200.0, - 1500.0, - 2341.0 - ], - "x_total": [ - 750.0, - 1000.0, - 1500.0, - 2200.0, - 3000.0, - 4000.0, - 5765.0 - ] - }, - "HV 160A": { - "fuse_type": "HV 160A", - "i_rated_a": 160.0, - "t_avg": 0, - "t_min": [ - 10.0, - 4.15, - 1.03, - 0.198, - 0.1, - 0.051, - 0.0172, - 0.01 - ], - "t_total": [ - 10.0, - 2.3, - 0.734, - 0.274, - 0.1, - 0.046, - 0.0177, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 480.0, - 550.0, - 700.0, - 1000.0, - 1260.0, - 1600.0, - 2500.0, - 3227.0 - ], - "x_total": [ - 960.0, - 1300.0, - 1700.0, - 2200.0, - 2996.0, - 4000.0, - 6000.0, - 7946.0 - ] - }, - "HV 16A": { - "fuse_type": "HV 16A", - "i_rated_a": 16.0, - "t_avg": 0, - "t_min": [ - 10.0, - 0.352, - 0.164, - 0.1, - 0.0649, - 0.0342, - 0.01 - ], - "t_total": [ - 10.0, - 2.34, - 0.722, - 0.181, - 0.1, - 0.055, - 0.0296, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 48.0, - 60.0, - 65.0, - 71.0, - 80.0, - 100.0, - 162.0 - ], - "x_total": [ - 96.0, - 110.0, - 125.0, - 150.0, - 168.0, - 200.0, - 250.0, - 398.0 - ] - }, - "HV 200A": { - "fuse_type": "HV 200A", - "i_rated_a": 200.0, - "t_avg": 0, - "t_min": [ - 10.0, - 4.267, - 1.21, - 0.403, - 0.1, - 0.058, - 0.022, - 0.01 - ], - "t_total": [ - 10.0, - 3.73, - 1.654, - 0.328, - 0.1, - 0.0531, - 0.019, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 600.0, - 700.0, - 900.0, - 1150.0, - 1665.0, - 2000.0, - 3000.0, - 4313.0 - ], - "x_total": [ - 1200.0, - 1500.0, - 1800.0, - 2700.0, - 3960.0, - 5000.0, - 7500.0, - 10620.0 - ] - }, - "HV 20A": { - "fuse_type": "HV 20A", - "i_rated_a": 20.0, - "t_avg": 0, - "t_min": [ - 10.0, - 1.3, - 0.3, - 0.155, - 0.1, - 0.0555, - 0.023, - 0.01 - ], - "t_total": [ - 10.0, - 1.3, - 0.161, - 0.1, - 0.0611, - 0.0399, - 0.0141, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 60.0, - 70.0, - 80.0, - 87.0, - 94.0, - 110.0, - 150.0, - 216.0 - ], - "x_total": [ - 120.0, - 150.0, - 200.0, - 223.0, - 260.0, - 300.0, - 450.0, - 532.0 - ] - }, - "HV 25A": { - "fuse_type": "HV 25A", - "i_rated_a": 25.0, - "t_avg": 0, - "t_min": [ - 10.0, - 2.512, - 0.833, - 0.299, - 0.1, - 0.0372, - 0.0223, - 0.01 - ], - "t_total": [ - 10.0, - 3.125, - 0.597, - 0.198, - 0.1, - 0.0378, - 0.022, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 75.0, - 82.0, - 90.0, - 100.0, - 124.0, - 170.0, - 200.0, - 289.0 - ], - "x_total": [ - 150.0, - 170.0, - 210.0, - 250.0, - 294.0, - 400.0, - 500.0, - 711.0 - ] - }, - "HV 31.5A": { - "fuse_type": "HV 31.5A", - "i_rated_a": 31.5, - "t_avg": 0, - "t_min": [ - 10.0, - 2.34, - 0.722, - 0.181, - 0.1, - 0.055, - 0.0296, - 0.01 - ], - "t_total": [ - 10.0, - 2.84, - 0.368, - 0.164, - 0.1, - 0.0621, - 0.0378, - 0.0195, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 95.0, - 110.0, - 125.0, - 150.0, - 165.0, - 200.0, - 250.0, - 390.0 - ], - "x_total": [ - 189.0, - 220.0, - 300.0, - 350.0, - 393.0, - 450.0, - 530.0, - 700.0, - 960.0 - ] - }, - "HV 40A": { - "fuse_type": "HV 40A", - "i_rated_a": 40.0, - "t_avg": 0, - "t_min": [ - 10.0, - 1.3, - 0.161, - 0.1, - 0.0611, - 0.0399, - 0.0141, - 0.01 - ], - "t_total": [ - 10.0, - 2.05, - 0.369, - 0.198, - 0.1, - 0.051, - 0.0298, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 120.0, - 150.0, - 200.0, - 223.0, - 260.0, - 300.0, - 450.0, - 532.0 - ], - "x_total": [ - 240.0, - 300.0, - 400.0, - 450.0, - 530.0, - 650.0, - 800.0, - 1311.0 - ] - }, - "HV 50A": { - "fuse_type": "HV 50A", - "i_rated_a": 50.0, - "t_avg": 0, - "t_min": [ - 10.0, - 3.215, - 0.597, - 0.198, - 0.1, - 0.0378, - 0.022, - 0.01 - ], - "t_total": [ - 10.0, - 3.64, - 0.854, - 0.281, - 0.1, - 0.0531, - 0.022, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 150.0, - 170.0, - 210.0, - 250.0, - 294.0, - 400.0, - 500.0, - 711.0 - ], - "x_total": [ - 300.0, - 350.0, - 450.0, - 550.0, - 700.0, - 850.0, - 1200.0, - 1752.0 - ] - }, - "HV 6.3A": { - "fuse_type": "HV 6.3A", - "i_rated_a": 6.3, - "t_avg": 0, - "t_min": [ - 10.0, - 1.39, - 0.344, - 0.168, - 0.1, - 0.056, - 0.0263, - 0.01 - ], - "t_total": [ - 10.0, - 1.711, - 0.516, - 0.198, - 0.1, - 0.0634, - 0.0303, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 19.0, - 19.5, - 20.4, - 20.8, - 22.0, - 25.0, - 32.0, - 48.0 - ], - "x_total": [ - 38.0, - 40.0, - 43.0, - 48.0, - 53.0, - 60.0, - 75.0, - 118.0 - ] - }, - "HV 63A": { - "fuse_type": "HV 63A", - "i_rated_a": 63.0, - "t_avg": 0, - "t_min": [ - 10.0, - 2.84, - 0.368, - 0.164, - 0.1, - 0.0621, - 0.0378, - 0.0195, - 0.01 - ], - "t_total": [ - 10.0, - 1.82, - 0.344, - 0.1, - 0.0467, - 0.0269, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 189.0, - 220.0, - 300.0, - 350.0, - 393.0, - 450.0, - 530.0, - 700.0, - 961.0 - ], - "x_total": [ - 378.0, - 500.0, - 700.0, - 934.0, - 1200.0, - 1500.0, - 2366.0 - ] - }, - "HV 80A": { - "fuse_type": "HV 80A", - "i_rated_a": 80.0, - "t_avg": 0, - "t_min": [ - 10.0, - 2.05, - 0.369, - 0.198, - 0.1, - 0.051, - 0.0298, - 0.01 - ], - "t_total": [ - 10.0, - 4.15, - 1.03, - 0.198, - 0.1, - 0.051, - 0.0172, - 0.01 - ], - "x_avg": 0, - "x_min": [ - 240.0, - 300.0, - 400.0, - 450.0, - 530.0, - 650.0, - 800.0, - 1311.0 - ], - "x_total": [ - 480.0, - 550.0, - 700.0, - 1000.0, - 1260.0, - 1600.0, - 2500.0, - 3227.0 - ] - }, - "Siemens NH-1-100": { - "fuse_type": "Siemens NH-1-100", - "i_rated_a": 100.0, - "t_avg": [ - 5400.0, - 2000.0, - 400.0, - 20.0, - 1.0, - 0.2, - 0.012, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 150.0, - 190.0, - 250.0, - 430.0, - 900.0, - 1250.0, - 2700.0, - 3600.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-125": { - "fuse_type": "Siemens NH-1-125", - "i_rated_a": 125.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 180.0, - 400.0, - 740.0, - 2000.0, - 4250.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-16": { - "fuse_type": "Siemens NH-1-16", - "i_rated_a": 16.0, - "t_avg": [ - 4000.0, - 400.0, - 2.0, - 0.1, - 0.04, - 0.01 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 26.0, - 35.0, - 75.0, - 150.0, - 200.0, - 300.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-160": { - "fuse_type": "Siemens NH-1-160", - "i_rated_a": 160.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 210.0, - 500.0, - 900.0, - 2300.0, - 5000.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-25": { - "fuse_type": "Siemens NH-1-25", - "i_rated_a": 25.0, - "t_avg": [ - 4000.0, - 1000.0, - 10.0, - 0.2, - 0.02, - 0.01 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 40.0, - 50.0, - 100.0, - 210.0, - 400.0, - 500.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-50": { - "fuse_type": "Siemens NH-1-50", - "i_rated_a": 50.0, - "t_avg": [ - 4000.0, - 40.0, - 4.0, - 1.0, - 0.02, - 0.01 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 86.0, - 200.0, - 300.0, - 400.0, - 1000.0, - 1280.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-63": { - "fuse_type": "Siemens NH-1-63", - "i_rated_a": 63.0, - "t_avg": [ - 4000.0, - 100.0, - 10.0, - 2.0, - 0.04, - 0.01 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 100.0, - 200.0, - 300.0, - 400.0, - 1000.0, - 1500.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-1-80": { - "fuse_type": "Siemens NH-1-80", - "i_rated_a": 80.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.01 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 150.58, - 250.0, - 450.0, - 1150.0, - 2470.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-1000": { - "fuse_type": "Siemens NH-2-1000", - "i_rated_a": 1000.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 1900.0, - 3500.0, - 8400.0, - 24000.0, - 52000.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-200": { - "fuse_type": "Siemens NH-2-200", - "i_rated_a": 200.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 280.0, - 650.0, - 1200.0, - 3000.0, - 7000.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-224": { - "fuse_type": "Siemens NH-2-224", - "i_rated_a": 224.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.2, - 0.04, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 400.0, - 750.0, - 1453.0, - 3025.0, - 4315.0, - 7600.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-250": { - "fuse_type": "Siemens NH-2-250", - "i_rated_a": 250.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 450.0, - 800.0, - 1650.0, - 4000.0, - 8500.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-315": { - "fuse_type": "Siemens NH-2-315", - "i_rated_a": 315.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 550.0, - 920.0, - 1900.0, - 5000.0, - 11000.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-355": { - "fuse_type": "Siemens NH-2-355", - "i_rated_a": 355.0, - "t_avg": [ - 4800.0, - 120.0, - 6.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 650.0, - 1116.27, - 2350.0, - 5840.0, - 12790.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-400": { - "fuse_type": "Siemens NH-2-400", - "i_rated_a": 400.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 720.0, - 1350.0, - 2800.0, - 6500.0, - 15000.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-425": { - "fuse_type": "Siemens NH-2-425", - "i_rated_a": 425.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 850.0, - 1500.0, - 3050.0, - 7500.0, - 16500.0 - ], - "x_min": 0, - "x_total": 0 - }, - "Siemens NH-2-630": { - "fuse_type": "Siemens NH-2-630", - "i_rated_a": 630.0, - "t_avg": [ - 4800.0, - 120.0, - 7.0, - 0.1, - 0.004 - ], - "t_min": 0, - "t_total": 0, - "x_avg": [ - 1200.0, - 2000.0, - 4800.0, - 12000.0, - 26000.0 - ], - "x_min": 0, - "x_total": 0 - } - } - }, - "res_bus": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"vm_pu\",\"va_degree\",\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "vm_pu": "float64", - "va_degree": "float64", - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_bus_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"vm_pu\",\"p_mw\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "vm_pu": "float64", - "p_mw": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_line": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"ql_mvar\",\"i_from_ka\",\"i_to_ka\",\"i_ka\",\"vm_from_pu\",\"va_from_degree\",\"vm_to_pu\",\"va_to_degree\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_from_ka": "float64", - "i_to_ka": "float64", - "i_ka": "float64", - "vm_from_pu": "float64", - "va_from_degree": "float64", - "vm_to_pu": "float64", - "va_to_degree": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_line_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"p_to_mw\",\"pl_mw\",\"i_from_ka\",\"i_to_ka\",\"i_ka\",\"vm_from_pu\",\"vm_to_pu\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "p_to_mw": "float64", - "pl_mw": "float64", - "i_from_ka": "float64", - "i_to_ka": "float64", - "i_ka": "float64", - "vm_from_pu": "float64", - "vm_to_pu": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_hv_mw\",\"q_hv_mvar\",\"p_lv_mw\",\"q_lv_mvar\",\"pl_mw\",\"ql_mvar\",\"i_hv_ka\",\"i_lv_ka\",\"vm_hv_pu\",\"va_hv_degree\",\"vm_lv_pu\",\"va_lv_degree\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_hv_mw": "float64", - "q_hv_mvar": "float64", - "p_lv_mw": "float64", - "q_lv_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_hv_ka": "float64", - "i_lv_ka": "float64", - "vm_hv_pu": "float64", - "va_hv_degree": "float64", - "vm_lv_pu": "float64", - "va_lv_degree": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo3w": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_hv_mw\",\"q_hv_mvar\",\"p_mv_mw\",\"q_mv_mvar\",\"p_lv_mw\",\"q_lv_mvar\",\"pl_mw\",\"ql_mvar\",\"i_hv_ka\",\"i_mv_ka\",\"i_lv_ka\",\"vm_hv_pu\",\"va_hv_degree\",\"vm_mv_pu\",\"va_mv_degree\",\"vm_lv_pu\",\"va_lv_degree\",\"va_internal_degree\",\"vm_internal_pu\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_hv_mw": "float64", - "q_hv_mvar": "float64", - "p_mv_mw": "float64", - "q_mv_mvar": "float64", - "p_lv_mw": "float64", - "q_lv_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_hv_ka": "float64", - "i_mv_ka": "float64", - "i_lv_ka": "float64", - "vm_hv_pu": "float64", - "va_hv_degree": "float64", - "vm_mv_pu": "float64", - "va_mv_degree": "float64", - "vm_lv_pu": "float64", - "va_lv_degree": "float64", - "va_internal_degree": "float64", - "vm_internal_pu": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_impedance": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"ql_mvar\",\"i_from_ka\",\"i_to_ka\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_from_ka": "float64", - "i_to_ka": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_ext_grid": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_load": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_load_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_dc_mw\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_dc_mw": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_motor": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_sgen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_storage": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_shunt": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"vm_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "vm_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_gen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"va_degree\",\"vm_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "va_degree": "float64", - "vm_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_ward": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"vm_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "vm_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_xward": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"vm_pu\",\"va_internal_degree\",\"vm_internal_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "vm_pu": "float64", - "va_internal_degree": "float64", - "vm_internal_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_dcline": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"vm_from_pu\",\"va_from_degree\",\"vm_to_pu\",\"va_to_degree\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "vm_from_pu": "float64", - "va_from_degree": "float64", - "vm_to_pu": "float64", - "va_to_degree": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_asymmetric_load": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_asymmetric_sgen": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_source_dc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_dc_mw\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_dc_mw": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_switch": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"i_ka\",\"loading_percent\",\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "i_ka": "float64", - "loading_percent": "float64", - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_tcsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"thyristor_firing_angle_degree\",\"x_ohm\",\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"ql_mvar\",\"i_ka\",\"vm_from_pu\",\"va_from_degree\",\"vm_to_pu\",\"va_to_degree\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "thyristor_firing_angle_degree": "float64", - "x_ohm": "float64", - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_ka": "float64", - "vm_from_pu": "float64", - "va_from_degree": "float64", - "vm_to_pu": "float64", - "va_to_degree": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_svc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"thyristor_firing_angle_degree\",\"x_ohm\",\"q_mvar\",\"vm_pu\",\"va_degree\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "thyristor_firing_angle_degree": "float64", - "x_ohm": "float64", - "q_mvar": "float64", - "vm_pu": "float64", - "va_degree": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_ssc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"q_mvar\",\"vm_internal_pu\",\"va_internal_degree\",\"vm_pu\",\"va_degree\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "q_mvar": "float64", - "vm_internal_pu": "float64", - "va_internal_degree": "float64", - "vm_pu": "float64", - "va_degree": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_vsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"p_dc_mw\",\"vm_internal_pu\",\"va_internal_degree\",\"vm_pu\",\"va_degree\",\"vm_internal_dc_pu\",\"vm_dc_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "p_dc_mw": "float64", - "vm_internal_pu": "float64", - "va_internal_degree": "float64", - "vm_pu": "float64", - "va_degree": "float64", - "vm_internal_dc_pu": "float64", - "vm_dc_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_b2b_vsc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"p_dc_mw_p\",\"p_dc_mw_m\",\"vm_internal_pu\",\"vm_internal_degree\",\"vm_pu\",\"va_degree\",\"vm_internal_dc_pu_p\",\"vm_internal_dc_pu_m\",\"vm_dc_pu_p\",\"vm_dc_pu_m\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "p_dc_mw_p": "float64", - "p_dc_mw_m": "float64", - "vm_internal_pu": "float64", - "vm_internal_degree": "float64", - "vm_pu": "float64", - "va_degree": "float64", - "vm_internal_dc_pu_p": "float64", - "vm_internal_dc_pu_m": "float64", - "vm_dc_pu_p": "float64", - "vm_dc_pu_m": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_bus_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"vm_pu\",\"va_degree\",\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "vm_pu": "float64", - "va_degree": "float64", - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_line_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"ql_mvar\",\"i_from_ka\",\"i_to_ka\",\"i_ka\",\"vm_from_pu\",\"va_from_degree\",\"vm_to_pu\",\"va_to_degree\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_from_ka": "float64", - "i_to_ka": "float64", - "i_ka": "float64", - "vm_from_pu": "float64", - "va_from_degree": "float64", - "vm_to_pu": "float64", - "va_to_degree": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_hv_mw\",\"q_hv_mvar\",\"p_lv_mw\",\"q_lv_mvar\",\"pl_mw\",\"ql_mvar\",\"i_hv_ka\",\"i_lv_ka\",\"vm_hv_pu\",\"va_hv_degree\",\"vm_lv_pu\",\"va_lv_degree\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_hv_mw": "float64", - "q_hv_mvar": "float64", - "p_lv_mw": "float64", - "q_lv_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_hv_ka": "float64", - "i_lv_ka": "float64", - "vm_hv_pu": "float64", - "va_hv_degree": "float64", - "vm_lv_pu": "float64", - "va_lv_degree": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo3w_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_hv_mw\",\"q_hv_mvar\",\"p_mv_mw\",\"q_mv_mvar\",\"p_lv_mw\",\"q_lv_mvar\",\"pl_mw\",\"ql_mvar\",\"i_hv_ka\",\"i_mv_ka\",\"i_lv_ka\",\"vm_hv_pu\",\"va_hv_degree\",\"vm_mv_pu\",\"va_mv_degree\",\"vm_lv_pu\",\"va_lv_degree\",\"va_internal_degree\",\"vm_internal_pu\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_hv_mw": "float64", - "q_hv_mvar": "float64", - "p_mv_mw": "float64", - "q_mv_mvar": "float64", - "p_lv_mw": "float64", - "q_lv_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_hv_ka": "float64", - "i_mv_ka": "float64", - "i_lv_ka": "float64", - "vm_hv_pu": "float64", - "va_hv_degree": "float64", - "vm_mv_pu": "float64", - "va_mv_degree": "float64", - "vm_lv_pu": "float64", - "va_lv_degree": "float64", - "va_internal_degree": "float64", - "vm_internal_pu": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_impedance_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\",\"pl_mw\",\"ql_mvar\",\"i_from_ka\",\"i_to_ka\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64", - "pl_mw": "float64", - "ql_mvar": "float64", - "i_from_ka": "float64", - "i_to_ka": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_switch_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"i_ka\",\"loading_percent\",\"p_from_mw\",\"q_from_mvar\",\"p_to_mw\",\"q_to_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "i_ka": "float64", - "loading_percent": "float64", - "p_from_mw": "float64", - "q_from_mvar": "float64", - "p_to_mw": "float64", - "q_to_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_shunt_est": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\",\"vm_pu\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64", - "vm_pu": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_bus_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_line_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo3w_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_ext_grid_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_gen_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_sgen_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_switch_sc": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_bus_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"vm_a_pu\",\"va_a_degree\",\"vm_b_pu\",\"va_b_degree\",\"vm_c_pu\",\"va_c_degree\",\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "vm_a_pu": "float64", - "va_a_degree": "float64", - "vm_b_pu": "float64", - "va_b_degree": "float64", - "vm_c_pu": "float64", - "va_c_degree": "float64", - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_line_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_a_from_mw\",\"q_a_from_mvar\",\"p_b_from_mw\",\"q_b_from_mvar\",\"p_c_from_mw\",\"q_c_from_mvar\",\"p_a_to_mw\",\"q_a_to_mvar\",\"p_b_to_mw\",\"q_b_to_mvar\",\"p_c_to_mw\",\"q_c_to_mvar\",\"pl_a_mw\",\"ql_a_mvar\",\"pl_b_mw\",\"ql_b_mvar\",\"pl_c_mw\",\"ql_c_mvar\",\"i_a_from_ka\",\"i_a_to_ka\",\"i_b_from_ka\",\"i_b_to_ka\",\"i_c_from_ka\",\"i_c_to_ka\",\"i_a_ka\",\"i_b_ka\",\"i_c_ka\",\"i_n_from_ka\",\"i_n_to_ka\",\"i_n_ka\",\"loading_a_percent\",\"loading_b_percent\",\"loading_c_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_a_from_mw": "float64", - "q_a_from_mvar": "float64", - "p_b_from_mw": "float64", - "q_b_from_mvar": "float64", - "p_c_from_mw": "float64", - "q_c_from_mvar": "float64", - "p_a_to_mw": "float64", - "q_a_to_mvar": "float64", - "p_b_to_mw": "float64", - "q_b_to_mvar": "float64", - "p_c_to_mw": "float64", - "q_c_to_mvar": "float64", - "pl_a_mw": "float64", - "ql_a_mvar": "float64", - "pl_b_mw": "float64", - "ql_b_mvar": "float64", - "pl_c_mw": "float64", - "ql_c_mvar": "float64", - "i_a_from_ka": "float64", - "i_a_to_ka": "float64", - "i_b_from_ka": "float64", - "i_b_to_ka": "float64", - "i_c_from_ka": "float64", - "i_c_to_ka": "float64", - "i_a_ka": "float64", - "i_b_ka": "float64", - "i_c_ka": "float64", - "i_n_from_ka": "float64", - "i_n_to_ka": "float64", - "i_n_ka": "float64", - "loading_a_percent": "float64", - "loading_b_percent": "float64", - "loading_c_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_trafo_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_a_hv_mw\",\"q_a_hv_mvar\",\"p_b_hv_mw\",\"q_b_hv_mvar\",\"p_c_hv_mw\",\"q_c_hv_mvar\",\"p_a_lv_mw\",\"q_a_lv_mvar\",\"p_b_lv_mw\",\"q_b_lv_mvar\",\"p_c_lv_mw\",\"q_c_lv_mvar\",\"pl_a_mw\",\"ql_a_mvar\",\"pl_b_mw\",\"ql_b_mvar\",\"pl_c_mw\",\"ql_c_mvar\",\"i_a_hv_ka\",\"i_a_lv_ka\",\"i_b_hv_ka\",\"i_b_lv_ka\",\"i_c_hv_ka\",\"i_c_lv_ka\",\"loading_a_percent\",\"loading_b_percent\",\"loading_c_percent\",\"loading_percent\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_a_hv_mw": "float64", - "q_a_hv_mvar": "float64", - "p_b_hv_mw": "float64", - "q_b_hv_mvar": "float64", - "p_c_hv_mw": "float64", - "q_c_hv_mvar": "float64", - "p_a_lv_mw": "float64", - "q_a_lv_mvar": "float64", - "p_b_lv_mw": "float64", - "q_b_lv_mvar": "float64", - "p_c_lv_mw": "float64", - "q_c_lv_mvar": "float64", - "pl_a_mw": "float64", - "ql_a_mvar": "float64", - "pl_b_mw": "float64", - "ql_b_mvar": "float64", - "pl_c_mw": "float64", - "ql_c_mvar": "float64", - "i_a_hv_ka": "float64", - "i_a_lv_ka": "float64", - "i_b_hv_ka": "float64", - "i_b_lv_ka": "float64", - "i_c_hv_ka": "float64", - "i_c_lv_ka": "float64", - "loading_a_percent": "float64", - "loading_b_percent": "float64", - "loading_c_percent": "float64", - "loading_percent": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_ext_grid_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_shunt_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[],\"index\":[],\"data\":[]}", - "orient": "split", - "is_multiindex": false, - "is_multicolumn": false - }, - "res_load_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_sgen_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_storage_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_mw\",\"q_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_mw": "float64", - "q_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_asymmetric_load_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "res_asymmetric_sgen_3ph": { - "_module": "pandas.core.frame", - "_class": "DataFrame", - "_object": "{\"columns\":[\"p_a_mw\",\"q_a_mvar\",\"p_b_mw\",\"q_b_mvar\",\"p_c_mw\",\"q_c_mvar\"],\"index\":[],\"data\":[]}", - "orient": "split", - "dtype": { - "p_a_mw": "float64", - "q_a_mvar": "float64", - "p_b_mw": "float64", - "q_b_mvar": "float64", - "p_c_mw": "float64", - "q_c_mvar": "float64" - }, - "is_multiindex": false, - "is_multicolumn": false - }, - "user_pf_options": {} - } -} \ No newline at end of file diff --git a/powergrid_synth/__init__.py b/powergrid_synth/__init__.py index 15859b1..e33bd69 100644 --- a/powergrid_synth/__init__.py +++ b/powergrid_synth/__init__.py @@ -1,17 +1,20 @@ """ -PowerGridSynth Package -====================== +GridStudio +========== -The main package for PowerGridSynth. +Synthetic power grid generation. The import name is ``powergrid_synth``. -This package contains submodules for generating, analyzing, and exporting +This package contains submodules for generating, analyzing, and exporting synthetic power grids, organized into three subpackages: - ``core``: shared utilities (analysis, comparison, visualization, etc.) - ``transmission``: CLC-based transmission grid synthesis pipeline - ``distribution``: Schweitzer-based distribution feeder synthesis pipeline """ +from ._extras import EXPORT_INSTALL_HINT as _EXPORT_INSTALL_HINT + # --- Core (shared) ---------------------------------------------------------- +from .core._logging import set_verbosity from .core.grid_graph import PowerGridGraph, TransmissionGrid, DistributionGrid from .core.analysis import GridAnalyzer from .core.comparison import GraphComparator @@ -82,7 +85,7 @@ def __getattr__(name): pkg = _EXTRA_DEPS.get(name, "the required optional package") raise ImportError( f"{name!r} requires {pkg}. " - f"Install it with: pip install powergrid_synth[export]" + f"Install it with: {_EXPORT_INSTALL_HINT}" ) from exc raise AttributeError(f"module {__name__!r} has no attribute {name!r}") @@ -105,6 +108,7 @@ def __getattr__(name): "DistributionGrid", "HierarchicalAnalyzer", "extract_topology_params_from_graph", + "set_verbosity", # Optional (lazy-loaded, require pandapower / pypowsybl) "synthesize", "synthesize_distribution", @@ -116,4 +120,4 @@ def __getattr__(name): "load_grid", ] -__version__ = "0.1.1" \ No newline at end of file +__version__ = "0.2.0" \ No newline at end of file diff --git a/powergrid_synth/_extras.py b/powergrid_synth/_extras.py new file mode 100644 index 0000000..38b14af --- /dev/null +++ b/powergrid_synth/_extras.py @@ -0,0 +1,9 @@ +"""Install hints for the optional export / power-flow dependencies.""" + +#: Where the package is installed from. It is not on PyPI yet, so the hint +#: has to name the repository; change this one line after a PyPI release. +INSTALL_SOURCE = "git+https://github.com/mshyang/GridStudio" + +#: Shell command that installs the optional dependencies (pandapower, +#: pypowsybl, numba, lightsim2grid). +EXPORT_INSTALL_HINT = f'pip install "powergrid_synth[export] @ {INSTALL_SOURCE}"' diff --git a/powergrid_synth/core/_graph_utils.py b/powergrid_synth/core/_graph_utils.py new file mode 100644 index 0000000..5969931 --- /dev/null +++ b/powergrid_synth/core/_graph_utils.py @@ -0,0 +1,42 @@ +"""Small helpers shared by the pipeline stages for reading and writing graph attributes.""" + +from __future__ import annotations + +from typing import Any, Dict, Hashable + +import networkx as nx + + +def require_node_attribute( + graph: nx.Graph, attr: str, *, needed_by: str, set_by: str +) -> None: + """Raise a clear error when *graph* has nodes but none carries *attr*. + + The pipeline stages build on each other through node attributes + (``bus_type`` -> ``pg_max`` -> ``pl`` -> ``pg``). Running a stage before + its prerequisite used to produce an empty result without complaint; this + turns that into an error that names the missing step. + """ + if graph.number_of_nodes() == 0: + return + if any(attr in data for _, data in graph.nodes(data=True)): + return + raise ValueError( + f"{needed_by} needs the {attr!r} node attribute, but no node of the " + f"graph has it. Run {set_by} on this graph first (it stores its " + f"result on the graph), or set the attribute yourself with " + f"networkx.set_node_attributes(graph, values, name={attr!r})." + ) + + +def store_node_attribute( + graph: nx.Graph, values: Dict[Hashable, Any], name: str +) -> None: + """Write *values* to the node attribute *name*, replacing earlier values. + + Nodes that are not in *values* lose the attribute, so re-running a stage + never leaves results from a previous run behind. + """ + for _, data in graph.nodes(data=True): + data.pop(name, None) + nx.set_node_attributes(graph, values, name=name) diff --git a/powergrid_synth/core/_logging.py b/powergrid_synth/core/_logging.py new file mode 100644 index 0000000..1a28709 --- /dev/null +++ b/powergrid_synth/core/_logging.py @@ -0,0 +1,111 @@ +""" +Package-wide logging. + +All progress messages go through the ``powergrid_synth`` logger instead of +bare ``print`` calls, so they can be silenced or made more detailed in one +place:: + + import powergrid_synth as pgs + + pgs.set_verbosity("silent") # nothing at all + pgs.set_verbosity("warning") # problems only + pgs.set_verbosity("info") # one line per pipeline stage (default) + pgs.set_verbosity("debug") # per-level / per-iteration detail + +The logger writes plain lines to ``sys.stdout`` so notebook output looks the +same as before. To route messages somewhere else, attach your own handler to +``logging.getLogger("powergrid_synth")`` and call ``set_verbosity`` as usual. +""" + +from __future__ import annotations + +import contextlib +import logging +import sys +from typing import Iterator, Union + +logger = logging.getLogger("powergrid_synth") + +_LEVELS = { + "silent": logging.CRITICAL + 10, + "warning": logging.WARNING, + "info": logging.INFO, + "debug": logging.DEBUG, +} + + +class _StdoutHandler(logging.StreamHandler): + """Stream handler that looks up ``sys.stdout`` at emit time. + + Resolving the stream late means output still lands in the right place when + stdout is swapped out (Jupyter cells, ``contextlib.redirect_stdout``, + pytest's ``capsys``). + """ + + def __init__(self) -> None: + super().__init__(stream=sys.stdout) + + @property + def stream(self): # type: ignore[override] + return sys.stdout + + @stream.setter + def stream(self, value) -> None: + # The base class assigns ``self.stream`` in __init__; ignore it. + pass + + +def _resolve(level: Union[str, bool, int]) -> int: + if isinstance(level, bool): + return logging.INFO if level else logging.WARNING + if isinstance(level, int): + return level + try: + return _LEVELS[level.lower().strip()] + except (KeyError, AttributeError): + raise ValueError( + f"Unknown verbosity {level!r}. Choose one of {sorted(_LEVELS)}, " + f"True/False, or a logging level number." + ) from None + + +def set_verbosity(level: Union[str, bool, int] = "info") -> None: + """Set how much progress output the package prints. + + Parameters + ---------- + level : {"silent", "warning", "info", "debug"} or bool or int + ``"info"`` (default) prints one line per pipeline stage, + ``"debug"`` adds per-level and per-iteration detail, + ``"warning"`` prints problems only and ``"silent"`` prints nothing. + ``True`` / ``False`` are shorthand for ``"info"`` / ``"warning"``. + A :mod:`logging` level number is accepted as well. + """ + logger.setLevel(_resolve(level)) + + +@contextlib.contextmanager +def verbosity(level: Union[str, bool, int]) -> Iterator[None]: + """Temporarily change the verbosity inside a ``with`` block.""" + previous = logger.level + logger.setLevel(_resolve(level)) + try: + yield + finally: + logger.setLevel(previous) + + +def _install_default_handler() -> None: + if any(isinstance(h, _StdoutHandler) for h in logger.handlers): + return + handler = _StdoutHandler() + handler.setFormatter(logging.Formatter("%(message)s")) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + # Messages are already printed by the handler above; propagating them to + # the root logger would print them a second time for users who have + # configured logging themselves. + logger.propagate = False + + +_install_default_handler() diff --git a/powergrid_synth/core/data_format_converter.py b/powergrid_synth/core/data_format_converter.py index 941a0f2..5abeacc 100644 --- a/powergrid_synth/core/data_format_converter.py +++ b/powergrid_synth/core/data_format_converter.py @@ -1,5 +1,6 @@ from __future__ import annotations +from .._extras import EXPORT_INSTALL_HINT import networkx as nx import pandas as pd import numpy as np @@ -15,8 +16,8 @@ def _require_pandapower(): import pandapower as pp except ImportError as exc: raise ImportError( - "pandapower is required for powergrid_synth.data_format_converter. " - "Install it with: pip install powergrid_synth[export]" + "pandapower is required to convert or export grids and to run power flow. " + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc return pp @@ -27,7 +28,7 @@ def _require_pypowsybl(): except ImportError as exc: raise ImportError( "pypowsybl is required for this function. " - "Install it with: pip install powergrid_synth[export]" + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc return ppl @@ -123,6 +124,8 @@ def nx_to_pandapower( graph: The synthetic power grid (NetworkX Graph) containing electrical properties. base_mva: System base MVA for per-unit calculations. base_kv_map: Dictionary mapping voltage level indices (0, 1, 2) to actual kV (e.g., {0: 380.0, 1: 110.0}). + If omitted, ``graph.graph["base_kv_map"]`` is used when present (``synthesize()`` stores the + reference grid's voltages there), otherwise 380 / 110 / 20 / 0.4 / 0.12 kV for levels 0-4. """ pp = _require_pandapower() @@ -131,6 +134,8 @@ def nx_to_pandapower( net.sn_mva = base_mva # Default hierarchy if not specified: HV -> MV -> LV -> Residential + if base_kv_map is None: + base_kv_map = graph.graph.get("base_kv_map") if base_kv_map is None: base_kv_map = {0: 380.0, 1: 110.0, 2: 20.0, 3: 0.4, 4: 0.12} diff --git a/powergrid_synth/core/exporter.py b/powergrid_synth/core/exporter.py index 5b2a45d..b2bc59b 100644 --- a/powergrid_synth/core/exporter.py +++ b/powergrid_synth/core/exporter.py @@ -9,11 +9,16 @@ - JSON, Excel, SQLite, Pickle Supported pypowsybl formats: - - CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL, BIIDM, JIIDM + - CGMES, XIIDM, MATPOWER, PSS/E, AMPL, BIIDM, JIIDM + +UCTE is not supported: pypowsybl's UCTE writer requires UCTE node codes, +which synthetic grids do not have. """ import os import networkx as nx from typing import Optional +from ._logging import logger +from .data_format_converter import _require_pandapower class GridExporter: @@ -79,10 +84,10 @@ def to_json(self, filepath: str) -> None: Args: filepath: Destination file path (e.g. ``"output/grid.json"``). """ - import pandapower as pp + pp = _require_pandapower() os.makedirs(os.path.dirname(os.path.abspath(filepath)), exist_ok=True) pp.to_json(self._get_pandapower_net(), filepath) - print(f"-> pandapower JSON export: {filepath}") + logger.info(f"-> pandapower JSON export: {filepath}") def to_excel(self, filepath: str, include_results: bool = True) -> None: """Export the grid to a pandapower Excel file. @@ -91,11 +96,11 @@ def to_excel(self, filepath: str, include_results: bool = True) -> None: filepath: Destination file path (e.g. ``"output/grid.xlsx"``). include_results: Whether to include power flow results if available. """ - import pandapower as pp + pp = _require_pandapower() os.makedirs(os.path.dirname(os.path.abspath(filepath)), exist_ok=True) pp.to_excel(self._get_pandapower_net(), filepath, include_results=include_results) - print(f"-> pandapower Excel export: {filepath}") + logger.info(f"-> pandapower Excel export: {filepath}") def to_sqlite(self, filepath: str, include_results: bool = False) -> None: """Export the grid to a pandapower SQLite database. @@ -104,11 +109,11 @@ def to_sqlite(self, filepath: str, include_results: bool = False) -> None: filepath: Destination file path (e.g. ``"output/grid.sqlite"``). include_results: Whether to include power flow results. """ - import pandapower as pp + pp = _require_pandapower() os.makedirs(os.path.dirname(os.path.abspath(filepath)), exist_ok=True) pp.to_sqlite(self._get_pandapower_net(), filepath, include_results=include_results) - print(f"-> pandapower SQLite export: {filepath}") + logger.info(f"-> pandapower SQLite export: {filepath}") def to_pickle(self, filepath: str) -> None: """Export the grid to a pandapower pickle file. @@ -116,10 +121,10 @@ def to_pickle(self, filepath: str) -> None: Args: filepath: Destination file path (e.g. ``"output/grid.p"``). """ - import pandapower as pp + pp = _require_pandapower() os.makedirs(os.path.dirname(os.path.abspath(filepath)), exist_ok=True) pp.to_pickle(self._get_pandapower_net(), filepath) - print(f"-> pandapower pickle export: {filepath}") + logger.info(f"-> pandapower pickle export: {filepath}") # ------------------------------------------------------------------ # Pypowsybl exports @@ -129,8 +134,8 @@ def to_pypowsybl(self, filepath: str, format: str = "XIIDM", parameters: Optional[dict] = None) -> None: """Export the grid using pypowsybl's built-in save. - Supported formats: CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL, - BIIDM, JIIDM. + Supported formats: CGMES, XIIDM, MATPOWER, PSS/E, AMPL, BIIDM, + JIIDM. (UCTE needs UCTE node codes and fails on synthetic grids.) Args: filepath: Destination path (file or directory depending on format). @@ -142,7 +147,7 @@ def to_pypowsybl(self, filepath: str, format: str = "XIIDM", os.makedirs(parent, exist_ok=True) self._get_pypowsybl_net().save(filepath, format=format, parameters=parameters) - print(f"-> pypowsybl {format} export: {filepath}") + logger.info(f"-> pypowsybl {format} export: {filepath}") # ------------------------------------------------------------------ # Convenience aliases diff --git a/powergrid_synth/core/input_extractor.py b/powergrid_synth/core/input_extractor.py index 525ba1f..2e3dbb3 100644 --- a/powergrid_synth/core/input_extractor.py +++ b/powergrid_synth/core/input_extractor.py @@ -8,6 +8,7 @@ import networkx as nx from typing import Dict, List, Tuple +from ._logging import logger def extract_topology_params_from_graph(G: nx.Graph) -> Dict: r""" @@ -36,7 +37,7 @@ def extract_topology_params_from_graph(G: nx.Graph) -> Dict: ``{(i, j): (deg_i_to_j, deg_j_to_i)}`` for each pair of voltage levels that has at least one transformer edge. """ - print("Extracting topology parameters...") + logger.debug("Extracting topology parameters...") # Get sorted unique voltage levels present in the graph # We use a set comprehension to handle missing attributes gracefully if needed diff --git a/powergrid_synth/core/visualization.py b/powergrid_synth/core/visualization.py index 4c06ced..bf6b1d3 100644 --- a/powergrid_synth/core/visualization.py +++ b/powergrid_synth/core/visualization.py @@ -10,6 +10,7 @@ import numpy as np from matplotlib.widgets import Button from typing import Dict, Any, Tuple, List, Optional +from ._logging import logger class MatplotlibDropdown: """ @@ -375,7 +376,7 @@ def plot_subgraphs(self, grid: nx.Graph, layout: str = 'kamada_kawai', title: st n_plots = len(levels) if n_plots == 0: - print("No voltage levels found in grid.") + logger.warning("No voltage levels found in grid.") return # Calculate grid dimensions (max 3 cols) @@ -493,7 +494,7 @@ def _draw_bus_types_on_ax(self, ax, graph: nx.Graph, layout_name: str, title: st legend_loc='center left', legend_bbox=(1, 0.5), bbox_transform=None, show_impedance: bool = False): """Helper to draw bus type visualization on a specific axis.""" - print(f"Calculating layout '{layout_name}' for bus types...") + logger.debug(f"Calculating layout '{layout_name}' for bus types...") # 1. Calculate Layout if layout_name == 'kamada_kawai': pos = nx.kamada_kawai_layout(graph) @@ -633,7 +634,7 @@ def _draw_graph_on_ax(self, ax, graph, layout_name, title, show_labels, legend_loc='upper right', legend_bbox=None, bbox_transform=None, show_impedance: bool = False): """Helper to draw graph on a specific axis.""" - print(f"Calculating layout '{layout_name}'...") + logger.debug(f"Calculating layout '{layout_name}'...") if layout_name == 'kamada_kawai': pos = nx.kamada_kawai_layout(graph) elif layout_name == 'spring': @@ -724,7 +725,7 @@ def plot_interactive_voltage_level(self, graph: nx.Graph, level: int, title: Opt """Opens an interactive window for a specific voltage level.""" nodes = [n for n, d in graph.nodes(data=True) if d.get('voltage_level') == level] if not nodes: - print(f"No nodes found for voltage level {level}") + logger.warning(f"No nodes found for voltage level {level}") return subgraph = graph.subgraph(nodes) diff --git a/powergrid_synth/distribution/__init__.py b/powergrid_synth/distribution/__init__.py index 0134dc9..d71ffd5 100644 --- a/powergrid_synth/distribution/__init__.py +++ b/powergrid_synth/distribution/__init__.py @@ -18,7 +18,7 @@ ExponentialClip, CurrentThreshold, ) -from .distribution_synthesis import SchweetzerFeederGenerator +from .distribution_synthesis import SchweitzerFeederGenerator, SchweetzerFeederGenerator from .distribution_validation import ( compare_feeders, compute_emergent_properties, @@ -47,7 +47,8 @@ "ExponentialClip", "CurrentThreshold", # Synthesis - "SchweetzerFeederGenerator", + "SchweitzerFeederGenerator", + "SchweetzerFeederGenerator", # deprecated misspelling, kept for compatibility # Validation "compare_feeders", "compute_emergent_properties", diff --git a/powergrid_synth/distribution/distribution_analysis.py b/powergrid_synth/distribution/distribution_analysis.py index 596e145..fd2ec91 100644 --- a/powergrid_synth/distribution/distribution_analysis.py +++ b/powergrid_synth/distribution/distribution_analysis.py @@ -267,7 +267,7 @@ def fit_params_from_feeders( Returns ------- DistributionSynthParams - Fitted parameter set ready for ``SchweetzerFeederGenerator``. + Fitted parameter set ready for ``SchweitzerFeederGenerator``. """ hops = _hop_distances(feeders) degs = _degrees(feeders) diff --git a/powergrid_synth/distribution/distribution_converter.py b/powergrid_synth/distribution/distribution_converter.py index c2d3a3a..c2ddb7d 100644 --- a/powergrid_synth/distribution/distribution_converter.py +++ b/powergrid_synth/distribution/distribution_converter.py @@ -10,6 +10,8 @@ import networkx as nx import numpy as np +from .._extras import EXPORT_INSTALL_HINT + def pandapower_to_feeders(net: Any) -> list[nx.Graph]: """Convert a pandapower network to a list of Schweitzer-format feeder graphs. @@ -17,7 +19,7 @@ def pandapower_to_feeders(net: Any) -> list[nx.Graph]: Each connected component with at least three nodes is returned as a separate graph annotated with the attributes expected by :func:`~powergrid_synth.distribution.fit_params_from_feeders` and - :class:`~powergrid_synth.distribution.SchweetzerFeederGenerator`: + :class:`~powergrid_synth.distribution.SchweitzerFeederGenerator`: * **Node attributes**: ``h`` (hop distance from root), ``P_mw`` (positive = load, negative = generation), ``node_type`` @@ -171,7 +173,7 @@ def pypowsybl_to_feeders(network: Any) -> list[nx.Graph]: It extracts buses, lines, two-winding transformers, loads, and generators from the pypowsybl Network and builds annotated feeder graphs suitable for :func:`~powergrid_synth.distribution.fit_params_from_feeders` - and :class:`~powergrid_synth.distribution.SchweetzerFeederGenerator`. + and :class:`~powergrid_synth.distribution.SchweitzerFeederGenerator`. Parameters ---------- @@ -189,7 +191,7 @@ def pypowsybl_to_feeders(network: Any) -> list[nx.Graph]: except ImportError as exc: raise ImportError( "pypowsybl is required for pypowsybl_to_feeders. " - "Install it with: pip install powergrid_synth[export]" + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc G = nx.Graph() diff --git a/powergrid_synth/distribution/distribution_synthesis.py b/powergrid_synth/distribution/distribution_synthesis.py index eccc4b2..06aab09 100644 --- a/powergrid_synth/distribution/distribution_synthesis.py +++ b/powergrid_synth/distribution/distribution_synthesis.py @@ -9,25 +9,28 @@ 4. **Cable type** — Exponential current-ratio sampling with cable library. 5. **Cable length** — modified Cauchy distribution with hop-dependent clipping. -Returns an annotated :class:`networkx.Graph`. +Returns an annotated :class:`~powergrid_synth.core.grid_graph.DistributionGrid` +(a :class:`networkx.Graph` subclass). """ from __future__ import annotations import math +import warnings from typing import Dict, List, Optional, Tuple import networkx as nx import numpy as np from scipy import stats +from ..core.grid_graph import DistributionGrid from .distribution_params import ( CableLibraryEntry, DistributionSynthParams, ) -class SchweetzerFeederGenerator: +class SchweitzerFeederGenerator: """Generate a single MV radial distribution feeder. Parameters @@ -58,7 +61,8 @@ def generate_feeder( v_nom_kv: float = 10.0, assign_cable_types: bool = True, assign_cable_lengths: bool = True, - ) -> nx.Graph: + match_totals: bool = True, + ) -> DistributionGrid: """Generate a complete MV distribution feeder. Parameters @@ -69,6 +73,7 @@ def generate_feeder( Total real-power load (MW) to be distributed across load buses. total_gen_mw : float, optional Total real-power generation/injection (MW). Default 0. + Generation is stored as negative ``P_mw`` on injection nodes. v_nom_kv : float, optional Nominal MV voltage in kV. Default 10. assign_cable_types : bool, optional @@ -76,16 +81,24 @@ def generate_feeder( assign_cable_lengths : bool, optional Whether to run Step 5 (cable length and impedance assignment). Default True. + match_totals : bool, optional + If ``True`` (default), the sampled per-node shares are + rescaled so the feeder's load and generation add up to + exactly *total_load_mw* and *total_gen_mw*. With ``False`` + the shares are used as sampled, which reproduces releases + up to 0.1.1; the load total then overshoots the request, + more so for larger feeders (median about 1.7x at 200 nodes + with the default parameters). Returns ------- - nx.Graph + DistributionGrid Annotated graph with node attributes (``h``, ``P_mw``, ``Q_mvar``, ``pf``, ``node_type``) and, when enabled, edge attributes (``cable_type``, ``length_km``, ``r_ohm``, ``x_ohm``, ``max_i_ka``, ``I_est_ka``). """ - G = nx.Graph() + G = DistributionGrid() # Step 1: generate nodes with hop distances and power factors self._generate_nodes(G, n_nodes) @@ -94,7 +107,7 @@ def generate_feeder( self._connect_nodes(G) # Step 3: assign node properties (load / generation / intermediate) - self._assign_node_properties(G, total_load_mw, total_gen_mw) + self._assign_node_properties(G, total_load_mw, total_gen_mw, match_totals) # Step 4: assign cable types (optional) if assign_cable_types: @@ -237,7 +250,11 @@ def _connect_nodes(self, G: nx.Graph) -> None: # ------------------------------------------------------------------ def _assign_node_properties( - self, G: nx.Graph, total_load_mw: float, total_gen_mw: float + self, + G: nx.Graph, + total_load_mw: float, + total_gen_mw: float, + match_totals: bool = True, ) -> None: """Assign intermediate / injection / load node types and powers.""" nodes = list(G.nodes) @@ -254,10 +271,10 @@ def _assign_node_properties( # 3b: Injection (generation) nodes if total_gen_mw > 0: - self._assign_injection(G, total_gen_mw) + self._assign_injection(G, total_gen_mw, match_totals) # 3c: Load (consumption) nodes - self._assign_load(G, total_load_mw) + self._assign_load(G, total_load_mw, match_totals) def _assign_intermediate(self, G: nx.Graph) -> None: """Mark a fraction of nodes as intermediate (zero load).""" @@ -296,7 +313,9 @@ def _assign_intermediate(self, G: nx.Graph) -> None: G.nodes[chosen]["node_type"] = "intermediate" available.remove(chosen) - def _assign_injection(self, G: nx.Graph, total_gen_mw: float) -> None: + def _assign_injection( + self, G: nx.Graph, total_gen_mw: float, match_totals: bool = True + ) -> None: """Assign power injection to a fraction of nodes.""" p = self.params n_total = G.number_of_nodes() @@ -340,17 +359,40 @@ def _assign_injection(self, G: nx.Graph, total_gen_mw: float) -> None: if n_inj_actual == 0: return + # Each node's share of the total is the uniform share 1/N plus a + # sampled deviation, redrawn until the share is positive. + shares = [] for n in injection_nodes: while True: eps = self.rng.normal(nd.mu, nd.sigma) if 1.0 / n_inj_actual + eps > 0: break + shares.append(1.0 / n_inj_actual + eps) + + scale = self._share_scale(shares, match_totals) + for n, share in zip(injection_nodes, shares): pf = G.nodes[n]["pf"] - P = -total_gen_mw * (1.0 / n_inj_actual + eps) + P = -total_gen_mw * share * scale G.nodes[n]["P_mw"] = P G.nodes[n]["Q_mvar"] = P * math.tan(math.acos(pf)) - def _assign_load(self, G: nx.Graph, total_load_mw: float) -> None: + @staticmethod + def _share_scale(shares: List[float], match_totals: bool) -> float: + """Factor that makes the sampled shares sum to one. + + Redrawing negative shares shifts their mean above 1/N, so the raw + shares add up to more than one and the feeder would exceed the + requested total. Dividing by their sum restores the total while + keeping the relative spread between nodes. + """ + total = sum(shares) + if not match_totals or total <= 0: + return 1.0 + return 1.0 / total + + def _assign_load( + self, G: nx.Graph, total_load_mw: float, match_totals: bool = True + ) -> None: """Assign positive load to all remaining (non-intermediate, non-inj) nodes.""" p = self.params load_nodes = [ @@ -362,6 +404,7 @@ def _assign_load(self, G: nx.Graph, total_load_mw: float) -> None: return tls = p.load_deviation + shares = [] for n in load_nodes: while True: eps = stats.t.rvs( @@ -370,8 +413,12 @@ def _assign_load(self, G: nx.Graph, total_load_mw: float) -> None: ) if 1.0 / n_load + eps > 0: break + shares.append(1.0 / n_load + eps) + + scale = self._share_scale(shares, match_totals) + for n, share in zip(load_nodes, shares): pf = G.nodes[n]["pf"] - P = total_load_mw * (1.0 / n_load + eps) + P = total_load_mw * share * scale G.nodes[n]["P_mw"] = P G.nodes[n]["Q_mvar"] = P * math.tan(math.acos(pf)) @@ -510,3 +557,20 @@ def _assign_cable_lengths(self, G: nx.Graph) -> None: x_per_km = G.edges[u, v].get("x_per_km", 0.0) G.edges[u, v]["r_ohm"] = r_per_km * raw G.edges[u, v]["x_ohm"] = x_per_km * raw + + +class SchweetzerFeederGenerator(SchweitzerFeederGenerator): + """Deprecated misspelling of :class:`SchweitzerFeederGenerator`. + + Kept so existing code keeps working; it will be removed in a future + release. + """ + + def __init__(self, *args, **kwargs): + warnings.warn( + "SchweetzerFeederGenerator is a misspelling and will be removed " + "in a future release; use SchweitzerFeederGenerator instead.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) diff --git a/powergrid_synth/distribution/synthesize.py b/powergrid_synth/distribution/synthesize.py index 1ca6b47..49f8e42 100644 --- a/powergrid_synth/distribution/synthesize.py +++ b/powergrid_synth/distribution/synthesize.py @@ -20,7 +20,7 @@ Example — Mode I (reference-based, pandapower):: - from powergrid_synth.distribution.synthesize import synthesize_distribution + from powergrid_synth import synthesize_distribution feeders = synthesize_distribution( mode="reference", @@ -58,11 +58,14 @@ from __future__ import annotations +from .._extras import EXPORT_INSTALL_HINT import os from typing import Dict, List, Optional, Sequence, Union import networkx as nx +from ..core._logging import logger, verbosity +from ..core.grid_graph import DistributionGrid from .distribution_analysis import fit_params_from_feeders from .distribution_converter import ( feeder_summary, @@ -70,7 +73,7 @@ pypowsybl_to_feeders, ) from .distribution_params import DistributionSynthParams -from .distribution_synthesis import SchweetzerFeederGenerator +from .distribution_synthesis import SchweitzerFeederGenerator from .distribution_validation import ( compare_feeders, compute_emergent_properties, @@ -82,6 +85,8 @@ # pandapower built-in distribution cases # --------------------------------------------------------------------------- +_EXPORT_FORMATS = ("json", "excel", "sqlite", "pickle") + _PP_DISTRIBUTION_CASES = { "cigre_lv": "create_cigre_network_lv", "cigre_mv": "create_cigre_network_mv", @@ -95,7 +100,7 @@ def _get_pandapower_dist_case(name: str): except ImportError as exc: raise ImportError( "synthesize_distribution() in reference mode requires " - "pandapower. Install it with: pip install pandapower" + f"pandapower. Install it with: {EXPORT_INSTALL_HINT}" ) from exc factory_name = _PP_DISTRIBUTION_CASES.get(name) @@ -131,12 +136,14 @@ def synthesize_distribution( v_nom_kv: float = 10.0, assign_cable_types: bool = True, assign_cable_lengths: bool = True, + match_totals: bool = True, # --- Common parameters --- seed: Optional[int] = None, output_dir: Optional[str] = None, output_name: str = "synthetic_feeder", - export_formats: Sequence[str] = ("json",), -) -> List[nx.Graph]: + export_formats: Optional[Sequence[str]] = ("json",), + verbose: bool = True, +) -> List[DistributionGrid]: """Run the full Schweitzer distribution synthesis pipeline. Parameters @@ -179,27 +186,88 @@ def synthesize_distribution( Run Step 4 — cable type assignment (default True). assign_cable_lengths : bool Run Step 5 — cable length / impedance assignment (default True). + match_totals : bool + Rescale the sampled per-node shares so each feeder's load and + generation add up to exactly *total_load_mw* / *total_gen_mw* + (default True). See + :meth:`SchweitzerFeederGenerator.generate_feeder`. seed : int, optional Random seed for reproducibility. output_dir : str, optional - If given, export feeders to this directory. + If given, export feeders to this directory. Nothing is written + when it is ``None`` (default). output_name : str Base filename (without extension) for exported files. export_formats : sequence of str Export formats when *output_dir* is set. Supported: ``"json"``, ``"excel"``, ``"sqlite"``, ``"pickle"``. + verbose : bool + If ``True`` (default), print one progress line per stage. + ``False`` prints warnings only. For finer control see + :func:`powergrid_synth.set_verbosity`. Returns ------- - list[nx.Graph] - Generated synthetic feeders as annotated NetworkX graphs. + list[DistributionGrid] + Generated synthetic feeders, each a + :class:`~powergrid_synth.core.grid_graph.DistributionGrid` + (a :class:`networkx.Graph` subclass). Nodes carry ``h`` (hop + distance from the source), ``node_type`` (``'load'`` / + ``'injection'`` / ``'intermediate'``), ``P_mw``, ``Q_mvar`` + (negative for generation) and ``pf``. Edges carry + ``cable_type``, ``length_km``, ``r_ohm``, ``x_ohm`` and + ``max_i_ka``. Raises ------ ValueError - If *mode* is invalid or required arguments are missing. + If *mode* is invalid, required arguments are missing, or + *export_formats* contains an unknown format name. """ + with verbosity(logger.level if verbose else "warning"): + return _synthesize_distribution( + mode=mode, + reference_case=reference_case, + reference_net=reference_net, + reference_file=reference_file, + params=params, + n_feeders=n_feeders, + n_nodes=n_nodes, + total_load_mw=total_load_mw, + total_gen_mw=total_gen_mw, + v_nom_kv=v_nom_kv, + assign_cable_types=assign_cable_types, + assign_cable_lengths=assign_cable_lengths, + match_totals=match_totals, + seed=seed, + output_dir=output_dir, + output_name=output_name, + export_formats=export_formats, + ) + + +def _synthesize_distribution( + *, + mode, + reference_case, + reference_net, + reference_file, + params, + n_feeders, + n_nodes, + total_load_mw, + total_gen_mw, + v_nom_kv, + assign_cable_types, + assign_cable_lengths, + match_totals, + seed, + output_dir, + output_name, + export_formats, +) -> List[DistributionGrid]: + """Implementation of :func:`synthesize_distribution`.""" # ------------------------------------------------------------------ # 0. Validate inputs # ------------------------------------------------------------------ @@ -220,6 +288,23 @@ def synthesize_distribution( "reference_file, or reference_case." ) + if n_feeders < 1: + raise ValueError(f"n_feeders must be at least 1, got {n_feeders}.") + + # Check the export formats now rather than after generation. + if isinstance(export_formats, str): + export_formats = [export_formats] + export_formats = [f.lower().strip() for f in (export_formats or [])] + unknown = [f for f in export_formats if f not in _EXPORT_FORMATS] + if unknown and output_dir is not None: + raise ValueError( + f"Unknown export format(s) {unknown} for distribution feeders. " + f"Available: {list(_EXPORT_FORMATS)}." + ) + if output_dir is not None and export_formats: + from ..core.data_format_converter import _require_pandapower + _require_pandapower() + # ------------------------------------------------------------------ # 1. Obtain synthesis parameters # ------------------------------------------------------------------ @@ -234,19 +319,19 @@ def synthesize_distribution( summary = feeder_summary(ref_feeders) n_ref = len(ref_feeders) avg_nodes = sum(s["n_nodes"] for s in summary) / n_ref if n_ref else 0 - print( + logger.info( f"[1] Loaded {n_ref} reference feeder(s): " f"avg {avg_nodes:.0f} nodes." ) else: fitted_params = params if params is not None else DistributionSynthParams() - print("[1] Using default / user-supplied parameters.") + logger.info("[1] Using default / user-supplied parameters.") # ------------------------------------------------------------------ # 2. Generate synthetic feeders # ------------------------------------------------------------------ - gen = SchweetzerFeederGenerator(params=fitted_params, seed=seed) - synthetic_feeders: List[nx.Graph] = [] + gen = SchweitzerFeederGenerator(params=fitted_params, seed=seed) + synthetic_feeders: List[DistributionGrid] = [] for i in range(n_feeders): feeder = gen.generate_feeder( @@ -256,6 +341,7 @@ def synthesize_distribution( v_nom_kv=v_nom_kv, assign_cable_types=assign_cable_types, assign_cable_lengths=assign_cable_lengths, + match_totals=match_totals, ) synthetic_feeders.append(feeder) @@ -265,7 +351,7 @@ def synthesize_distribution( if n_feeders else 0 ) - print( + logger.info( f"[2] Generated {n_feeders} synthetic feeder(s): " f"avg {avg_syn_nodes:.0f} nodes, " f"{n_nodes} requested." @@ -277,15 +363,15 @@ def synthesize_distribution( for i, feeder in enumerate(synthetic_feeders): issues = validate_tree(feeder) if issues: - print(f" [!] Feeder {i}: {issues}") + logger.warning(f" [!] Feeder {i}: {issues}") if ref_feeders and len(ref_feeders) > 0: kl = compare_feeders(synthetic_feeders[0], ref_feeders[0]) parts = ", ".join(f"{k}={v:.3f}" for k, v in kl.items()) - print(f"[3] KL divergence (feeder 0 vs ref 0): {parts}") + logger.info(f"[3] KL divergence (feeder 0 vs ref 0): {parts}") else: props = compute_emergent_properties(synthetic_feeders[0]) - print( + logger.info( f"[3] Feeder 0 properties: " f"{props['n_nodes']} nodes, " f"{props['n_edges']} edges, " @@ -296,7 +382,7 @@ def synthesize_distribution( # ------------------------------------------------------------------ # 4. Export (optional) # ------------------------------------------------------------------ - if output_dir is not None: + if output_dir is not None and export_formats: os.makedirs(output_dir, exist_ok=True) _export_feeders( synthetic_feeders, @@ -304,9 +390,9 @@ def synthesize_distribution( output_name=output_name, export_formats=export_formats, ) - print(f"[4] Exported to {output_dir}/") + logger.info(f"[4] Exported to {output_dir}{os.sep}") - print("[Done]") + logger.info("Done.") return synthetic_feeders @@ -337,8 +423,8 @@ def _load_reference_feeders( import pypowsybl as pp except ImportError as exc: raise ImportError( - "Loading from file requires pypowsybl. " - "Install it with: pip install pypowsybl" + "Loading from file requires pypowsybl. " + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc net = pp.network.load(reference_file) return pypowsybl_to_feeders(net) @@ -357,8 +443,8 @@ def _load_reference_feeders( import pypowsybl as pp except ImportError as exc: raise ImportError( - "Loading from file requires pypowsybl. " - "Install it with: pip install pypowsybl" + "Loading from file requires pypowsybl. " + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc net = pp.network.load(reference_case) return pypowsybl_to_feeders(net) @@ -397,8 +483,3 @@ def _export_feeders( exporter.to_sqlite(filepath + ".sqlite") elif fmt_lower == "pickle": exporter.to_pickle(filepath + ".p") - else: - print( - f" [!] Unknown format {fmt!r} for distribution, " - f"skipping. Available: json, excel, sqlite, pickle" - ) diff --git a/powergrid_synth/transmission/bus_type_allocator.py b/powergrid_synth/transmission/bus_type_allocator.py index 0ba03ae..7f3a7b1 100644 --- a/powergrid_synth/transmission/bus_type_allocator.py +++ b/powergrid_synth/transmission/bus_type_allocator.py @@ -12,6 +12,8 @@ import math import random from typing import List, Dict, Tuple, Optional +from ..core._logging import logger +from ..core._graph_utils import store_node_attribute class BusTypeAllocator: @@ -404,7 +406,8 @@ def _estimate_w_star(self, monte_carlo_iters: int = 2000) -> Tuple[float, float] w_star = (d_param * std_w) + mean_w return w_star, std_w - def allocate(self, max_iter: int = 100, population_size: int = 20) -> Dict[int, str]: + def allocate(self, max_iter: int = 100, population_size: int = 20, + update_graph: bool = True) -> Dict[int, str]: r""" Run the AIS optimization to find a bus type assignment. @@ -435,6 +438,10 @@ def allocate(self, max_iter: int = 100, population_size: int = 20) -> Dict[int, Maximum number of AIS iterations (default 100). population_size : int, optional Number of individuals surviving each generation (default 20). + update_graph : bool, optional + If ``True`` (default), store the result on the graph as the + ``'bus_type'`` node attribute, which the later pipeline stages + read. Pass ``False`` to only get the mapping back. Returns ------- @@ -442,11 +449,11 @@ def allocate(self, max_iter: int = 100, population_size: int = 20) -> Dict[int, Mapping from node ID to bus type label (``'Gen'``, ``'Load'``, or ``'Conn'``). """ - print(f"Starting Bus Type Allocation (N={self.n_nodes}, M={self.n_edges})...") + logger.debug(f"Starting Bus Type Allocation (N={self.n_nodes}, M={self.n_edges})...") # 1. Estimate Target W* and Standard Deviation w_star, std_w = self._estimate_w_star() - print(f" Target Entropy Score (W*): {w_star:.4f}, Std Dev: {std_w:.4f}") + logger.debug(f" Target Entropy Score (W*): {w_star:.4f}, Std Dev: {std_w:.4f}") # Determine Convergence Criteria (Logic from MATLAB) if self.n_nodes < 50: @@ -484,11 +491,11 @@ def allocate(self, max_iter: int = 100, population_size: int = 20) -> Dict[int, # Check Convergence if best_error < criteria: - print(f" Converged at iteration {it}. Error: {best_error:.6f} < Criteria: {criteria:.6f}") + logger.debug(f" Converged at iteration {it}. Error: {best_error:.6f} < Criteria: {criteria:.6f}") break if it % 10 == 0: - print(f" Iter {it}: Best Error = {best_error:.6f}") + logger.debug(f" Iter {it}: Best Error = {best_error:.6f}") # B. Clonal Selection # Select top solutions to clone. @@ -568,7 +575,10 @@ def allocate(self, max_iter: int = 100, population_size: int = 20) -> Dict[int, for i, type_code in enumerate(best_solution): node_id = self.idx_to_node[i] bus_types[int(node_id)] = type_labels[type_code] - + + if update_graph: + store_node_attribute(self.graph, bus_types, "bus_type") + return bus_types def plot_entropy_pdf(self, figsize: Tuple[int, int] = (10, 6)): @@ -588,11 +598,11 @@ def plot_entropy_pdf(self, figsize: Tuple[int, int] = (10, 6)): import matplotlib.pyplot as plt from scipy.stats import norm except ImportError: - print("Matplotlib or Scipy not installed. Cannot plot PDF.") + logger.warning("Matplotlib or Scipy not installed. Cannot plot PDF.") return if not hasattr(self, 'w_samples') or not self.w_samples: - print("No entropy samples available. Please run allocate() first.") + logger.warning("No entropy samples available. Please run allocate() first.") return plt.figure(figsize=figsize) diff --git a/powergrid_synth/transmission/capacity_allocator.py b/powergrid_synth/transmission/capacity_allocator.py index a0737c2..677689f 100644 --- a/powergrid_synth/transmission/capacity_allocator.py +++ b/powergrid_synth/transmission/capacity_allocator.py @@ -16,6 +16,8 @@ import math from typing import List, Dict, Tuple, Optional from ..core.reference_data import get_reference_stats +from ..core._logging import logger +from ..core._graph_utils import require_node_attribute, store_node_attribute class CapacityAllocator: """ @@ -139,7 +141,7 @@ def _get_default_tab_2d(self) -> np.ndarray: stats = get_reference_stats(self.ref_sys_id) return stats['Tab_2D_Pgmax'] except ValueError as e: - print(f"Warning: {e} Defaulting to Reference System 1.") + logger.warning(f"Warning: {e} Defaulting to Reference System 1.") stats = get_reference_stats(1) return stats['Tab_2D_Pgmax'] @@ -348,7 +350,8 @@ def _assignment_logic(self, norm_deg_pairs: np.ndarray, norm_caps: np.ndarray, t gen_setting = np.vstack(final_list) return gen_setting - def allocate(self, tab_2d: Optional[np.ndarray] = None) -> Dict[int, float]: + def allocate(self, tab_2d: Optional[np.ndarray] = None, + update_graph: bool = True) -> Dict[int, float]: """ Run the full generation-capacity allocation pipeline. @@ -368,15 +371,35 @@ def allocate(self, tab_2d: Optional[np.ndarray] = None) -> Dict[int, float]: tab_2d : np.ndarray or None, optional Custom 14x14 probability matrix. If *None*, the default table for the selected ``ref_sys_id`` is used. + update_graph : bool, optional + If ``True`` (default), store the result on the graph as the + ``'pg_max'`` node attribute of the generator buses. Returns ------- dict[int, float] Mapping from generator node ID to its assigned capacity ``Pg_max`` (MW). + + Raises + ------ + ValueError + If no node carries a ``'bus_type'`` attribute, i.e. bus types + have not been assigned yet. """ + require_node_attribute( + self.graph, "bus_type", + needed_by="CapacityAllocator", + set_by="BusTypeAllocator(graph).allocate()", + ) + # Bus types may have been assigned after this object was created. + self.gen_buses = [n for n, d in self.graph.nodes(data=True) if d.get('bus_type') == 'Gen'] + self.n_gen = len(self.gen_buses) + if self.n_gen == 0: - print("No generator buses found. Skipping capacity allocation.") + logger.warning("No generator buses found. Skipping capacity allocation.") + if update_graph: + store_node_attribute(self.graph, {}, "pg_max") return {} if tab_2d is None: @@ -389,8 +412,8 @@ def allocate(self, tab_2d: Optional[np.ndarray] = None) -> Dict[int, float]: total_gen = 10**exponent ref_label = "Heuristic (Default)" if self.ref_sys_id == 0 else f"Reference System {self.ref_sys_id}" - print(f"Allocating Capacity for {self.n_gen} generators.") - print(f"Total System Capacity Target: {total_gen:.2f} MW using {ref_label}") + logger.debug(f"Allocating Capacity for {self.n_gen} generators.") + logger.debug(f"Total System Capacity Target: {total_gen:.2f} MW using {ref_label}") # 2. Get Node Degrees for Generators gen_degrees = [] @@ -420,5 +443,8 @@ def allocate(self, tab_2d: Optional[np.ndarray] = None) -> Dict[int, float]: norm_cap = row[2] actual_cap = norm_cap * max_r_pgmax final_allocation[node_id] = actual_cap - + + if update_graph: + store_node_attribute(self.graph, final_allocation, "pg_max") + return final_allocation \ No newline at end of file diff --git a/powergrid_synth/transmission/generation_dispatcher.py b/powergrid_synth/transmission/generation_dispatcher.py index 44b665f..83824a3 100644 --- a/powergrid_synth/transmission/generation_dispatcher.py +++ b/powergrid_synth/transmission/generation_dispatcher.py @@ -20,6 +20,8 @@ import networkx as nx from typing import List, Dict, Tuple, Optional from ..core.reference_data import get_reference_stats +from ..core._logging import logger +from ..core._graph_utils import require_node_attribute, store_node_attribute class GenerationDispatcher: @@ -66,7 +68,7 @@ def __init__(self, graph: nx.Graph, ref_sys_id: int = 1): try: self.stats = get_reference_stats(ref_sys_id) except ValueError: - print(f"Warning: Invalid ref_sys_id {ref_sys_id}. Defaulting to 1.") + logger.warning(f"Warning: Invalid ref_sys_id {ref_sys_id}. Defaulting to 1.") self.stats = get_reference_stats(1) self.alpha_mod = self.stats['Alpha_mod'] @@ -277,7 +279,7 @@ def _assign_alphas(self, units: np.ndarray, alphas: np.ndarray) -> np.ndarray: return np.array(final_list) if final_list else np.array([]) - def dispatch(self) -> Dict[int, float]: + def dispatch(self, update_graph: bool = True) -> Dict[int, float]: r"""Run the full generation dispatch pipeline. Implements the algorithm of Sadeghian et al. (2018): @@ -297,18 +299,43 @@ def dispatch(self) -> Dict[int, float]: 5. Convert normalised dispatch back to MW: :math:`P_{g_i} = \alpha_i \cdot \bar{P}_{g_i}^{\max} \cdot P^{\max}_{g_{\max}}`. + Parameters + ---------- + update_graph : bool, optional + If ``True`` (default), store the result on the graph as the + ``'pg'`` node attribute of the generator buses. + Returns ------- dict Mapping of generator bus ID to dispatched active power (MW). + + Raises + ------ + ValueError + If bus types or generation capacities have not been assigned + yet. """ + require_node_attribute( + self.graph, "bus_type", + needed_by="GenerationDispatcher", + set_by="BusTypeAllocator(graph).allocate()", + ) # 1. Prepare Buses into (Id, Gen) and (Id, Load) gen_data = [] for n, d in self.graph.nodes(data=True): if d.get('bus_type') == 'Gen': gen_data.append([n, d.get('pg_max', 0.0)]) - if not gen_data: return {} + if not gen_data: + if update_graph: + store_node_attribute(self.graph, {}, "pg") + return {} + require_node_attribute( + self.graph, "pg_max", + needed_by="GenerationDispatcher", + set_by="CapacityAllocator(graph).allocate()", + ) gen_arr = np.array(gen_data) max_pg = np.max(gen_arr[:, 1]) if max_pg == 0: max_pg = 1.0 @@ -421,5 +448,8 @@ def calculate_current_total(): for row in group: gen_mw = row[1] * row[2] * max_pg result[int(row[0])] = gen_mw - + + if update_graph: + store_node_attribute(self.graph, result, "pg") + return result \ No newline at end of file diff --git a/powergrid_synth/transmission/generator.py b/powergrid_synth/transmission/generator.py index 1da4468..26146c9 100644 --- a/powergrid_synth/transmission/generator.py +++ b/powergrid_synth/transmission/generator.py @@ -18,6 +18,7 @@ from .edge_creation import EdgeCreator from .transformer_edges import TransformerConnector from ..core.grid_graph import PowerGridGraph +from ..core._logging import logger class PowerGridGenerator: @@ -92,7 +93,7 @@ def _generate_subgraphs(self, k: int, """ current_global_offset = 0 for i in range(k): - print(f"Generating Level {i}...") + logger.debug(f"Generating Level {i}...") d_input = degrees_by_level[i] delta_input = diameters_by_level[i] @@ -111,7 +112,7 @@ def _generate_subgraphs(self, k: int, all_edges[edge] = {'type': 'line'} current_global_offset += n_nodes - print(f" -> Level {i} Complete. Nodes: {n_nodes}, Edges: {len(local_edges)}") + logger.debug(f" -> Level {i} Complete. Nodes: {n_nodes}, Edges: {len(local_edges)}") def _generate_transformer_connections(self, k: int, transformer_degrees: Dict[Tuple[int, int], Tuple[List[int], List[int]]], @@ -139,14 +140,14 @@ def _generate_transformer_connections(self, k: int, *Mutated in place* — ``{(u, v): {'type': 'transformer'}}`` entries are added. """ - print("Generating Transformer Connections...") + logger.debug("Generating Transformer Connections...") for i in range(k): for j in range(i + 1, k): if (i, j) not in transformer_degrees: continue - print(f" -> Connecting Level {i} <-> Level {j}") + logger.debug(f" -> Connecting Level {i} <-> Level {j}") t_i_j_input, t_j_i_input = transformer_degrees[(i, j)] @@ -214,7 +215,7 @@ def generate_grid(self, level_offsets = [0] * k level_node_counts = [0] * k - print(f"--- Starting Generation for {k} Voltage Levels ---") + logger.debug(f"--- Starting Generation for {k} Voltage Levels ---") # ========================================================= # Lines 3-7: Create each same-voltage subgraph @@ -245,7 +246,7 @@ def generate_grid(self, # ========================================================= if keep_lcc: if G.number_of_nodes() > 0: - print("Filtering for Largest Connected Component (LCC)...") + logger.debug("Filtering for Largest Connected Component (LCC)...") original_n = G.number_of_nodes() largest_cc_nodes = max(nx.connected_components(G), key=len) @@ -262,8 +263,8 @@ def generate_grid(self, G = nx.relabel_nodes(G_new, mapping) new_n = G.number_of_nodes() - print(f" -> Kept {new_n} nodes (removed {original_n - new_n} isolated nodes)") + logger.debug(f" -> Kept {new_n} nodes (removed {original_n - new_n} isolated nodes)") else: - print("Warning: Graph is empty, cannot filter for LCC.") + logger.warning("Warning: Graph is empty, cannot filter for LCC.") return G \ No newline at end of file diff --git a/powergrid_synth/transmission/input_configurator.py b/powergrid_synth/transmission/input_configurator.py index 4372eb1..54993eb 100644 --- a/powergrid_synth/transmission/input_configurator.py +++ b/powergrid_synth/transmission/input_configurator.py @@ -33,6 +33,7 @@ import numpy as np from typing import List, Dict, Tuple, Optional, Any from .deg_dist_optimizer import DegreeDistributionOptimizer +from ..core._logging import logger class InputConfigurator: r""" @@ -266,7 +267,7 @@ def create_params(self, dist_type = lvl_cfg.get('dist_type', 'poisson') max_k = lvl_cfg.get('max_k', min(n - 1, 50)) - print(f"Generating Level {i}: {dist_type.upper()} distribution (Avg={avg_k})") + logger.debug(f"Generating Level {i}: {dist_type.upper()} distribution (Avg={avg_k})") if dist_type == 'poisson': deg_seq = self._generate_poisson_degrees(n, avg_k) @@ -288,14 +289,13 @@ def create_params(self, conn_type = cfg.get('type', 'simple') if conn_type == 'k-stars': - print(f"Generating Transformers {i}<->{j}: k-Stars Model") + logger.debug(f"Generating Transformers {i}<->{j}: k-Stars Model") c_val = cfg.get('c', 0.174) gamma_val = cfg.get('gamma', 4.15) - print(gamma_val) t_i, t_j = self._generate_transformer_stars(n_i, n_j, c_val, gamma_val) else: # Simple probabilistic model - print(f"Generating Transformers {i}<->{j}: Simple Probabilistic") + logger.debug(f"Generating Transformers {i}<->{j}: Simple Probabilistic") p_i = cfg.get('p_i_j', 0.0) p_j = cfg.get('p_j_i', 0.0) t_i = self._generate_transformer_simple(n_i, p_i) diff --git a/powergrid_synth/transmission/load_allocator.py b/powergrid_synth/transmission/load_allocator.py index 84242ee..6330a88 100644 --- a/powergrid_synth/transmission/load_allocator.py +++ b/powergrid_synth/transmission/load_allocator.py @@ -3,6 +3,8 @@ import math from typing import List, Dict, Tuple, Optional from ..core.reference_data import get_reference_stats +from ..core._logging import logger +from ..core._graph_utils import require_node_attribute, store_node_attribute class LoadAllocator: @@ -100,7 +102,7 @@ def _get_tab_2d_load(self) -> np.ndarray: stats = get_reference_stats(self.ref_sys_id) return stats['Tab_2D_load'] except ValueError as e: - print(f"Warning: {e} Defaulting to Reference System 1.") + logger.warning(f"Warning: {e} Defaulting to Reference System 1.") stats = get_reference_stats(1) return stats['Tab_2D_load'] @@ -304,7 +306,7 @@ def _assignment_logic(self, norm_deg_pairs: np.ndarray, norm_vals: np.ndarray, t return np.vstack(final_list) - def allocate(self, loading_level: str = 'H') -> Dict[int, float]: + def allocate(self, loading_level: str = 'H', update_graph: bool = True) -> Dict[int, float]: """ Run the full load-allocation pipeline. @@ -328,14 +330,34 @@ def allocate(self, loading_level: str = 'H') -> Dict[int, float]: - ``'L'`` — light (30–40% of generation capacity). - ``'M'`` — medium (50–60% of generation capacity). - ``'H'`` — heavy (70–80% of generation capacity). + update_graph : bool, optional + If ``True`` (default), store the result on the graph as the + ``'pl'`` node attribute of the load buses. Returns ------- dict[int, float] Mapping from load node ID to its assigned active power load (MW). + + Raises + ------ + ValueError + If no node carries a ``'bus_type'`` attribute, i.e. bus types + have not been assigned yet. """ + require_node_attribute( + self.graph, "bus_type", + needed_by="LoadAllocator", + set_by="BusTypeAllocator(graph).allocate()", + ) + # Bus types may have been assigned after this object was created. + self.load_buses = [n for n, d in self.graph.nodes(data=True) if d.get('bus_type') == 'Load'] + self.n_load = len(self.load_buses) + if self.n_load == 0: - print("No load buses found. Skipping load allocation.") + logger.warning("No load buses found. Skipping load allocation.") + if update_graph: + store_node_attribute(self.graph, {}, "pl") return {} # 1. Get Total Generation Capacity from Grid @@ -343,14 +365,14 @@ def allocate(self, loading_level: str = 'H') -> Dict[int, float]: total_gen_capacity = sum(gen_caps) if total_gen_capacity == 0 and loading_level != 'D': - print("Warning: Total generation capacity is 0. Switching to 'D' (Deterministic) loading.") + logger.warning("Warning: Total generation capacity is 0. Switching to 'D' (Deterministic) loading.") loading_level = 'D' # 2. Calculate Total Load total_load = self._calculate_total_load(loading_level, total_gen_capacity) - print(f"Allocating Loads for {self.n_load} load buses.") - print(f"Total System Load Target: {total_load:.2f} MW (Level: {loading_level})") + logger.debug(f"Allocating Loads for {self.n_load} load buses.") + logger.debug(f"Total System Load Target: {total_load:.2f} MW (Level: {loading_level})") # 3. Get Load Bus Degrees load_degrees = [] @@ -381,14 +403,18 @@ def allocate(self, loading_level: str = 'H') -> Dict[int, float]: norm_val = row[2] actual_val = norm_val * max_r_pl final_allocation[node_id] = actual_val - + + if update_graph: + store_node_attribute(self.graph, final_allocation, "pl") + return final_allocation def allocate_reactive( self, - active_loads: Dict[int, float], + active_loads: Optional[Dict[int, float]] = None, pf_min: float = 0.85, pf_max: float = 0.97, + update_graph: bool = True, ) -> Dict[int, float]: """ Derive reactive power loads from active loads using power factors. @@ -402,22 +428,40 @@ def allocate_reactive( Parameters ---------- - active_loads : dict[int, float] + active_loads : dict[int, float], optional Mapping from load node ID to active power load (MW), as returned - by :meth:`allocate`. + by :meth:`allocate`. If omitted, the ``'pl'`` node attributes + stored on the graph by :meth:`allocate` are used. pf_min : float, optional Minimum power factor (default 0.85). pf_max : float, optional Maximum power factor (default 0.97). + update_graph : bool, optional + If ``True`` (default), store the result on the graph as the + ``'ql'`` node attribute. Returns ------- dict[int, float] Mapping from load node ID to reactive power load (Mvar). """ + if active_loads is None: + require_node_attribute( + self.graph, "pl", + needed_by="LoadAllocator.allocate_reactive", + set_by="LoadAllocator(graph).allocate()", + ) + active_loads = { + n: d["pl"] for n, d in self.graph.nodes(data=True) if "pl" in d + } + reactive_loads = {} for node_id, pl in active_loads.items(): pf = np.random.uniform(pf_min, pf_max) ql = pl * np.tan(np.arccos(pf)) reactive_loads[node_id] = ql + + if update_graph: + store_node_attribute(self.graph, reactive_loads, "ql") + return reactive_loads \ No newline at end of file diff --git a/powergrid_synth/transmission/synthesize.py b/powergrid_synth/transmission/synthesize.py index aec62f1..079c64a 100644 --- a/powergrid_synth/transmission/synthesize.py +++ b/powergrid_synth/transmission/synthesize.py @@ -21,7 +21,7 @@ Example — Mode I (reference-based, pandapower):: - from powergrid_synth.synthesize import synthesize + from powergrid_synth import synthesize synthesize( mode="reference", @@ -53,7 +53,7 @@ Example — Mode II (fully synthetic):: - from powergrid_synth.synthesize import synthesize + from powergrid_synth import synthesize synthesize( mode="synthetic", @@ -74,6 +74,7 @@ from __future__ import annotations +from .._extras import EXPORT_INSTALL_HINT import os from typing import Dict, List, Optional, Sequence, Tuple, Union @@ -84,6 +85,7 @@ from .generation_dispatcher import GenerationDispatcher from .generator import PowerGridGenerator from .input_configurator import InputConfigurator +from ..core._logging import logger, verbosity from ..core.input_extractor import extract_topology_params_from_graph from .load_allocator import LoadAllocator from .transmission import TransmissionLineAllocator @@ -95,7 +97,7 @@ def _get_pandapower_cases() -> Dict[str, object]: except ImportError as exc: raise ImportError( "synthesize() in reference mode requires pandapower. " - "Install it with: pip install powergrid_synth[export]" + f"Install it with: {EXPORT_INSTALL_HINT}" ) from exc return {name: getattr(pn, name) for name in dir(pn) if name.startswith("case")} @@ -154,7 +156,8 @@ def synthesize( base_kv_map: Optional[Dict[int, float]] = None, output_dir: str = "output", output_name: str = "synthetic_grid", - export_formats: Sequence[str] = ("json",), + export_formats: Optional[Sequence[str]] = ("json",), + verbose: bool = True, ) -> nx.Graph: """Run the full CLC synthesis pipeline and export the result. @@ -217,23 +220,89 @@ def synthesize( Directory for exported files (created if needed). output_name : str Base filename (without extension) for exported files. - export_formats : sequence of str + export_formats : sequence of str, optional One or more format names to export. Supported: ``"json"``, ``"excel"``, ``"sqlite"``, ``"pickle"``, ``"xiidm"``, ``"cgmes"``, ``"matpower"``, ``"psse"``. + Pass ``None`` or an empty list to skip the export and only get + the graph back. Existing files with the same name are + overwritten, so give each grid its own *output_name*. + verbose : bool + If ``True`` (default), print one progress line per pipeline + stage. ``False`` prints warnings only. For finer control see + :func:`powergrid_synth.set_verbosity`. Returns ------- - nx.Graph - The fully parameterised synthetic grid (a - :class:`~powergrid_synth.grid_graph.PowerGridGraph`). + PowerGridGraph + The fully parameterised synthetic grid, a + :class:`~powergrid_synth.core.grid_graph.PowerGridGraph` + (a :class:`networkx.Graph` subclass). Nodes carry + ``voltage_level``, ``bus_type`` (``'Gen'`` / ``'Load'`` / + ``'Conn'``), ``pg_max`` and ``pg`` (generators, MW), ``pl`` and + ``ql`` (loads, MW / Mvar). Edges carry ``type`` (``'line'`` / + ``'transformer'``), ``r``, ``x``, ``z`` (p.u.) and ``capacity`` + (MW). + + Notes + ----- + The number of buses is approximate. The CLC model pads each level's + degree sequence and, with ``keep_lcc=True``, only the largest connected + component is kept, so the returned grid can be somewhat smaller or + larger than requested (roughly 10 % smaller for a 500-bus synthetic + spec, a few buses larger for an IEEE-118 clone). Check + ``grid.number_of_nodes()`` rather than assuming the requested size. Raises ------ ValueError - If *mode* is not ``"reference"`` or ``"synthetic"``, or if - required arguments for the chosen mode are missing. + If *mode* is not ``"reference"`` or ``"synthetic"``, if + required arguments for the chosen mode are missing, or if + *export_formats* contains an unknown format name. """ + with verbosity(logger.level if verbose else "warning"): + return _synthesize( + mode=mode, + reference_case=reference_case, + reference_net=reference_net, + reference_file=reference_file, + level_specs=level_specs, + connection_specs=connection_specs, + seed=seed, + keep_lcc=keep_lcc, + entropy_model=entropy_model, + bus_type_ratio=bus_type_ratio, + ref_sys_id=ref_sys_id, + loading_level=loading_level, + refine_topology=refine_topology, + base_kv_map=base_kv_map, + output_dir=output_dir, + output_name=output_name, + export_formats=export_formats, + ) + + +def _synthesize( + *, + mode, + reference_case, + reference_net, + reference_file, + level_specs, + connection_specs, + seed, + keep_lcc, + entropy_model, + bus_type_ratio, + ref_sys_id, + loading_level, + refine_topology, + base_kv_map, + output_dir, + output_name, + export_formats, +) -> nx.Graph: + """Implementation of :func:`synthesize` (arguments already documented there).""" # ------------------------------------------------------------------ # 0. Validate inputs # ------------------------------------------------------------------ @@ -256,6 +325,22 @@ def synthesize( "connection_specs." ) + # Check the export formats now rather than after the whole pipeline ran. + if isinstance(export_formats, str): + export_formats = [export_formats] + export_formats = [f.lower().strip() for f in (export_formats or [])] + unknown = [f for f in export_formats if f not in _EXPORT_DISPATCH] + if unknown: + raise ValueError( + f"Unknown export format(s) {unknown}. " + f"Available: {sorted(_EXPORT_DISPATCH)}." + ) + if export_formats: + # Exporting goes through pandapower; fail now, not after the + # whole pipeline has run. + from ..core.data_format_converter import _require_pandapower + _require_pandapower() + # ------------------------------------------------------------------ # 1. Obtain topology parameters # ------------------------------------------------------------------ @@ -271,7 +356,7 @@ def synthesize( if base_kv_map is None: base_kv_map = graph_ref.graph.get("base_kv_map") - print( + logger.info( f"[1] Loaded reference grid: " f"{graph_ref.number_of_nodes()} nodes, " f"{graph_ref.number_of_edges()} edges." @@ -280,7 +365,7 @@ def synthesize( else: # mode == "synthetic" configurator = InputConfigurator(seed=seed) params = configurator.create_params(level_specs, connection_specs) - print(f"[1] Generated synthetic input parameters for {len(level_specs)} voltage levels.") + logger.info(f"[1] Generated synthetic input parameters for {len(level_specs)} voltage levels.") # ------------------------------------------------------------------ # 2. Generate topology @@ -292,7 +377,7 @@ def synthesize( transformer_degrees=params["transformer_degrees"], keep_lcc=keep_lcc, ) - print( + logger.info( f"[2] Topology generated: " f"{graph.number_of_nodes()} nodes, " f"{graph.number_of_edges()} edges." @@ -307,7 +392,6 @@ def synthesize( bus_type_ratio=bus_type_ratio, ) bus_types = allocator.allocate() - nx.set_node_attributes(graph, bus_types, name="bus_type") _print_bus_types(bus_types) # ------------------------------------------------------------------ @@ -315,24 +399,21 @@ def synthesize( # ------------------------------------------------------------------ cap_alloc = CapacityAllocator(graph, ref_sys_id=ref_sys_id) capacities = cap_alloc.allocate() - nx.set_node_attributes(graph, capacities, name="pg_max") total_cap = sum(capacities.values()) - print(f"[4] Generation capacities: total = {total_cap:.1f} MW") + logger.info(f"[4] Generation capacities: total = {total_cap:.1f} MW") # ------------------------------------------------------------------ # 5. Allocate loads # ------------------------------------------------------------------ load_alloc = LoadAllocator(graph, ref_sys_id=ref_sys_id) loads = load_alloc.allocate(loading_level=loading_level) - nx.set_node_attributes(graph, loads, name="pl") - reactive_loads = load_alloc.allocate_reactive(loads) - nx.set_node_attributes(graph, reactive_loads, name="ql") + reactive_loads = load_alloc.allocate_reactive() total_load = sum(loads.values()) total_ql = sum(reactive_loads.values()) - print( + logger.info( f"[5] Loads allocated: total P = {total_load:.1f} MW, " f"Q = {total_ql:.1f} Mvar " - f"({total_load / total_cap:.0%} loading)" + f"({total_load / total_cap if total_cap else 0:.0%} loading)" ) # ------------------------------------------------------------------ @@ -340,9 +421,8 @@ def synthesize( # ------------------------------------------------------------------ dispatcher = GenerationDispatcher(graph, ref_sys_id=ref_sys_id) dispatch = dispatcher.dispatch() - nx.set_node_attributes(graph, dispatch, name="pg") total_gen = sum(dispatch.values()) - print( + logger.info( f"[6] Generation dispatched: {total_gen:.1f} MW " f"(reserve {total_cap - total_gen:.1f} MW)" ) @@ -354,38 +434,39 @@ def synthesize( line_caps = trans_alloc.allocate(refine_topology=refine_topology) n_lines = len(line_caps) avg_cap = sum(line_caps.values()) / n_lines if n_lines else 0 - print( + logger.info( f"[7] Transmission lines: {n_lines} lines, " f"avg capacity = {avg_cap:.1f} MVA" ) + # Keep the voltage mapping with the grid, so converting or exporting it + # later gives the same kV values as the export below. + if base_kv_map is not None: + graph.graph["base_kv_map"] = dict(base_kv_map) + # ------------------------------------------------------------------ # 8. Export # ------------------------------------------------------------------ - from ..core.exporter import GridExporter - - os.makedirs(output_dir, exist_ok=True) - exporter = GridExporter(graph, base_kv_map=base_kv_map) - - for fmt in export_formats: - fmt_lower = fmt.lower().strip() - if fmt_lower not in _EXPORT_DISPATCH: - print(f" [!] Unknown format {fmt!r}, skipping. " - f"Available: {sorted(_EXPORT_DISPATCH)}") - continue - - method_name, default_ext = _EXPORT_DISPATCH[fmt_lower] - filepath = os.path.join(output_dir, output_name + default_ext) - method = getattr(exporter, method_name) - - if fmt_lower == "xiidm": - method(filepath, format="XIIDM") - else: - method(filepath) - - print(f" -> Exported {fmt_lower}: {filepath}") + if export_formats: + from ..core.exporter import GridExporter + + os.makedirs(output_dir, exist_ok=True) + exporter = GridExporter(graph, base_kv_map=base_kv_map) + logger.info(f"[8] Exporting to {output_dir}{os.sep}") + + for fmt in export_formats: + method_name, default_ext = _EXPORT_DISPATCH[fmt] + filepath = os.path.join(output_dir, output_name + default_ext) + method = getattr(exporter, method_name) + + if fmt == "xiidm": + method(filepath, format="XIIDM") + else: + method(filepath) + else: + logger.info("[8] No export requested.") - print("[8] Done.") + logger.info("Done.") return graph @@ -457,4 +538,4 @@ def _print_bus_types(bus_types: Dict[int, str]) -> None: for t in ("Gen", "Load", "Conn") if t in counts ) - print(f"[3] Bus types assigned: {parts}") + logger.info(f"[3] Bus types assigned: {parts}") diff --git a/powergrid_synth/transmission/transmission.py b/powergrid_synth/transmission/transmission.py index 3c94f2b..80c6202 100644 --- a/powergrid_synth/transmission/transmission.py +++ b/powergrid_synth/transmission/transmission.py @@ -384,6 +384,17 @@ def allocate(self, refine_topology: bool = False) -> Dict[Tuple[int, int], float if m_lines == 0: return {} + # Line flows come from a DC power flow on the dispatched grid, so + # generation and load must be on the graph already. Without them + # every flow is zero and the capacities are meaningless. + if not any("pg" in d or "pl" in d for _, d in self.graph.nodes(data=True)): + raise ValueError( + "TransmissionLineAllocator needs generation ('pg') and load " + "('pl') node attributes, but no node of the graph has either. " + "Run LoadAllocator(graph).allocate() and " + "GenerationDispatcher(graph).dispatch() on this graph first." + ) + # 1. Initial Impedance (Zpr) # LogNormal distribution zpr_pars = self.stats.get('Zpr_pars', [-2.38, 1.99, 1.99]) diff --git a/pyproject.toml b/pyproject.toml index e45662d..7e5f908 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,36 @@ [build-system] -requires = ["setuptools>=61.0"] +# 77 is the first setuptools that understands the SPDX "license" field below. +requires = ["setuptools>=77.0"] build-backend = "setuptools.build_meta" [project] +# The project is called GridStudio; the distribution and import name stay +# ``powergrid_synth`` so existing code keeps working. name = "powergrid_synth" -version = "0.1.1" -description = "Synthetic power grid generator based on Chung-Lu-Chain model and MATPOWER SynGrid for the transmission grid system. The distribution grid synthesization is under development. This package is maintained by the AI Energy Lab at TU Delft." +dynamic = ["version"] +description = "GridStudio: synthetic transmission and distribution power grids with realistic topology, generation, load and line parameters, exportable to standard power-system formats." readme = "README.md" +license = "Apache-2.0" +license-files = ["LICENSE"] requires-python = ">=3.10" +keywords = [ + "power grid", + "power systems", + "synthetic data", + "graph generation", + "power flow", + "transmission", + "distribution", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering", +] dependencies = [ "numpy>=2.2", "networkx>=3.4", @@ -16,34 +39,41 @@ dependencies = [ "pandas>=2.3,<3", ] - -[tool.setuptools.packages.find] -where = ["."] -include = ["powergrid_synth*"] -exclude = ["demos*", "tests*"] - [project.optional-dependencies] +# Needed for synthesize(), synthesize_distribution() in reference mode, +# format converters, exporters and the pandapower / pypowsybl power flows. export = [ "pandapower>=3.3,<4", "numba>=0.61.2", "lightsim2grid", "pypowsybl>=1.14,<2", "pypowsybl-jupyter>=1.0", + # pandapower needs these two for Excel export / import + "xlsxwriter", + "openpyxl", ] -full = [ - "pandapower>=3.3,<4", - "numba>=0.61.2", - "lightsim2grid", - "pypowsybl>=1.14,<2", - "pypowsybl-jupyter>=1.0", -] +# Alias of ``export``, kept for compatibility. +full = ["powergrid_synth[export]"] dev = [ "pytest", "pytest-cov", - "build" + "build", ] [project.urls] -"Homepage" = "https://github.com/TU-Delft-AI-Energy-Lab/grid-synthesizer" -"Documentation" = "https://power-grid-synthesizer.readthedocs.io/en/latest/" -"Bug Tracker" = "https://github.com/TU-Delft-AI-Energy-Lab/grid-synthesizer/issues" \ No newline at end of file +Homepage = "https://github.com/mshyang/GridStudio" +Documentation = "https://power-grid-synthesizer.readthedocs.io/en/latest/" +Repository = "https://github.com/mshyang/GridStudio" +Issues = "https://github.com/mshyang/GridStudio/issues" +Changelog = "https://github.com/mshyang/GridStudio/blob/main/CHANGELOG.md" + +[tool.setuptools.dynamic] +version = { attr = "powergrid_synth.__version__" } + +[tool.setuptools.packages.find] +where = ["."] +include = ["powergrid_synth*"] +exclude = ["demos*", "tests*"] + +[tool.pytest.ini_options] +testpaths = ["tests"] diff --git a/readme.md b/readme.md deleted file mode 100644 index 9b4d479..0000000 --- a/readme.md +++ /dev/null @@ -1,326 +0,0 @@ -# PowerGridSynth - -![CI Status](https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer/actions/workflows/ci.yml/badge.svg) -![Python Version](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue) -![License](https://img.shields.io/badge/license-MIT-green) - -A Python package for generating realistic **synthetic power grids** at both the transmission and distribution level. - -- **Transmission grids** are synthesized using a [Chung-Lu-Chain (CLC)](https://arxiv.org/abs/1711.11098) graph model that reproduces prescribed degree distributions and diameters across multiple voltage levels, then layers on bus-type assignment, generation/load capacity allocation (active *and* reactive power), generation dispatch, and transmission-line impedance/capacity assignment drawn from empirical statistics of real grids (NYISO, WECC). -- **Distribution feeders** are synthesized using the algorithm of [Schweitzer et al. (2017)](https://ieeexplore.ieee.org/document/7895177), producing radial MV/LV tree graphs with realistic cable types, lengths, and load/generation profiles. - -Synthesised grids can be **exported to 12+ industry-standard formats** via [pandapower](https://www.pandapower.org/) and [pypowsybl](https://pypowsybl.readthedocs.io/) and validated with **DC and AC power-flow solvers** from both libraries. - -## Documentation - -Full documentation (theory, API reference, tutorials): [power-grid-synthesizer.readthedocs.io](https://power-grid-synthesizer.readthedocs.io/en/latest/) - -## Installation - -1. Clone the repository: -```bash -git clone https://github.com/cookbook-ms/Chung_Lu_Chain-synthesizer.git -cd Chung_Lu_Chain-synthesizer -``` -2. Create and activate a virtual environment (e.g. with `uv`): -```bash -uv venv powergrid_studio -source powergrid_studio/bin/activate -``` -3. Install in editable mode: -```bash -uv pip install -e ".[dev]" -``` - -For one-call synthesis, converters, exporters, and power-flow integrations, install the optional extras as well: - -```bash -uv pip install -e ".[dev,export]" -``` - -Core dependencies: `numpy`, `scipy`, `networkx`, `matplotlib`, `pandas`. - -Optional export/power-flow dependencies: `pandapower`, `numba`, `lightsim2grid`, `pypowsybl`, `pypowsybl-jupyter`. - ---- - -## Transmission Grid Synthesis - -### Quick Start - -The high-level `synthesize()` function runs the entire CLC transmission pipeline in one call: - -```python -from powergrid_synth import synthesize - -# Mode I — clone an existing grid's statistical profile -grid = synthesize( - mode="reference", - reference_case="case118", - seed=42, - export_formats=["json", "cgmes", "matpower"], -) - -# Mode II — fully synthetic from user-specified parameters -grid = synthesize( - mode="synthetic", - level_specs=[ - {"n": 50, "avg_k": 3.5, "diam": 10, "dist_type": "dgln"}, - {"n": 150, "avg_k": 2.5, "diam": 15, "dist_type": "dpl"}, - {"n": 300, "avg_k": 2.0, "diam": 20, "dist_type": "poisson"}, - ], - connection_specs={ - (0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}, - (1, 2): {"type": "k-stars", "c": 0.15, "gamma": 4.15}, - }, - seed=42, - export_formats=["json", "matpower"], -) -``` - -See `examples/transmission/Synthesize.ipynb` for a full walkthrough. - -### Step-by-Step Usage - -For fine-grained control over each pipeline stage: - -```python -from powergrid_synth import ( - InputConfigurator, PowerGridGenerator, BusTypeAllocator, - CapacityAllocator, LoadAllocator, GenerationDispatcher, - TransmissionLineAllocator, GridVisualizer, -) - -# 1. Configure voltage levels and inter-level connections -level_specs = [ - {'n': 50, 'avg_k': 3.5, 'diam': 10, 'dist_type': 'dgln'}, - {'n': 150, 'avg_k': 2.5, 'diam': 15, 'dist_type': 'dpl'}, - {'n': 300, 'avg_k': 2.0, 'diam': 20, 'dist_type': 'poisson'}, -] -connection_specs = { - (0, 1): {'type': 'k-stars', 'c': 0.174, 'gamma': 4.15}, - (1, 2): {'type': 'k-stars', 'c': 0.15, 'gamma': 4.15}, -} - -config = InputConfigurator(seed=42) -params = config.create_params(level_specs, connection_specs) - -# 2. Generate topology (CLC model) -gen = PowerGridGenerator(seed=42) -grid = gen.generate_grid( - degrees_by_level=params['degrees_by_level'], - diameters_by_level=params['diameters_by_level'], - transformer_degrees=params['transformer_degrees'], -) - -# 3. Assign bus types, generation/load, dispatch, and line parameters -BusTypeAllocator(grid).allocate() -CapacityAllocator(grid).allocate() -LoadAllocator(grid).allocate() -GenerationDispatcher(grid).dispatch() -TransmissionLineAllocator(grid).allocate() - -# 4. Visualize -GridVisualizer().plot_grid(grid, layout='yifan_hu', title="Synthetic Grid") -``` - -### Synthesis Pipeline - -| Step | Module | Method | -|------|--------|--------| -| **1. Topology generation** | `generator.py`, `preprocessing.py`, `edge_creation.py`, `transformer_edges.py` | CLC graph model with prescribed degree distribution and diameter per voltage level; k-stars inter-level transformer model | -| **2. Bus-type assignment** | `bus_type_allocator.py` | Entropy-based Artificial Immune System (AIS) optimisation reproducing empirical 2-D joint distribution of bus types and node degrees | -| **3. Generation capacity** | `capacity_allocator.py` | Exponential/extreme-value sampling with capacity–degree correlation via 2-D PMF table | -| **4. Load allocation** | `load_allocator.py` | Empirical 2-D probability table matching load–degree joint distribution; reactive loads via power-factor model | -| **5. Generation dispatch** | `generation_dispatcher.py` | Three-category partitioning (uncommitted / partially committed / fully committed) with 2-D bin matching and iterative balancing | -| **6. Transmission lines** | `transmission.py`, `dcpf.py` | LogNormal impedance magnitudes, Lévy-stable line angles, DCPF-based swapping, exponential gauge-ratio assignment via 2-D table, optional topology refinement | - -Statistical parameters are stored in `reference_data.py` for reference systems (NYISO-2935, WECC-16994). - -### Modules - -| Module | Description | -|--------|-------------| -| `generator.py` | Main orchestrator — `PowerGridGenerator` | -| `preprocessing.py` | Backbone setup and spatial-box assignment (Algorithm 1) | -| `edge_creation.py` | Intra-level edge creation via CLC model (Algorithm 2) | -| `transformer_edges.py` | Inter-level connections via k-stars model (Algorithm 3) | -| `input_configurator.py` | High-level specification → detailed input parameters | -| `deg_dist_optimizer.py` | Optimises distribution parameters (DGLN α,β / Power-Law γ) to match target average degree | -| `bus_type_allocator.py` | AIS-based Generator / Load / Connection bus-type assignment | -| `capacity_allocator.py` | Generation capacity (Pg_max) allocation | -| `load_allocator.py` | Active-power load (Pl) and reactive-power load (Ql) allocation | -| `generation_dispatcher.py` | Dispatch factor (α) assignment and generation–load balancing | -| `transmission.py` | Branch impedance (R, X) and thermal capacity (F_max) allocation | -| `dcpf.py` | Lightweight DC power-flow solver | -| `reference_data.py` | Pre-computed empirical statistics for NYISO, WECC reference systems | - -### Examples - -| Notebook | Topic | Colab | -|----------|-------|-------| -| `examples/transmission/Synthesize.ipynb` | **High-level synthesis** — full pipeline in one call (Mode I & II) | | -| `examples/transmission/SynthesizePypowsybl.ipynb` | **pypowsybl formats** — load IEEE-118 from built-in and CGMES | | -| `examples/transmission/TopologyGeneration.ipynb` | CLC topology generation and input configuration | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/TopologyGeneration_colab.ipynb) | -| `examples/transmission/BusTypeAssignment.ipynb` | AIS bus-type allocation | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/BusTypeAssignment_colab.ipynb) | -| `examples/transmission/GenLoadSettings.ipynb` | Generation capacity and load allocation | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/GenLoadSettings_colab.ipynb) | -| `examples/transmission/ieee_test.ipynb` | Validation against IEEE test cases | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/cookbook-ms/Chung_Lu_Chain-synthesizer/blob/main/examples/colab/ieee_test_colab.ipynb) | - ---- - -## Distribution Grid Synthesis - -### Quick Start - -The high-level `synthesize_distribution()` function generates realistic radial MV/LV feeders in one call: - -```python -from powergrid_synth import synthesize_distribution - -# Mode I — fit parameters from a reference distribution network -feeders = synthesize_distribution( - mode="reference", - reference_case="cigre_lv", - n_feeders=5, - n_nodes=20, - total_load_mw=0.5, - seed=42, - output_dir="output", - export_formats=["json"], -) - -# Mode II — use default Table III parameters (no reference needed) -feeders = synthesize_distribution( - mode="default", - n_feeders=10, - n_nodes=30, - total_load_mw=0.8, - seed=7, -) -``` - -See `examples/distribution/DistributionSynth.ipynb` and `examples/distribution/DistributionSynthFromRef.ipynb` for detailed walkthroughs. - -### Step-by-Step Usage - -```python -from powergrid_synth import DistributionGrid -from powergrid_synth.distribution import ( - SchweetzerFeederGenerator, - pandapower_to_feeders, - fit_params_from_feeders, -) - -# Option A: generate with default (Table III) parameters -gen = SchweetzerFeederGenerator(seed=42) -feeder = DistributionGrid.from_nx( - gen.generate_feeder(n_nodes=50, total_load_mw=8.0, total_gen_mw=1.0) -) -print(feeder.max_hop, feeder.total_load_mw, feeder.is_radial) - -# Option B: fit parameters from a real pandapower network -import pandapower.networks as pn -ref_feeders = pandapower_to_feeders(pn.create_cigre_network_lv()) -params = fit_params_from_feeders(ref_feeders) -gen = SchweetzerFeederGenerator(params=params, seed=0) -feeder = DistributionGrid.from_nx( - gen.generate_feeder(n_nodes=44, total_load_mw=0.7) -) -``` - -### Synthesis Pipeline - -| Step | Description | -|------|-------------| -| **1. Tree topology** | Random radial tree generation with branching and hop-count constraints | -| **2. Cable types** | Assign cable types from a realistic catalogue (weighted by frequency) | -| **3. Cable lengths** | Sample cable lengths from a Cauchy distribution fitted to reference data | -| **4. Loads** | Distribute total load across buses | -| **5. Generation** | Assign distributed generation (PV, etc.) to buses | - -### Modules - -| Module | Description | -|--------|-------------| -| `distribution_synthesis.py` | `SchweetzerFeederGenerator` — generates a single radial feeder graph | -| `distribution_params.py` | `FeederParams` dataclass with default Table III values | -| `distribution_analysis.py` | `fit_params_from_feeders` — extract statistical parameters from reference feeders | -| `distribution_converter.py` | `pandapower_to_feeders`, `pypowsybl_to_feeders` — convert real networks to feeder graphs | -| `distribution_input_model.py` | Input configuration and validation | -| `distribution_validation.py` | Structural and electrical validation of generated feeders | -| `synthesize.py` | `synthesize_distribution` — one-call high-level function | - -### Examples - -| Notebook | Topic | -|----------|-------| -| `examples/distribution/DistributionSynth.ipynb` | **Feeder synthesis** — Schweitzer algorithm with default/custom parameters | -| `examples/distribution/DistributionSynthFromRef.ipynb` | **Synthesis from reference** — fit parameters from a pandapower network | -| `examples/distribution/DistributionSynthPypowsybl.ipynb` | **pypowsybl formats** — load CIGRE LV via CGMES, full pipeline + one-liner | - ---- - -## Shared Infrastructure - -### Analysis, Export & Visualisation - -| Module | Description | -|--------|-------------| -| `grid_graph.py` | `PowerGridGraph`, `TransmissionGrid`, `DistributionGrid` — NetworkX Graph subclasses with voltage-level filtering and radial-tree helpers | -| `analysis.py` | Topological metrics (diameter, clustering, path length) | -| `hierarchical_analysis.py` | Per-voltage-level analysis | -| `comparison.py` | Side-by-side comparison of synthetic vs. reference grids | -| `visualization.py` | Plotting routines (Yifan Hu layout, per-level views, interactive dashboards) | -| `exporter.py` | Export to **JSON, Excel, SQLite, Pickle** (pandapower) and **CGMES, XIIDM, MATPOWER, PSS/E, UCTE, AMPL** (pypowsybl) | -| `data_format_converter.py` | Conversion between NetworkX ↔ pandapower ↔ pypowsybl; import from CGMES/XIIDM/MATPOWER/PSS·E via `load_grid` | - -### Export Formats - -| Via | Format | Method | -|----|--------|--------| -| **pandapower** | JSON | `GridExporter.to_json()` | -| | Excel (.xlsx) | `GridExporter.to_excel()` | -| | SQLite | `GridExporter.to_sqlite()` | -| | Pickle | `GridExporter.to_pickle()` | -| **pypowsybl** | CGMES | `GridExporter.to_cgmes()` | -| | XIIDM | `GridExporter.to_pypowsybl(format='XIIDM')` | -| | MATPOWER | `GridExporter.to_matpower()` | -| | PSS/E | `GridExporter.to_psse()` | -| | UCTE, AMPL, BIIDM, JIIDM | `GridExporter.to_pypowsybl(format=...)` | - -### Conversion Chain - -``` -Export: NetworkX ↔ pandapower → pypowsybl → [CGMES / XIIDM / MATPOWER / PSS·E / …] -Import: [CGMES / XIIDM / MATPOWER / PSS·E / …] → pypowsybl → NetworkX (via load_grid / pypowsybl_to_nx) -``` - -### Power-Flow Solvers - -| Solver | Library | Type | Call | -|--------|---------|------|------| -| Newton-Raphson AC | **pandapower** | AC | `pp.runpp(net)` | -| Linear DC | **pandapower** | DC | `pp.rundcpp(net)` | -| AC load-flow | **pypowsybl** | AC | `pypowsybl.loadflow.run_ac(net)` | -| DC load-flow | **pypowsybl** | DC | `pypowsybl.loadflow.run_dc(net)` | -| Built-in DCPF | **powergrid_synth** | DC | `DCPowerFlow(graph).run()` | - -See `examples/transmission/ieee_test.ipynb` for a full demonstration of export and power-flow validation. - -## Testing - -```bash -pytest tests/ -v -``` - -## References - -1. Aksoy et al. (2018). "A Generative Graph Model for Electrical Infrastructure Networks." *Journal of Complex Networks*, 7(1), 128–162. [arXiv:1711.11098](https://arxiv.org/abs/1711.11098) -2. Elyas & Wang (2017). "Improved Synthetic Power Grid Modeling With Correlated Bus Type Assignments." *IEEE Trans. Power Syst.*, 32(5), 3391–3402. [DOI:10.1109/TPWRS.2016.2636165](https://ieeexplore.ieee.org/document/7763878) -3. Elyas et al. (2017). "On the Statistical Settings of Generation and Load in Synthetic Grid Modeling." [arXiv:1706.09294](https://arxiv.org/abs/1706.09294) -4. Sadeghian et al. (2018). "A Novel Algorithm for Statistical Assignment of Transmission Capacities in Synthetic Grid Modeling." *IEEE PESGM*. [DOI:10.1109/PESGM.2018.8585532](https://ieeexplore.ieee.org/document/8585532) -5. Schweitzer et al. (2017). "Automated Generation Models for Synthetic Power Distribution Grids." *IEEE Trans. Power Syst.*, 32(5), 3974–3985. [DOI:10.1109/TPWRS.2017.2694839](https://ieeexplore.ieee.org/document/7895177) - -## License - -MIT diff --git a/tests/test_distribution.py b/tests/test_distribution.py index bcef3cd..1802789 100644 --- a/tests/test_distribution.py +++ b/tests/test_distribution.py @@ -11,7 +11,7 @@ DistributionInputModel, DistributionSynthParams, FeederInputSample, - SchweetzerFeederGenerator, + SchweitzerFeederGenerator, compare_feeders, compute_emergent_properties, fit_params_from_feeders, @@ -26,7 +26,7 @@ @pytest.fixture def generator(): - return SchweetzerFeederGenerator(seed=42) + return SchweitzerFeederGenerator(seed=42) @pytest.fixture @@ -68,7 +68,7 @@ def test_cable_library_entries(self): # distribution_synthesis tests # ------------------------------------------------------------------ -class TestSchweetzerFeederGenerator: +class TestSchweitzerFeederGenerator: def test_creates_correct_node_count(self, generator): G = generator.generate_feeder(n_nodes=25, total_load_mw=4.0) assert G.number_of_nodes() == 25 @@ -124,8 +124,8 @@ def test_intermediate_nodes_zero_power(self, small_feeder): assert small_feeder.nodes[n]["P_mw"] == 0.0 def test_reproducible_with_seed(self): - g1 = SchweetzerFeederGenerator(seed=99) - g2 = SchweetzerFeederGenerator(seed=99) + g1 = SchweitzerFeederGenerator(seed=99) + g2 = SchweitzerFeederGenerator(seed=99) G1 = g1.generate_feeder(20, 3.0) G2 = g2.generate_feeder(20, 3.0) assert G1.number_of_nodes() == G2.number_of_nodes() @@ -190,7 +190,7 @@ def test_emergent_properties_keys(self, small_feeder): def test_compare_feeders_returns_kl(self, generator): G1 = generator.generate_feeder(20, 3.0) - gen2 = SchweetzerFeederGenerator(seed=123) + gen2 = SchweitzerFeederGenerator(seed=123) G2 = gen2.generate_feeder(20, 3.0) result = compare_feeders(G1, G2) assert "hop_distance_kl" in result diff --git a/tests/test_grid_graph.py b/tests/test_grid_graph.py index ea27f78..351adf8 100644 --- a/tests/test_grid_graph.py +++ b/tests/test_grid_graph.py @@ -177,8 +177,8 @@ def test_from_nx_preserves_edges(self, dist_grid): assert "length_km" in d def test_from_generated_feeder(self): - from powergrid_synth.distribution import SchweetzerFeederGenerator - gen = SchweetzerFeederGenerator(seed=42) + from powergrid_synth.distribution import SchweitzerFeederGenerator + gen = SchweitzerFeederGenerator(seed=42) G = gen.generate_feeder(n_nodes=20, total_load_mw=3.0) dg = DistributionGrid.from_nx(G) assert isinstance(dg, DistributionGrid) diff --git a/tests/test_usability.py b/tests/test_usability.py new file mode 100644 index 0000000..c8878f9 --- /dev/null +++ b/tests/test_usability.py @@ -0,0 +1,300 @@ +""" +Tests for the behaviour a new user relies on: the pipeline stages chain +without glue code, mistakes produce clear errors, requested totals are met, +and progress output can be switched off. +""" +import warnings + +import networkx as nx +import numpy as np +import pytest + +import powergrid_synth as pgs +from powergrid_synth import ( + BusTypeAllocator, + CapacityAllocator, + DistributionGrid, + GenerationDispatcher, + InputConfigurator, + LoadAllocator, + PowerGridGenerator, + TransmissionLineAllocator, + synthesize, + synthesize_distribution, +) +from powergrid_synth.distribution import ( + SchweetzerFeederGenerator, + SchweitzerFeederGenerator, +) + +LEVEL_SPECS = [ + {"n": 30, "avg_k": 2.5, "diam": 6, "dist_type": "poisson"}, + {"n": 40, "avg_k": 2.0, "diam": 10, "dist_type": "poisson"}, +] +CONNECTION_SPECS = {(0, 1): {"type": "k-stars", "c": 0.174, "gamma": 4.15}} + + +@pytest.fixture(autouse=True) +def restore_verbosity(): + yield + pgs.set_verbosity("info") + + +@pytest.fixture +def topology(): + params = InputConfigurator(seed=3).create_params(LEVEL_SPECS, CONNECTION_SPECS) + return PowerGridGenerator(seed=3).generate_grid( + degrees_by_level=params["degrees_by_level"], + diameters_by_level=params["diameters_by_level"], + transformer_degrees=params["transformer_degrees"], + keep_lcc=True, + ) + + +# --------------------------------------------------------------------------- +# Step-by-step pipeline (the README example) +# --------------------------------------------------------------------------- + +class TestStagesChain: + def test_stages_store_results_on_the_graph(self, topology): + """Calling the stages in order, with no glue code, yields a full grid.""" + grid = topology + bus_types = BusTypeAllocator(grid).allocate(max_iter=10) + capacities = CapacityAllocator(grid).allocate() + loads = LoadAllocator(grid) + active = loads.allocate() + reactive = loads.allocate_reactive() + dispatch = GenerationDispatcher(grid).dispatch() + limits = TransmissionLineAllocator(grid).allocate() + + assert nx.get_node_attributes(grid, "bus_type") == bus_types + assert set(bus_types) == set(grid.nodes) + assert nx.get_node_attributes(grid, "pg_max") == capacities + assert nx.get_node_attributes(grid, "pl") == active + assert nx.get_node_attributes(grid, "ql") == reactive + assert nx.get_node_attributes(grid, "pg") == dispatch + + generators = {n for n, t in bus_types.items() if t == "Gen"} + load_buses = {n for n, t in bus_types.items() if t == "Load"} + assert generators and set(capacities) == generators + assert load_buses and set(active) == load_buses == set(reactive) + assert sum(capacities.values()) > 0 + assert sum(active.values()) > 0 + assert sum(dispatch.values()) > 0 + assert len(limits) == grid.number_of_edges() + assert all("capacity" in d for _, _, d in grid.edges(data=True)) + + def test_update_graph_false_leaves_graph_untouched(self, topology): + grid = topology + bus_types = BusTypeAllocator(grid).allocate(max_iter=5, update_graph=False) + assert bus_types + assert nx.get_node_attributes(grid, "bus_type") == {} + + def test_allocators_created_up_front_see_later_bus_types(self, topology): + """Stage objects may be created before the earlier stages have run.""" + grid = topology + capacity_stage = CapacityAllocator(grid) + load_stage = LoadAllocator(grid) + BusTypeAllocator(grid).allocate(max_iter=5) + assert capacity_stage.allocate() + assert load_stage.allocate() + + def test_rerun_does_not_leave_stale_values(self, topology): + grid = topology + BusTypeAllocator(grid).allocate(max_iter=5) + CapacityAllocator(grid).allocate() + # Turn every generator into a load and allocate again. + for n, d in grid.nodes(data=True): + if d["bus_type"] == "Gen": + d["bus_type"] = "Load" + assert CapacityAllocator(grid).allocate() == {} + assert nx.get_node_attributes(grid, "pg_max") == {} + + def test_allocate_reactive_accepts_explicit_loads(self, topology): + grid = topology + BusTypeAllocator(grid).allocate(max_iter=5) + stage = LoadAllocator(grid) + reactive = stage.allocate_reactive({0: 10.0, 1: 20.0}, update_graph=False) + assert set(reactive) == {0, 1} + assert all(q > 0 for q in reactive.values()) + + +class TestOutOfOrderErrors: + @pytest.mark.parametrize( + "run, missing_step", + [ + (lambda g: CapacityAllocator(g).allocate(), "BusTypeAllocator"), + (lambda g: LoadAllocator(g).allocate(), "BusTypeAllocator"), + (lambda g: GenerationDispatcher(g).dispatch(), "BusTypeAllocator"), + (lambda g: LoadAllocator(g).allocate_reactive(), "LoadAllocator"), + (lambda g: TransmissionLineAllocator(g).allocate(), "GenerationDispatcher"), + ], + ) + def test_stage_before_prerequisite_names_the_missing_step(self, run, missing_step): + with pytest.raises(ValueError, match=missing_step): + run(nx.path_graph(6)) + + def test_dispatch_without_capacities(self): + grid = nx.path_graph(4) + nx.set_node_attributes(grid, {0: "Gen", 1: "Load", 2: "Load", 3: "Conn"}, "bus_type") + with pytest.raises(ValueError, match="CapacityAllocator"): + GenerationDispatcher(grid).dispatch() + + +# --------------------------------------------------------------------------- +# synthesize() +# --------------------------------------------------------------------------- + +class TestSynthesize: + def test_no_export_writes_nothing(self, tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) + grid = synthesize( + mode="synthetic", + level_specs=LEVEL_SPECS, + connection_specs=CONNECTION_SPECS, + seed=1, + export_formats=None, + ) + assert grid.number_of_nodes() > 0 + assert list(tmp_path.iterdir()) == [] + + def test_unknown_export_format_fails_before_running(self): + with pytest.raises(ValueError, match="Unknown export format"): + synthesize( + mode="synthetic", + level_specs=LEVEL_SPECS, + connection_specs=CONNECTION_SPECS, + export_formats=["json", "jsn"], + ) + + def test_same_seed_same_grid(self): + def run(): + g = synthesize( + mode="synthetic", + level_specs=LEVEL_SPECS, + connection_specs=CONNECTION_SPECS, + seed=11, + export_formats=None, + verbose=False, + ) + return sorted(g.edges()), nx.get_node_attributes(g, "pl") + + assert run() == run() + + def test_reference_voltages_are_kept_on_the_graph(self): + pytest.importorskip("pandapower") + grid = synthesize( + mode="reference", + reference_case="case14", + seed=2, + export_formats=None, + verbose=False, + ) + kv = grid.graph["base_kv_map"] + assert set(kv) == {d["voltage_level"] for _, d in grid.nodes(data=True)} + + from powergrid_synth import nx_to_pandapower + net = nx_to_pandapower(grid) + assert set(np.round(net.bus.vn_kv.unique(), 6)) <= set(np.round(list(kv.values()), 6)) + + +# --------------------------------------------------------------------------- +# Progress output +# --------------------------------------------------------------------------- + +class TestVerbosity: + def _run(self, **kwargs): + return synthesize( + mode="synthetic", + level_specs=LEVEL_SPECS, + connection_specs=CONNECTION_SPECS, + seed=1, + export_formats=None, + **kwargs, + ) + + def test_default_prints_one_line_per_stage(self, capsys): + self._run() + out = capsys.readouterr().out + for tag in ("[1]", "[2]", "[3]", "[4]", "[5]", "[6]", "[7]"): + assert tag in out + # Per-iteration detail belongs to the debug level. + assert "Iter 0" not in out + + def test_verbose_false_is_silent(self, capsys): + self._run(verbose=False) + assert capsys.readouterr().out == "" + + def test_set_verbosity_silent_and_debug(self, capsys): + pgs.set_verbosity("silent") + self._run() + assert capsys.readouterr().out == "" + + pgs.set_verbosity("debug") + self._run() + assert "Starting Bus Type Allocation" in capsys.readouterr().out + + def test_verbose_false_restores_previous_level(self, capsys): + self._run(verbose=False) + capsys.readouterr() + self._run() + assert "[1]" in capsys.readouterr().out + + def test_unknown_level_is_rejected(self): + with pytest.raises(ValueError, match="Unknown verbosity"): + pgs.set_verbosity("loud") + + +# --------------------------------------------------------------------------- +# Distribution feeders +# --------------------------------------------------------------------------- + +class TestFeederTotals: + @pytest.mark.parametrize("n_nodes", [20, 60, 200]) + def test_totals_match_the_request(self, n_nodes): + feeder = SchweitzerFeederGenerator(seed=5).generate_feeder( + n_nodes=n_nodes, total_load_mw=8.0, total_gen_mw=1.0 + ) + assert isinstance(feeder, DistributionGrid) + assert feeder.total_load_mw == pytest.approx(8.0) + assert feeder.total_gen_mw == pytest.approx(1.0) + + def test_match_totals_false_keeps_the_sampled_shares(self): + kwargs = dict(n_nodes=80, total_load_mw=8.0, total_gen_mw=1.0) + scaled = SchweitzerFeederGenerator(seed=5).generate_feeder(**kwargs) + raw = SchweitzerFeederGenerator(seed=5).generate_feeder(match_totals=False, **kwargs) + + assert sorted(scaled.edges()) == sorted(raw.edges()) + loads = [n for n, d in raw.nodes(data=True) if d["P_mw"] > 0] + ratios = [scaled.nodes[n]["P_mw"] / raw.nodes[n]["P_mw"] for n in loads] + # Same shares, one common scale factor. + assert np.allclose(ratios, ratios[0]) + assert raw.total_load_mw != pytest.approx(8.0) + + def test_synthesize_distribution_returns_distribution_grids(self): + feeders = synthesize_distribution( + mode="default", n_feeders=3, n_nodes=25, total_load_mw=0.6, seed=4, verbose=False + ) + assert len(feeders) == 3 + for feeder in feeders: + assert isinstance(feeder, DistributionGrid) + assert feeder.is_radial + assert feeder.total_load_mw == pytest.approx(0.6) + + def test_unknown_distribution_export_format(self, tmp_path): + with pytest.raises(ValueError, match="Unknown export format"): + synthesize_distribution( + mode="default", output_dir=str(tmp_path), export_formats=["cgmes"], verbose=False + ) + + +class TestDeprecatedName: + def test_old_spelling_still_works_and_warns(self): + with pytest.warns(DeprecationWarning, match="SchweitzerFeederGenerator"): + generator = SchweetzerFeederGenerator(seed=1) + assert isinstance(generator, SchweitzerFeederGenerator) + + def test_new_spelling_does_not_warn(self): + with warnings.catch_warnings(): + warnings.simplefilter("error") + SchweitzerFeederGenerator(seed=1)