Metadata-Version: 2.4
Name: optiwindnet
Version: 0.3.1
Summary: Tool for designing and optimizing the electrical cable network of offshore wind farms
Author-email: DTU Wind Energy <mikf@dtu.dk>, Mauricio Souza de Alencar <ma___@dtu.dk>, Amir Arasteh <am___@dtu.dk>
License-Expression: MIT
Project-URL: Homepage, https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet
Project-URL: Documentation, https://optiwindnet.readthedocs.io/
Project-URL: Download, https://optiwindnet.readthedocs.io/stable/install.html#installation
Project-URL: Issue Tracker, https://github.com/DTUWindEnergy/OptiWindNet/issues
Project-URL: Release Notes, https://github.com/DTUWindEnergy/OptiWindNet/tags
Project-URL: Source, https://github.com/DTUWindEnergy/OptiWindNet
Keywords: optimization,wind farm,network,routing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Requires-Dist: bidict>=0.23.1
Requires-Dist: bitarray>=3.4.2
Requires-Dist: condeltri>=0.0.6
Requires-Dist: darkdetect>=0.8.0
Requires-Dist: esy.osm.pbf>=0.1.1
Requires-Dist: hybgensea>=0.1.1
Requires-Dist: makefun>=1.15.6
Requires-Dist: matplotlib>=3.10.1
Requires-Dist: networkx>=3.6
Requires-Dist: numba>=0.62.1
Requires-Dist: numpy>=2.0
Requires-Dist: ortools>=9.14.6206
Requires-Dist: peewee>=3.17.9
Requires-Dist: Pyomo>=6.9.5
Requires-Dist: PyYAML>=6.0.2
Requires-Dist: scipy>=1.15.2
Requires-Dist: shapely>=2.0.7
Requires-Dist: svg.py>=1.6.0
Requires-Dist: utm>=0.7
Requires-Dist: xxhash>=3.5.0
Provides-Extra: solvers
Requires-Dist: cbcbox; extra == "solvers"
Requires-Dist: cplex; extra == "solvers"
Requires-Dist: gurobipy; extra == "solvers"
Requires-Dist: highspy; extra == "solvers"
Requires-Dist: pyscipopt; extra == "solvers"
Provides-Extra: test
Requires-Dist: coverage; extra == "test"
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: pytest-xdist; extra == "test"
Requires-Dist: prettyTables; extra == "test"
Requires-Dist: psutil; extra == "test"
Requires-Dist: memory_profiler; extra == "test"
Requires-Dist: line_profiler; extra == "test"
Requires-Dist: prek; extra == "test"
Requires-Dist: pyrefly==1.3.1; extra == "test"
Requires-Dist: scipy-stubs==1.18.1.0; extra == "test"
Requires-Dist: types-networkx==3.6.1.20260903; extra == "test"
Requires-Dist: types-peewee==4.5.0.20260907; extra == "test"
Requires-Dist: types-pyyaml==6.0.12.20260906; extra == "test"
Requires-Dist: types-shapely==2.1.0.20260728; extra == "test"
Requires-Dist: optiwindnet[solvers]; extra == "test"
Provides-Extra: docs
Requires-Dist: sphinx; extra == "docs"
Requires-Dist: nbsphinx; extra == "docs"
Requires-Dist: myst-parser; extra == "docs"
Requires-Dist: myst-nb; extra == "docs"
Requires-Dist: furo; extra == "docs"
Requires-Dist: sphinx-versioned-docs; extra == "docs"
Requires-Dist: sphinx-autoapi; extra == "docs"
Requires-Dist: sphinx_copybutton; extra == "docs"
Requires-Dist: sphinx_sitemap; extra == "docs"
Requires-Dist: prettyTables; extra == "docs"
Requires-Dist: nbformat; extra == "docs"
Requires-Dist: nbclient; extra == "docs"
Requires-Dist: jupyter_client; extra == "docs"
Requires-Dist: traitlets; extra == "docs"
Requires-Dist: pypandoc-binary; sys_platform == "win32" and extra == "docs"
Requires-Dist: setuptools-scm; extra == "docs"
Dynamic: license-file

<!-- prettier-ignore -->
[![PyPi](https://img.shields.io/pypi/v/optiwindnet)](https://pypi.org/project/optiwindnet/)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.18388438.svg)](https://doi.org/10.5281/zenodo.18388438)
[![License](https://img.shields.io/pypi/l/optiwindnet)](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/blob/main/LICENSE.txt)
[![pipeline status](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/badges/main/pipeline.svg)](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/pipelines)
[![coverage report](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/badges/main/coverage.svg)](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/jobs)
<!---
[![DOI](https://zenodo.org/badge/164115313.svg)](https://zenodo.org/badge/latestdoi/164115313)
-->

![OptiWindNet](docs/_static/OptiWindNet.svg)

OptiWindNet
===========

Tool for designing offshore wind farm electrical cable networks. Its built-in routers use cable length as a proxy for cost; when cable prices are supplied, OptiWindNet reports the cost of the resulting network, which need not be the minimum-cost network.

| Documentation:<br>[optiwindnet.readthedocs.io][docs] |  |
| :-- | :-: |
| <ul><li>[Quickstart][quick]</li><li>[Download the Jupyter notebooks][down] used in the documentation.</li><li>[Report an issue][issue] (at GitHub mirror)</li><li>[API Reference][api]</li><li>[How to Cite][cite]</li></ul> | ![FancyWindFarm](docs/_static/OptiWindNet_windfarm.svg) |

[docs]: https://optiwindnet.readthedocs.io
[quick]: https://optiwindnet.readthedocs.io/stable/notebooks/hi00_quickstart.html
[down]: https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/tree/main/docs/notebooks
[issue]: https://github.com/DTUWindEnergy/OptiWindNet/issues
[api]: https://optiwindnet.readthedocs.io/stable/autoapi/index.html
[cite]: https://optiwindnet.readthedocs.io/stable/index.html#how-to-cite

Installation
------------

```
pip install optiwindnet
```

or

```
conda install --channel conda-forge optiwindnet
```

Detailed instructions in [Installation](https://optiwindnet.readthedocs.io/stable/install.html#installation).

Requirements
------------

_OptiWindNet_ requires Python version 3.11+ (tested with 3.11-14). The last version to support Python 3.10 was v0.0.6.

The use of a Python virtual environment is recommended. OptiWindNet's dependencies (except for MILP solvers, see docs) will be installed automatically when using `pip install optiwindnet` or `conda install optiwindnet`.

One may **optionally** pre-install the dependencies in a python environment by using either:

- [requirements.txt](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/raw/main/requirements.txt?ref_type=heads&inline=false): `pip install -r requirements.txt`
- [environment.yml](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/raw/main/environment.yml?ref_type=heads&inline=false): `conda env create -f environment.yml` (name: _optiwindnet_env_)

Papers
------

The methodology implemented in _OptiWindNet_ is described in the peer-reviewed scientific article:

- Mauricio Souza de Alencar, Tuhfe Göçmen, Nicolaos A. Cutululis, _Flexible cable routing framework for wind farm collection system optimization_, European Journal of Operational Research, 2025, ISSN 0377-2217, <https://doi.org/10.1016/j.ejor.2025.07.069>.

```{code-block} bib
@article{SOUZADEALENCAR20261037,
  title = {Flexible cable routing framework for wind farm collection system optimization},
  journal = {European Journal of Operational Research},
  volume = {329},
  number = {3},
  pages = {1037-1051},
  year = {2026},
  issn = {0377-2217},
  doi = {https://doi.org/10.1016/j.ejor.2025.07.069},
  url = {https://www.sciencedirect.com/science/article/pii/S0377221725005946},
  author = {Mauricio {Souza de Alencar} and Tuhfe Göçmen and Nicolaos A. Cutululis},
  keywords = {Combinatorial optimization, Network design, Collection system, Wind farm},
}
```

A second article introduces **OptiWindNet RouteSets**, an open database of cable-routing solutions produced with _OptiWindNet_ ([Zenodo](https://doi.org/10.5281/zenodo.20053479)). It is under review; the preprint is open-access:

- Mauricio Souza de Alencar, Tuhfe Göçmen, Nicolaos A. Cutululis, _OptiWindNet RouteSets: a solver-diverse benchmark dataset for the offshore wind-farm cable routing problem_, Wind Energy Science Discussions [preprint], 2026, <https://doi.org/10.5194/wes-2026-124>, in review.

```{code-block} bib
@Article{wes-2026-124,
  author = {Souza de Alencar, M. and G\"o\c{c}men, T. and Cutululis, N. A.},
  title = {OptiWindNet RouteSets: a solver-diverse benchmark dataset for the offshore wind-farm cable routing problem},
  journal = {Wind Energy Science Discussions},
  volume = {2026},
  year = {2026},
  pages = {1--13},
  url = {https://wes.copernicus.org/preprints/wes-2026-124/},
  doi = {10.5194/wes-2026-124},
}
```

Details on the database and its analyses are in [Dataset Paper](https://optiwindnet.readthedocs.io/stable/dataset.html).

Citing OptiWindNet
------------------

The OptiWindNet software package can be cited (unversioned) as:

> Souza de Alencar, M., Arasteh, A., & Friis-Møller, M. (2026). OptiWindNet by DTU Wind Energy. Zenodo. https://doi.org/10.5281/zenodo.18388438

To cite a specific version, get the version-specific DOI at [OptiWindNet's entry at Zenodo](https://doi.org/10.5281/zenodo.18388438). Select the desired version on the right column and use one of the ready-to-use citation formats available at the bottom right of that page.

Acknowledgements
----------------

The development of OptiWindNet was carried out as part of a Ph.D. project at the Technical University of Denmark (DTU Wind), financially supported by the Independent Research Fund Denmark / Danmarks Frie Forskningsfond (DFF) under grant no. 1127-00188B, project _Integrated Design of Offshore Wind Power Plants_.

The heuristics implemented in this repository (release 0.0.1) are presented and analyzed in the MSc thesis [Optimization heuristics for offshore wind power plant collection systems design](https://fulltext-gateway.cvt.dk/oafilestore?oid=62dddf809a5e7116caf943f3&targetid=62dddf80a41ba354e4ed35bc) (DTU Wind - Technical University of Denmark, July 4, 2022).

The meta-heuristic used is [vidalt/HGS-CVRP](https://github.com/vidalt/HGS-CVRP) — a modern implementation of the hybrid genetic search (HGS) algorithm specialized to the capacitated vehicle routing problem (CVRP), including an additional neighborhood called SWAP\* — via its Python bindings [mdealencar/HybGenSea](https://github.com/mdealencar/HybGenSea).

The cable routing relies on a navigation mesh generated by the library [artem-ogre/CDT](https://github.com/artem-ogre/CDT) (Constrained Delaunay Triangulation, C++) via its Python bindings [artem-ogre/PythonCDT](https://github.com/artem-ogre/PythonCDT).
