{"id":359734,"name":"ToOp","description":"Propose new topology strategies to the operators with the goal to lower redispatch costs and carbon emissions.","url":"https://github.com/eliagroup/toop","last_synced_at":"2026-07-06T02:00:36.084Z","repository":{"id":339614942,"uuid":"1079723665","full_name":"eliagroup/ToOp","owner":"eliagroup","description":"Open Source Topology Optimization engine by Elia Group. Includes GPU‑based DC load flow solving, DC optimization, AC validation, and tools to explore congestion‑reducing topological actions.","archived":false,"fork":false,"pushed_at":"2026-06-29T17:20:04.000Z","size":22939,"stargazers_count":66,"open_issues_count":17,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-29T17:32:19.124Z","etag":null,"topics":["electric-grids","energy","topology-optimization"],"latest_commit_sha":null,"homepage":"https://eliagroup.github.io/ToOp","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eliagroup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-20T09:34:05.000Z","updated_at":"2026-06-29T15:53:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"289c866f-c054-4f50-a3de-138e9cfa4cc6","html_url":"https://github.com/eliagroup/ToOp","commit_stats":null,"previous_names":["eliagroup/toop"],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/eliagroup/ToOp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eliagroup","download_url":"https://codeload.github.com/eliagroup/ToOp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/sbom","scorecard":{"id":1245440,"data":{"date":"2026-04-01T10:54:45Z","repo":{"name":"github.com/eliagroup/ToOp","commit":"aa023ec65cd77fa914a4efde803399c3a00b8af7"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":8.5,"checks":[{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:221","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:30","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:54","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:138","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:172","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:77","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/ci.yaml:78","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:111","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:153","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yaml:188","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/docs.yaml:36","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/export-reqs.yaml:21","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yaml:31","Info: found token with 'none' permissions: .github/workflows/validate_pr_title.yaml:27","Info: found token with 'none' permissions: .github/workflows/ci.yaml:1","Info: found token with 'none' permissions: .github/workflows/docs.yaml:1","Info: found token with 'none' permissions: .github/workflows/export-reqs.yaml:1","Info: found token with 'none' permissions: .github/workflows/release.yaml:1","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yaml:25","Info: found token with 'none' permissions: .github/workflows/validate_pr_title.yaml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  16 out of  16 GitHub-owned GitHubAction dependencies pinned","Info:   6 out of   6 third-party GitHubAction dependencies pinned","Info:   2 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":3,"reason":"SAST tool is not run on all commits -- score normalized to 3","details":["Warn: 11 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Mozilla Public License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"Branch-Protection","score":8,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Warn: codeowners review is not required on branch 'main'","Info: 'last push approval' is required to merge on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: 50hertz transmission gmbh"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}}]},"last_synced_at":"2026-04-01T11:37:57.656Z","repository_id":339614942,"created_at":"2026-04-01T11:37:57.656Z","updated_at":"2026-04-01T11:37:57.656Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35175119,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"eliagroup","name":"Elia Group - Open Source","uuid":"90860157","kind":"organization","description":"For a successful energy transition in a sustainable world","email":"opensource@eliagroup.eu","website":"www.eliagroup.eu","location":"Belgium","twitter":"eliacorporate","company":null,"icon_url":"https://avatars.githubusercontent.com/u/90860157?v=4","repositories_count":2,"last_synced_at":"2023-11-17T09:53:06.534Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/eliagroup","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-11-17T09:53:06.547Z","updated_at":"2023-11-17T09:53:06.547Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eliagroup","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eliagroup/repositories"},"packages":[],"commits":{"id":11827122,"full_name":"eliagroup/ToOp","default_branch":"master","total_commits":239,"total_committers":9,"total_bot_commits":74,"total_bot_committers":1,"mean_commits":26.555555555555557,"dds":0.6903765690376569,"past_year_total_commits":239,"past_year_total_committers":9,"past_year_total_bot_commits":74,"past_year_total_bot_committers":1,"past_year_mean_commits":26.555555555555557,"past_year_dds":0.6903765690376569,"last_synced_at":"2026-07-05T02:02:54.517Z","last_synced_commit":"0ebc7db68a299fdcc48e11eeade2a023e33805ef","created_at":"2026-06-27T11:48:41.401Z","updated_at":"2026-07-05T02:01:53.862Z","committers":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":74},{"name":"Miha Sajko","email":"40734954+mihasajko","login":"mihasajko","count":40},{"name":"LeonHilf","email":"149764770+LeonHilf","login":"LeonHilf","count":38},{"name":"nicow-elia","email":"129943275+nicow-elia","login":"nicow-elia","count":28},{"name":"Sascha Petznick","email":"229719644+spetznick-elia","login":"spetznick-elia","count":24},{"name":"siarhei","email":"PO4728@corp.transmission-it.de","login":"siarhei2000582","count":19},{"name":"Bpetrick","email":"170433522+BenjPetr","login":"BenjPetr","count":10},{"name":"Copilot","email":"198982749+Copilot","login":"Copilot","count":4},{"name":"Christian M.","email":"95425912+chris-elia","login":"chris-elia","count":2}],"past_year_committers":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":74},{"name":"Miha Sajko","email":"40734954+mihasajko","login":"mihasajko","count":40},{"name":"LeonHilf","email":"149764770+LeonHilf","login":"LeonHilf","count":38},{"name":"nicow-elia","email":"129943275+nicow-elia","login":"nicow-elia","count":28},{"name":"Sascha Petznick","email":"229719644+spetznick-elia","login":"spetznick-elia","count":24},{"name":"siarhei","email":"PO4728@corp.transmission-it.de","login":"siarhei2000582","count":19},{"name":"Bpetrick","email":"170433522+BenjPetr","login":"BenjPetr","count":10},{"name":"Copilot","email":"198982749+Copilot","login":"Copilot","count":4},{"name":"Christian M.","email":"95425912+chris-elia","login":"chris-elia","count":2}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-06T00:00:12.758Z","repositories_count":6284670,"commits_count":874366591,"contributors_count":35261159,"owners_count":1179624,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"eliagroup/ToOp","html_url":"https://github.com/eliagroup/ToOp","last_synced_at":"2026-07-05T02:00:22.339Z","status":"active","issues_count":0,"pull_requests_count":102,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":598583.1975308642,"issues_closed_count":0,"pull_requests_closed_count":81,"pull_request_authors_count":9,"issue_authors_count":0,"avg_comments_per_issue":null,"avg_comments_per_pull_request":1.4607843137254901,"merged_pull_requests_count":30,"bot_issues_count":0,"bot_pull_requests_count":60,"past_year_issues_count":0,"past_year_pull_requests_count":102,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":598583.1975308642,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":81,"past_year_pull_request_authors_count":9,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":1.4607843137254901,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":60,"past_year_merged_pull_requests_count":30,"created_at":"2026-02-20T11:00:10.519Z","updated_at":"2026-07-05T02:00:22.339Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliagroup%2FToOp/issues","issue_labels_count":{},"pull_request_labels_count":{"dependencies":61,"python:uv":51,"github_actions":3,"docker":2,"pre_commit":2,"docker_compose":2,"enhancement":1},"issue_author_associations_count":{},"pull_request_author_associations_count":{"CONTRIBUTOR":63,"COLLABORATOR":38,"NONE":1},"issue_authors":{},"pull_request_authors":{"dependabot[bot]":60,"LeonHilf":10,"spetznick-elia":9,"nicow-elia":8,"BenjPetr":7,"Copilot":3,"siarhei2000582":3,"spetznick":1,"mihasajko":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-06T00:00:20.249Z","repositories_count":14866418,"issues_count":32636489,"pull_requests_count":107172406,"authors_count":11334949,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{"dependencies":61,"python:uv":51,"github_actions":3,"docker":2,"docker_compose":2,"pre_commit":2,"enhancement":1},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":63,"COLLABORATOR":38,"NONE":1},"past_year_issue_authors":{},"past_year_pull_request_authors":{"dependabot[bot]":60,"LeonHilf":10,"spetznick-elia":9,"nicow-elia":8,"BenjPetr":7,"Copilot":3,"siarhei2000582":3,"mihasajko":1,"spetznick":1},"maintainers":[{"login":"LeonHilf","count":10,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/LeonHilf"},{"login":"spetznick-elia","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/spetznick-elia"},{"login":"nicow-elia","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/nicow-elia"},{"login":"BenjPetr","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/BenjPetr"},{"login":"siarhei2000582","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/siarhei2000582"},{"login":"mihasajko","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mihasajko"}],"active_maintainers":[{"login":"LeonHilf","count":10,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/LeonHilf"},{"login":"spetznick-elia","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/spetznick-elia"},{"login":"nicow-elia","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/nicow-elia"},{"login":"BenjPetr","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/BenjPetr"},{"login":"siarhei2000582","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/siarhei2000582"},{"login":"mihasajko","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mihasajko"}]},"events":{"total":{"DeleteEvent":138,"PullRequestEvent":160,"IssuesEvent":17,"WatchEvent":6,"IssueCommentEvent":38,"PushEvent":654,"PullRequestReviewCommentEvent":64,"PullRequestReviewEvent":49,"CreateEvent":164},"last_year":{"DeleteEvent":138,"PullRequestEvent":160,"IssuesEvent":17,"WatchEvent":6,"IssueCommentEvent":38,"PushEvent":654,"PullRequestReviewCommentEvent":64,"PullRequestReviewEvent":49,"CreateEvent":164}},"keywords":["electric-grids","energy","topology-optimization"],"dependencies":[],"score":6.616065185132818,"created_at":"2026-06-27T11:48:43.115Z","updated_at":"2026-07-06T02:00:36.103Z","avatar_url":"https://github.com/eliagroup.png","language":"Python","category":"Energy Systems","sub_category":"Grid Analysis and Planning","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"\u003c!-- markdown-link-check-disable --\u003e\r\n\r\n[![CI](https://github.com/eliagroup/ToOp/actions/workflows/ci.yaml/badge.svg)](https://github.com/eliagroup/ToOp/actions/workflows/ci.yaml)\r\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/eliagroup/ToOp/badge)](https://scorecard.dev/viewer/?uri=github.com/eliagroup/ToOp)\r\n\r\n\r\n[![Quality Gate Status](https://sonarqube.consumercentricity.io/api/project_badges/measure?project=gras-gridanalysis-toop-engine\u0026metric=alert_status\u0026token=sqb_ef169a74b3d4e0c7da3da0aa2ca3e4db85aafe3c)](https://sonarqube.consumercentricity.io/dashboard?id=gras-gridanalysis-toop-engine)\r\n[![Coverage](https://sonarqube.consumercentricity.io/api/project_badges/measure?project=gras-gridanalysis-toop-engine\u0026metric=coverage\u0026token=sqb_ef169a74b3d4e0c7da3da0aa2ca3e4db85aafe3c)](https://sonarqube.consumercentricity.io/dashboard?id=gras-gridanalysis-toop-engine)\r\n[![Duplicated Lines (%)](https://sonarqube.consumercentricity.io/api/project_badges/measure?project=gras-gridanalysis-toop-engine\u0026metric=duplicated_lines_density\u0026token=sqb_ef169a74b3d4e0c7da3da0aa2ca3e4db85aafe3c)](https://sonarqube.consumercentricity.io/dashboard?id=gras-gridanalysis-toop-engine)\r\n\r\n\r\n[![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg)](https://opensource.org/licenses/MPL-2.0)\r\n[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)\r\n\u003c!-- markdown-link-check-enable --\u003e\r\n\r\n## Hello there 👋\r\n\r\nWelcome to our ToOp (engine) repository at Elia Group.\r\n\r\n\u003cimg src=\"./docs/illustrations/ToOp_RGB.png\" alt=\"ToOp Features and Roadmap\" width=\"80%\"\u003e\r\n\r\n\r\n\r\n\r\n## A short intro - what is ToOp about?\r\nToOp is short for Topology Optimization and describes the approach to reduce grid congestion by topological actions. Topological actions are non-costly actions that can be applied to the grid to \"steer\" the electricity flow.\r\nOur goal is to propose (potentially) new topology strategies to the operators with the goal to lower redispatch costs and carbon emissions.\r\n\r\nThis repository builds the engine behind the topology optimization product ToOp at Elia Group. ToOp provides tools to perform topology optimization on operational grid data through an importer, a DC optimization stage, and AC validation. It also includes the GPU-based DC load flow solver. At the current stage it considers transmission line switching, busbar splitting, busbar reassignments, and grouped PST tap optimization.\r\n\r\n\u003cimg src=\"./docs/illustrations/TopoActions.jpg\" alt=\"ToOp Features and Roadmap\" width=\"80%\"\u003e\r\n\r\n## About this repository\r\nThis repo builds the engine behind the topology optimization project ToOp at Elia Group. The standard workflow first normalizes a raw grid into a processed grid folder containing the backend grid snapshot, masks, loadflow parameters, topology metadata, and an initial contingency definition. The DC preprocessing stage then adds `static_information.hdf5`, `action_set.json`, `action_set_diffs.hdf5`, and the final `nminus1_definition.json` used by the solver, optimizer, and postprocessing. Note that this does NOT provide a GUI or system integration code, you are expected to interact with the module through either python or kafka commands. You can check the [paper](https://arxiv.org/abs/2605.10128) for a high level academic introduction.\r\nPlease check out our [full documentation](https://eliagroup.github.io/ToOp).\r\n\r\n\r\n## Getting Started\r\n\r\nIf you want to get started with the engine, we highly recommend checking out our [example notebooks](./notebooks).\r\n\r\n### Prerequisites\r\n\r\nWe use `uv` for dependency management.\r\nYou can follow their [installation guide](https://docs.astral.sh/uv/getting-started/installation/):\r\n\r\n1. Install on Linux/Mac via `curl -LsSf https://astral.sh/uv/install.sh | sh`\r\n2. or if you have `pipx` via `pipx install uv`.\r\n\r\nIf you want to contribute to this repository, follow the guide on our [Contributing page](./CONTRIBUTING.md#local-development-setup).\r\n\r\n### Installation (without contributing)\r\n\r\nYou need to install our software via source by cloning this repository\r\n```bash\r\n  git clone https://github.com/eliagroup/ToOp.git\r\n  cd ToOp\r\n```\r\nand installing dependencies\r\n```bash\r\n  uv sync --all-groups\r\n```\r\n\r\nIf you plan to run this software on GPU-accelerated hardware, you may additionally install `jax` with CUDA support by running\r\n```bash\r\n  uv pip install jax[cuda12]\r\n```\r\n\r\n**Note:** We currently do not publish our package on PyPI. If you use `uv` for your own project and want to use `ToOp`, you can add it as a local dependency to your `pyproject.toml`, pointing to the cloned repository.\r\n\r\n### Usage\r\n\r\nIn order to understand the functionalities of this repo, please have a look at our examples in `notebooks/`.\r\nThere you can find several Jupyter notebooks that explain how to use the engine.\r\nFor example, you can import a grid file, build the preprocessing artifacts, and compute the DC loadflow using our GPU-based loadflow solver.\r\nOr you can load an example grid and minimise the branch overload by running the topology optimizer.\r\n\r\nYou can also build the documentation and open it on your web browser by running\r\n```bash\r\nuv run mkdocs serve\r\n```\r\n\r\n---\r\n\r\n\r\n### Useful resources\r\nThe following resources may be helpful to grasp the key concepts:\r\n\r\n- [Quickstart](./docs/quickstart.md): Grasp the basics and follow along examples. The first one takes you through a DC loadflow computation using the [DC Solver package](./docs/dc_solver/intro.md).\r\n- [Usage](./docs/usage.md): Learn about the two different ways to use this software, either via python or kafka.\r\n- [Topology Optimizer](./docs/topology_optimizer/intro.md): Understand the key concepts behind the topology optimizer.\r\n- [Presentation@LF Energy 2025](https://www.youtube.com/watch?v=XteDpNsX75A)\r\n- [Presentation@LF Energy 2024](https://lfenergy.org/lf-energy-summit-recap-and-video-a-gpu-native-approach-on-tackling-grid-topology-optimization/)\r\n\r\n**Note**: This project does not provide a GUI or system integration code.\r\nYou are expected to interact with the module through either python or kafka commands. This might come in the future if there is an interest from the community.\r\n\r\n## High-level architecture\r\n![ToOp Features and Roadmap](docs/illustrations/ToOp_HL_Architecture.svg)\r\n\r\nThe topology optimizer takes as an input operational grid files (e.g. UCT, CGMES) which are imported by open-source libraries (PowSyBl, pandapower) and normalized into a processed grid folder. The importer stage writes the backend grid snapshot together with masks, loadflow parameters, and topology metadata; the DC preprocessing stage adds `static_information.hdf5`, `action_set.json`, and the final contingency definition. The pre-processed files are then optimized in a GPU-native set-up (optimizer + GPU-based load flow solver). The optimal results are stored as a pareto-front, so a set of all solutions that are \"Pareto optimal\". This means that no other solution exists that improves at least one objective without worsening another one. These results are then validated and filtered using an AC power flow. In the end the results are displayed in a frontend where an end user can review and evaluate the proposed actions. The proposed topological actions can then be exported to other systems.\r\n\r\n\r\n#### Description the GPU-based DC load Flow solver\r\nThe GPU-based DC Load Flow solver serves the purpose of computing a large number of similar DC load flows in an\r\naccelerated fashion. Currently the solver supports the following batch dimensions, i.e. the workload must not change\r\nin anything other than these dimensions:\r\n• Branch topology (assignment of branches to busbar A or B)\r\n• Injection topology (assignment of injections to busbar A or B)\r\n• Branch outages\r\n\r\nUnder the hood, it is using PTDF/(G)LODF/BSDF approaches to achieve this.\r\n\r\n\r\n## Roadmap\r\n\r\nNext to some smaller improvements, current work focuses on broadening controllable asset support, improving preprocessing fidelity, and hardening the end-to-end optimization workflow. We will work on sharing a more high-level roadmap in the future.\r\n\r\n\r\n## Let us work together\r\n\r\nWe strongly believe that through joint development,  collaboration and integration into other tools, we can jointly build an open-source topology optimizer that is fast, provides accurate recommendations and can be used by different TSOs to reduce grid congestion. Topology optimization works best when holistically applied to the grid and the different operational constraints from different TSOs are considered. This is why we invite you to share your feedback, constraints and your approaches so that we can jointly improve ToOp.\r\n\r\nIn addition, we also see the opportunity that ToOp can be combined with other open-source tools. If you have ideas, reach out to us.\r\nWe invite you to test it, ask questions and provide feedback to us. And if you like it, we invite you to contribute to the development. We are looking forward to hearing from you.\r\n\r\n## Finding help\r\n\r\nIf you require help with using this package, your first point of contact is \u003ca href=\"mailto:ToOp@eliagroup.eu\"\u003eToOp@eliagroup.eu\u003c/a\u003e.\r\n\r\n\r\n## Contributing\r\n\r\nPlease have a look at our [CONTRIBUTING.md](CONTRIBUTING.md).\r\n\r\n---\r\n\r\n## License\r\n\r\nDistributed under MPL 2.0. See [LICENSE](./LICENSE).\r\n\r\n## Citation\r\n\r\n\u003c!-- markdown-link-check-disable --\u003e\r\nIf you use our work in scientific research, please cite [our paper on load flow solving](https://doi.org/10.1109/PowerTech59965.2025.11180422) or [our paper on the optimizer architecture](https://arxiv.org/abs/2605.10128), depending what parts of the repository you use.\r\n\u003c!-- markdown-link-check-enable --\u003e\r\n\r\n---\r\n\r\n## Contact\r\n\r\n\r\nTeam – [ToOp](mailto:ToOp@eliagroup.eu)\r\n\r\n---\r\n\r\n## Acknowledgments\r\n\r\nWe credit the authors of JAX.\r\n```\r\n@software{jax2018github,\r\n  author = {James Bradbury and Roy Frostig and Peter Hawkins and Matthew James Johnson and Chris Leary and Dougal Maclaurin and George Necula and Adam Paszke and Jake Vander{P}las and Skye Wanderman-{M}ilne and Qiao Zhang},\r\n  title = {{JAX}: composable transformations of {P}ython+{N}um{P}y programs},\r\n  url = {http://github.com/jax-ml/jax},\r\n  version = {0.3.13},\r\n  year = {2018},\r\n}\r\n```\r\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.1109/PowerTech59965.2025.11180422"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/359734","html_url":"https://ost.ecosyste.ms/projects/359734"}