Tags give the ability to mark specific points in history as being important
-
v0.3.0
protected30d385f4 · ·[Commit history since v0.2.3](https://gitlab.windenergy.dtu.dk/TOPFARM/OptiWindNet/-/compare/v0.2.3...v0.3.0) This release adds library-wide support for **ringed** cable networks (those with cable cycles or "loops") – check the documentation for details. - New `topology=` alternative: `'ringed'` or `Topology.RINGED`. - Solution graphs now carry a mandatory `topology` attribute. The new `Topology`, `ModelOptions`, and self-describing `TerseLinks` types make solver configuration, warm starts, and solution exchange topology-aware. - MILP users can now retrieve an incumbent topology skipping `PathFinder` calls with `.get_incumbent_topology()`. - Multi-root clustering was rewritten to keep turbines closer to their substations without adding feeders. HGS and LKH-3 now handle empty clusters. - Validation now reports topology, load, capacity, and crossing violations without modifying the graph. `validate_routeset()` moved from `optiwindnet.crossings` to `optiwindnet.interarraylib` and now returns `list[str]`; `clusterize()` now returns only the cluster list. - Planar-embedding generation is about 1.5 times faster, and Poisson-disc site generation avoids more unnecessary border and obstacle checks. - Solver recovery and retry handling was improved for SCIP and FiberSCIP, including concurrent SCIP use on Windows. Documentation now includes dedicated guides for topology choices, ringed networks, and multi-substation clustering. - The legacy EW implementations (`ClassicEW`, `CPEW`, `NBEW`, `OBEW`, `EW_presolver`) and `optiwindnet.interface` were removed; use `heuristics.constructor()` or the `WindFarmNetwork` router API. - `hgs_multiroot()` and `iterative_hgs_cvrp()` were removed in favor of `hgs_cvrp()`; `lkh()` and `iterative_lkh()` were removed in favor of `lkh3()`. - The new implementations are more capable than the ones they replace, please report if you find a regression. - Major overhaul of the test scripts.
-
-
v0.2.3
protected40cfb382 · ·OptiWindNet v0.2.3 Drop-in replacement for v0.2.2. The APIs deprecated in v0.2.2 remain available (removal planned for v0.3). Balanced subtrees: balanced=True is now enforced as an exact bound on both the MILP models and HGS, so subtree loads differ by at most one unit. Exact feeder count: pin the number of feeders with feeder_limit="exactly" (MILP) or feeder_exact=True (HGS), instead of only bounding it from above. Reversible lat/lon: L_from_yaml() and L_from_pbf() project into the dominant UTM zone and store it, so coordinates can be mapped back to lat/lon. Concurrent HiGHS: the pyomo HiGHS solver now runs a concurrent tree search (requires highspy >= 1.15). EWRouter exposes the constructor's method and bias_margin parameters. New locations: Revolution, Sunrise, Hornsea 2, Norfolk Vanguard West, East Anglia 3, Hollandse Kust Noord. Fixes: multi-root warmstart eligibility, PathFinder dead-end chains, scaffolded() primed-edge conversion, and sexagesimal coordinate parsing.
-
v0.2.2
protected75aedcac · ·OptiWindNet v0.2.2 This release focuses on visualization, heuristic consolidation, LKH parity, and routing robustness. High-level plotting now defaults to the interactive vector SVG backend for cleaner notebook output, while Matplotlib remains available through explicit `ax` handling. SVG plotting also gains feature parity with `gplot()` for labels, boundary and obstacle tags, and legends. Routing improvements include the new unified `heuristics.constructor()` path, expanded `EWRouter` capabilities including radial and rootlust methods, and a feature-complete `lkh3()` entry point with multi-root support, clustering, warm starts, retries, crossing repair, and richer metadata. PathFinder detours are substantially more robust around boundaries and exclusion zones. The release also adds Shapely-based geometric crossing diagnostics, more informative `repr()` output for high-level API objects, shorter substation labels in packaged datasets, Python 3.11-3.14 support metadata, stricter deprecation testing, and several performance and maintenance improvements. Breaking change: root-assignment and link-blockage helper functions moved from `optiwindnet.geometric` to `optiwindnet.interarraylib`. Import `add_terminal_closest_root()`, `add_link_blockmap()`, and `add_link_cosines()` from `optiwindnet.interarraylib`.
-
v0.2.1
protected3462f93b · ·Breaking - db v4 schema: 'num_gates' renamed to 'feeders_per_root'; dropped 'valid', 'is_normalized', 'stuntC'. migrate.py accepts v2 and v3. Highlights - OR-Tools MILP backend switched to MathOpt API (unified wrapper). - Pyomo CPLEX/Gurobi switched to persistent interfaces. - PathFinder: 'A' now mandatory; improved heuristics and defaults. - LKH: capacity-violation-triggered iterations; new 'warmstart' arg. - Better pre-optimization estimate of obstructed feeder lengths. - Context-managed database connection API with 'timeout' argument. - CI matrix on Python 3.11-3.14 (default 3.14). Fixes - Numerous PathFinder and make_planar_embedding robustness fixes. - validate_routeset detour-range and touchpoint corrections. - SQLite WAL mode removed (issues on shared clusters). - Stunt vertices no longer placed in G. - migrate.py ImportError fixed.
-
v0.2.0
protectedf18ed06b · ·- **HGS-CVRP interface unified**: `baselines.hgs` functions `hgs_multiroot()` and `iterative_hgs_cvrp()` are deprecated; `hgs_cvrp()` replaces them with no loss in functionality. Users of HGSRouter from the Network/Router API will not notice the change. - **Database format updated to v3**: Switched from Pony ORM (incompatible with Python 3.13+) to Peewee. Use `python -m optiwindnet.db.migrate input.v2.sqlite output.v3.sqlite` to migrate existing databases. - Obstacles are now supported in `turbinate()` and `poisson_disc_filler()`. - `as_normalized()` now works also with `L`. - Replaced `multiprocessing.Pool` with `concurrent.futures.ThreadPoolExecutor` in HGS-CVRP calls, enabling concurrent solver instances without the quirks of the multiprocessing module. This requires a new version (v0.1.1+) of dependency hybgensea. - Removed dependency `py`. - Fixed potential infinite loop in `PathFinder` for inconsistent graphs.
-
v0.1.6
protected3ee6c9da · ·Drop-in replacement for v0.1.5. This release provides maily two important fixes: - fix bugs caused by ortools v9.15.6755 released on 2026-01-12 - remove a duplicate turbine from the included location Gangkou 2 In addition, the graph attribute 'creator' of solutions produced by OWN was reverted back to using the naming convention adopted in earlier OWN versions, which includes the 'pyomo' string if the solver was called through it (e.g. 'MILP.pyomo.cplex' instead of 'MILP.cplex').
-
v0.1.5
protectede131eca4 · ·Drop-in replacement for v0.1.4. - Added new offshore wind locations: Dogger Bank B/C, Coastal Virginia, Inch Cape, Changhua 1, Gangkou 1/2, Yunlin, Noirmoutier, Tréport, Borkum Riffgrund 3, He Dreiht. - Experimental **FiberSCIP (fscip)** solver support (system call, file-based interface). - Improved automatic `landscape_angle` calculation - Added `as_obstacle_free()` method to remove location obstacles; improved `as_single_root()`. - `.osm.pbf` parsing now prioritizes tag `ref` over `name` for node labels. - Fixed dangling reference in diagonals (`make_planar_embedding()`) which could cause errors when checking for crossings. - Applied rounding in `_link_val()`/`_flow_val()` for MILP Solvers CPLEX and SCIP to eliminate tiny non-zero values (error manifested as cyclic solutions). - Corrected setting of `B` in `L_from_windIO()`. - Resolved `_hull_processor()` edge case (wrong P for Yunlin). - Ensured roots are added to solution topology `S` even if disconnected. - Enforced integer values for SCIP model variables. - Updated deprecated Shapely `buffer()` argument name. - Adjusted graph attributes in MILP solvers. - Multiple robustness improvements in tests and solver handling.
-
v0.1.4
protected43cc7619 · ·Drop-in replacement for v0.1.3. - gplot() and svgplot() now draw links with different line thickness to represent cable type (after assign_cables() is called) - improve number formatting inside infobox of gplot() and svgplot() - switch SCIP modelling from Pyomo to PySCIPOpt, enabling the launching of concurrent solvers for the same problem (competitive mode) - refactor MILP code for reducing code duplication and improving consistency between model descriptions for the different APIs - add information on how to install missing solvers when a requested solver is not available - bump dependency NetworkX version to 3.6 (resolves pickling issues with nx.PlanarEmbedding) - update the documentation to reflect the changes involving solver SCIP and plotting functions - fix the assignment of graph attributes 'creator' (all solvers) and 'runtime' (scip)
-
v0.0.6
protected40175660 · ·- Almost a drop-in replacement for v0.0.5 - single existing API change: argument name of HGS meta-heuristics: from max_reruns to max_retries - Introduction of Network/Router high-level API for easier on-boarding of new users - Two new components -- WindFarmNetwork and Router -- expose most of OWN's features - Major expansion and improvement of the documentation - Improved the Advanced API docs - Fully documented the Network/Router API - Added Topfarm integration example - Added the OptiWindNet logo - Added automated code testing based on pytest and tests for the main components - MILP model warm-starting is now checked for feasibility before invoking the solver (Pyomo-only) - Silenced warnings of Pyomo-based solvers when the search times out before the gap is reached - Other small fixes and improvements
-
v0.0.5
protected0d246567 · ·- drop-in replacement for v0.0.4 - gplot()' options improvements: - 'node_tag=True' plots node numbers - 'node_tag="load"' now also plots the roots' loads - 'tag_border=True' plots numbers of border/obstacle vertices - gplot() and svgplot() now can plot sites without borders - bug fixes and improvements in path-finding - bug fixes and improvements in navigation mesh generation - mesh generation now can handle terminals placed on border lines - some paperdb incomplete or incorrect entries were fixed - other small fixes and improvements
-
v0.0.4
protected83f1b0a4 · ·- fixed exception AttributeError on MacOS ('Process' object has no attribute 'cpu_affinity') - added 3 more locations (Hollandse Kust Zuid, Vineyard 1, Sofia) - enabled easy wind farm creation and import using JOSM (external program with GUI) - many improvements in docstrings and documentation in general -