Changelog¶
All notable changes to VoronoiMap are documented here.
[1.56.0] - 2026-06-10¶
Fixed¶
- Packaging: build now produces the correct, release-matching version.
pyproject.tomlhad a hard-codedversion = "1.1.0"that was never bumped, so every release from v1.50 through v1.55 built and attempted to publish the package as1.1.0. The version is now derived from the git tag viasetuptools-scm(v1.56.0->1.56.0), keeping the packaged version in lock-step with releases and preventing duplicate-version uploads to PyPI.
Added¶
voronoimap --versionCLI flag, reporting the installed package version.vormap.__version__attribute, resolved at runtime from installed package metadata (importlib.metadata).
CI¶
- publish workflow:
actions/checkoutnow usesfetch-depth: 0so the full tag history is available forsetuptools-scmversion resolution. - Lint is green again. Fixed 4 long-standing
rufferrors invormap.pythat were failing the CIlintjob on every push: unsorted top-level and function-local import blocks (I001), a deadcontent_strippedlocal (F841), and an intentional mid-moduleimport renow annotated# noqa: E402.
[1.55.0] - 2026-06-04¶
Security¶
- Fix path traversal in pipeline
data_fileconfig (CWE-22) - doctor: Escape user-controlled fields in HTML report
Added¶
- vormap_failover — Agentic single-sensor outage impact & contingency advisor
- vormap_alarmdedup — Agentic alarm dedup & correlation advisor
- vormap_route — Agentic field-visit route planner advisor
- vormap_replacement — Agentic per-sensor replacement / swap-out advisor
Performance¶
- referee: Vectorize grid Voronoi & perimeter scans (5-30× faster)
- assign_cells_grid / build_distance_adjacency: Optimized with numpy/scipy
- resilience: Vectorize
_voronoi_cell_areas, dedupe post-removal metrics
Fixed¶
- montecarlo: Fix undefined
rng/rng_npNameError in CSR simulation loop - rng: Stop reseeding global random in public APIs (closes #194, #192)
- crystal: Allow absolute output paths in save_image/save_animation
- texture: Coerce float colour values to int before bytearray write
- tests: Repair broken
test_cluster.pyagainst current API
Tests¶
- referee: 28-test suite for spatial fairness
- sentinel: 13% → 99% coverage + fix Windows export crash
- privacy: 40-test suite + fix Windows UTF-8 writes
- morph: 26-test suite
- voronoi3d: 22-test suite
- balance: unit tests + KDTree-accelerated cell sampler
Refactoring¶
- Replace global
random.seed()/np.random.seed()with local RNG instances - calibration: split 230-line
_classify_sensorinto focused detectors - nn-distances: delegate to vormap_utils KDTree fast path
- Drop dead imports, unused locals, empty f-strings
[1.54.0] - 2026-05-19¶
Performance¶
- vormap_causality Voronoi grid: 5.8× faster.
_compute_voronoi_cellsrewired from O(res² × n) pure-Python to numpy/scipy: onecKDTree.query(k=1)for grid ownership,np.bincountfor counts, vectorized diff masks for adjacency. Test suite drops from ~15.2s to ~2.6s.
Added¶
- vormap_calibration — Per-sensor calibration drift advisor. Surfaces sensors needing re-calibration based on configurable thresholds.
Tests¶
- vormap_penrose: 27-test suite (P2/P3 subdivision, tile geometry, export, CLI)
- vormap_tile: 28-test suite (palette generation, geometry, rendering, CLI)
[1.53.0] - 2026-05-18¶
Added¶
- Spatial Hydrology Engine (
vormap_hydrology) — Autonomous water-flow, drainage-basin, and flood-propagation simulation - Spatial Tectonics Engine (
vormap_tectonics) — Autonomous tectonic-plate dynamics: boundaries, drift, stress - Spatial Genetics Engine (
vormap_genetics) — Autonomous population genetics: allele drift, gene flow, selection - vormap_curator — Agentic spatial dataset curator (30-test suite)
- vormap_sensorplanner — Budget-aware agentic sensor-placement advisor
- vormap_redundancy — Agentic sensor retirement/merge advisor
- vormap_drift — Agentic temporal-drift advisor for evolving point patterns
- vormap_handoff — Agentic shift-handoff briefing generator
- Executive brief generator — Autonomous one-shot executive summary
Performance¶
- kmeans hot loop: Rewritten in squared-distance space; eliminates
math.sqrtper (point, centroid) per iteration
Fixed¶
- Multi-neighbour migration overwrites; demo HTML degenerate points
- Order-independent ecosystem migration via delta accumulation
- 4
NameErrorbugs in CLI modules
Docs¶
- Module catalog: 131 → 142 modules; new Agentic Advisors section
- New Simulation Engines documentation page (15 modules)
CI¶
- Docker workflow: weekly rebuild, SBOM attestation via
attest-build-provenance, Trivy SARIF reporting
[1.52.0] - 2026-05-03¶
Added¶
- Spatial Weather Engine — Autonomous atmospheric simulation (pressure, temperature, humidity, wind, fronts, precipitation, seasonal cycles, climate zones)
- Spatial Governance Engine — Autonomous democratic decision-making (proposals, deliberation, weighted voting, quorum, amendments, constitutional constraints)
- Advanced Modules documentation guide
Tests¶
- 50 tests for vormap_compete territorial competition simulator
- Full test suites for weather engine (585 lines) and governance engine (600 lines)
CI¶
- Docker workflow: added weekly rebuild schedule, SBOM attestation, Trivy SARIF reporting
[1.51.0] - 2026-05-02¶
Added¶
- Spatial Nervous System Engine — Autonomous neural signal propagation through Voronoi networks
- Spatial Metabolism Engine (
vormap_metabolism) — Autonomous resource flow, consumption, transport, and equilibrium - Spatial Attention Engine — Autonomous analytical focus allocation by region significance
- Comprehensive tutorials guide (8 hands-on tutorials)
Fixed¶
- Causality: Wrong-point deletion in
_apply_interventionremove when targets are close or duplicated (fixes #186) - Contagion: No-op R₀ denominator in
_estimate_r0producing invalid reproduction numbers
Tests¶
- 102 tests for 5 previously untested modules (cvd, seeds, utils, variogram, text)
- 43 tests for EcosystemSimulator
Docs¶
- 7 missing modules added to catalog (131 → 138)
Maintenance¶
- Removed 58 unused stdlib imports across 45 modules
[1.50.0] - 2026-04-30¶
Added¶
VoronoiEstimatorclass — Per-instance state for safe concurrency (fixes #172)- Per-instance bounds, file cache, KDTree index
- Eliminates global mutable
IND_S/N/W/Estate - Thread-safe, prevents cross-dataset contamination
- Instance methods:
set_bounds,load_data,clear_cache,get_NN,isect_B,ind_area,get_sum - Backward compatible: module-level functions still work via shared global
_defaultinstance
[1.0.0] - 2026-02-14¶
Fixed¶
- Statistical bias in
get_sum()- Zero-area degenerate regions no longer corrupt the estimation average. The old code decrementedNbut left zero entries in the summation array at wrong indices, causing systematic downward bias. Now uses a clean valid-estimates-only list. (Fixes #14)
Changed¶
- O(1) KDTree lookup in
get_NN()- Replaced O(n) identity scan over_data_cachewith_kdtree_by_iddictionary keyed byid(data). This runs on every NN query, so the speedup is meaningful for large datasets with many queries. - Cleaned up
new_dir()- Removed dead variable assignments (c1x,c1y,c2x,c2y) that were set to magic numbers but never read.
Added¶
- Comprehensive MkDocs documentation site with:
- Installation guide with dependency groups
- Quick start tutorial
- Full CLI reference
- Python API documentation for all public functions
- Algorithm overview with mathematical notation
- Implementation details and architecture docs
- Regression tests for the
get_sum()bias fix - Test for
_kdtree_by_idcache population
[0.9.0] - 2026-02-13¶
Added¶
- CI/CD workflow with lint, test, and coverage stages
- GitHub Pages deployment for interactive demo
- Copilot agent setup (
.github/copilot-setup-steps.yml) - CodeQL security scanning
- Dependabot configuration
- Docker workflow
- Branch protection rules
- Professional README with badges, API docs, and project structure
Fixed¶
- Path traversal vulnerability in
load_data()(prevents../../etc/passwd) - NaN/Inf coordinate rejection
- Near-parallel line intersection producing wildly large coordinates
- Binary search convergence guard (100 iteration limit)
- Voronoi vertex count limit (
MAX_VERTICES = 50)
Changed¶
- KDTree-accelerated nearest neighbor (O(log n) with SciPy)
- Auto-detect search bounds from data extents
- Cross-product collinearity test (replaces fragile slope comparison)
- Iterative retry loop in
get_sum()(replaces recursive calls)