diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b89b03f..b30d43e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.8.0] - 2026-07-28 ### ⚠️ Breaking Changes @@ -13,6 +13,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add vertex construction macro [#469](https://github.com/acgetchell/delaunay/pull/469) - Add embedded triangulation validation layer [#449](https://github.com/acgetchell/delaunay/pull/449) [#481](https://github.com/acgetchell/delaunay/pull/481) - Add Pachner feasibility checks [#489](https://github.com/acgetchell/delaunay/pull/489) +- Add notebook-backed artifact workflows [#508](https://github.com/acgetchell/delaunay/pull/508) +- Add spherical backend and paper workflow [#509](https://github.com/acgetchell/delaunay/pull/509) +- Validate periodic quotient orientation [#521](https://github.com/acgetchell/delaunay/pull/521) [#527](https://github.com/acgetchell/delaunay/pull/527) +- Add certified realization intersection fast paths [#531](https://github.com/acgetchell/delaunay/pull/531) - Box nested FlipError payloads [#406](https://github.com/acgetchell/delaunay/pull/406) [#435](https://github.com/acgetchell/delaunay/pull/435) - Adopt la-stack 0.4.3 API [#424](https://github.com/acgetchell/delaunay/pull/424) [#438](https://github.com/acgetchell/delaunay/pull/438) - Require refined generator and ordering parameters [#439](https://github.com/acgetchell/delaunay/pull/439) @@ -25,11 +29,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Borrow topology views from canonical storage [#472](https://github.com/acgetchell/delaunay/pull/472) [#474](https://github.com/acgetchell/delaunay/pull/474) - Make topology views and boundaries owner-aware [#476](https://github.com/acgetchell/delaunay/pull/476) - Split Pachner moves from vertex lifecycle edits [#477](https://github.com/acgetchell/delaunay/pull/477) +- Make fluent Delaunay builders canonical [#499](https://github.com/acgetchell/delaunay/pull/499) +- Replace raw TDS access with owner topology queries [#502](https://github.com/acgetchell/delaunay/pull/502) +- Tighten invariant-bearing triangulation APIs [#511](https://github.com/acgetchell/delaunay/pull/511) +- Simplify public APIs and repository workflows [#529](https://github.com/acgetchell/delaunay/pull/529) - Reject stale adjacency indexes [#451](https://github.com/acgetchell/delaunay/pull/451) [#463](https://github.com/acgetchell/delaunay/pull/463) +- Report explicit topology preflight failures precisely [#512](https://github.com/acgetchell/delaunay/pull/512) - Update tooling to Rust 1.96.0 [#430](https://github.com/acgetchell/delaunay/pull/430) [#431](https://github.com/acgetchell/delaunay/pull/431) +- Require Rust 1.97 for v0.8.0 [#523](https://github.com/acgetchell/delaunay/pull/523) ### Merged Pull Requests +- Harden changelog publication and repository tooling [#540](https://github.com/acgetchell/delaunay/pull/540) +- Bump github/codeql-action/upload-sarif [#539](https://github.com/acgetchell/delaunay/pull/539) +- Bump zizmorcore/zizmor-action from 0.5.7 to 0.6.0 [#538](https://github.com/acgetchell/delaunay/pull/538) +- Bump github/codeql-action/init from 4.37.0 to 4.37.1 [#537](https://github.com/acgetchell/delaunay/pull/537) +- Bump actions/setup-python from 6.3.0 to 7.0.0 [#536](https://github.com/acgetchell/delaunay/pull/536) +- Bump github/codeql-action/analyze from 4.37.0 to 4.37.1 [#535](https://github.com/acgetchell/delaunay/pull/535) +- Bump the dependencies group across 1 directory with 4 updates [#534](https://github.com/acgetchell/delaunay/pull/534) +- Bump actions/checkout from 7.0.0 to 7.0.1 [#533](https://github.com/acgetchell/delaunay/pull/533) +- Add certified realization intersection fast paths [#531](https://github.com/acgetchell/delaunay/pull/531) +- Harden benchmark parsing and correct audit guidance [#530](https://github.com/acgetchell/delaunay/pull/530) +- Simplify public APIs and repository workflows [#529](https://github.com/acgetchell/delaunay/pull/529) +- Align the five-level validation contract [#528](https://github.com/acgetchell/delaunay/pull/528) +- Validate periodic quotient orientation [#521](https://github.com/acgetchell/delaunay/pull/521) [#527](https://github.com/acgetchell/delaunay/pull/527) +- Add intrinsic orientability witnesses [#526](https://github.com/acgetchell/delaunay/pull/526) +- Add simplicial-complex artifact workflows [#525](https://github.com/acgetchell/delaunay/pull/525) +- Adopt la-stack 0.4.4 exact APIs [#524](https://github.com/acgetchell/delaunay/pull/524) +- Require Rust 1.97 for v0.8.0 [#523](https://github.com/acgetchell/delaunay/pull/523) +- Refactor/445 realization validation [#515](https://github.com/acgetchell/delaunay/pull/515) +- Perf/436 release benchmark workflow [#514](https://github.com/acgetchell/delaunay/pull/514) +- Report explicit topology preflight failures precisely [#512](https://github.com/acgetchell/delaunay/pull/512) +- Tighten invariant-bearing triangulation APIs [#511](https://github.com/acgetchell/delaunay/pull/511) +- Add spherical backend and paper workflow [#509](https://github.com/acgetchell/delaunay/pull/509) +- Add notebook-backed artifact workflows [#508](https://github.com/acgetchell/delaunay/pull/508) +- Replace raw TDS access with owner topology queries [#502](https://github.com/acgetchell/delaunay/pull/502) +- Add topology-aware simplex barycenters [#501](https://github.com/acgetchell/delaunay/pull/501) +- Make fluent Delaunay builders canonical [#499](https://github.com/acgetchell/delaunay/pull/499) - Add Pachner feasibility checks [#489](https://github.com/acgetchell/delaunay/pull/489) - Make targeted PL repair failure-atomic [#488](https://github.com/acgetchell/delaunay/pull/488) - Preserve positive orientation after vertex removal [#487](https://github.com/acgetchell/delaunay/pull/487) @@ -77,10 +113,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add ToroidalDomain and ToroidalDomainError so toroidal periods are finite, strictly positive, and validated before storage. - - Add fallible raw-period constructors for GlobalTopology, ToroidalSpace, and ToroidalModel while keeping builder toroidal helpers ergonomic. - - Align shared development tooling pins with causal-triangulations and harden benchmark baseline metadata parsing. - [**breaking**] Add vertex construction macro [#469](https://github.com/acgetchell/delaunay/pull/469) @@ -101,13 +135,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add 2D `try_incident_facets_to_edge_2d` and `try_interior_facet_for_edge_2d` APIs on triangulation query surfaces. - - Re-export `FacetHandle` from query-focused surfaces for callers that consume simplex-local facet handles outside Pachner-only imports. - - Optimize `EdgeKey::try_new` to prove live edges from endpoint incidence while preserving typed incidence metadata errors. - - Add edge-key construction benchmarks and document the simplex-local incidence query vocabulary. - Add validated mesh export schema [#479](https://github.com/acgetchell/delaunay/pull/479) @@ -128,14 +159,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a public geometry::embedding module (backed by internal core::embedding) with the embedding checks and their typed errors. - - Add Triangulation::is_valid_embedding, validate_embedding, and embedding_report for the new Level 4 layer. - - Move Delaunay property validation to delaunay::property_validation (renamed from core::util::delaunay_validation) and expose the Level 5 check as DelaunayTriangulation::is_valid_delaunay. - - Refresh the validation guide, invariants, API-design, and prelude docs for the five-level stack. - [**breaking**] Add Pachner feasibility checks [#489](https://github.com/acgetchell/delaunay/pull/489) @@ -144,6 +172,101 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add immutable flip and Pachner feasibility reports for dry-run workflows. - Route Pachner feasibility through the shared bistellar preflight used by mutating flips. - Export Pachner feasibility from the focused Pachner prelude. +- Add topology-aware simplex barycenters [#501](https://github.com/acgetchell/delaunay/pull/501) + [`a096ece`](https://github.com/acgetchell/delaunay/commit/a096ececd9bd6bc2fa9046a260ed833fab5e6e7a) + + - Add `DelaunayTriangulation::simplex_barycenter` for Euclidean and periodic triangulations. + - Surface typed barycenter failures through `SimplexBarycenterError` and `DelaunayError`. + - Export the barycenter error through root, query, and prelude facades. + - Add benchmark coverage for the public barycenter query. + - Refresh dependency locks and align the pinned Markdown linter on `rumdl` 0.2.28. + +#### Maintenance: Run Codecov through one llvm-cov nextest pass + +- Generate Cobertura coverage and Codecov JUnit results from the same + instrumented nextest run. +- Keep property tests in the coverage job with a dedicated coverage profile and + bounded timeout for LLVM instrumentation overhead. +- Remove the stale multiple-crate-versions lint expectation and make the + barycenter allocation benchmark tolerate exact-float roundoff. + +#### Documentation: Document topology-aware barycenter workflows + +- Document `simplex_barycenter` as the topology-aware local-editing point for + k=1 Pachner insert proposals. +- Update query-prelude, benchmark, and coverage docs to match the current + barycenter and Codecov/nextest surfaces. +- Cover barycenter overflow, periodic lift, canonicalization, and + point-validation error paths while inheriting CI JUnit settings for coverage. +- [**breaking**] Add notebook-backed artifact workflows [#508](https://github.com/acgetchell/delaunay/pull/508) + [`69f08d5`](https://github.com/acgetchell/delaunay/commit/69f08d5ca59a1611a3674660c604ea9905b93ddb) + + - Add the opt-in `delaunay` binary for triangulation, convex-hull, + validation-demo, and Pachner stress JSON/CSV artifact generation. + - Add Jupyter quickstart, validation visualization, and Pachner stress notebooks that render README imagery and Parquet-backed telemetry under + `target/notebooks`. + - Package the active docs, notebooks, and README hero asset for Cargo consumers, and align validation docs on valid affine realization terminology. + - Add notebook Semgrep guardrails and CLI integration coverage for subcommands, artifact outputs, invalid arguments, and unsupported topology flags. + - Implement spherical unit-sphere canonicalization for finite nonzero coordinates. +- [**breaking**] Add spherical backend and paper workflow [#509](https://github.com/acgetchell/delaunay/pull/509) + [`3033088`](https://github.com/acgetchell/delaunay/commit/3033088480b3fcfc634265f29d13c8aa2b3bd461) + + - Add SphericalPoint and SphericalMetric as the spherical coordinate/metric backend for intrinsic S^D points embedded in R^(D+1). + - Add the bounded S^2/S^3 SphericalDelaunayBuilder, SphericalDelaunayTriangulation, SphericalSimplex, geodesic distances, and typed spherical + construction/validation errors. + - Implement spherical validation through Intrinsic PL Topology, Embedding Validity, and empty-cap/ambient-hull Geometric Predicates while keeping D as the + manifold dimension. + - Expose spherical construction, validation, and topology backend types through the root and focused preludes. + - Rename the validation hierarchy across crate docs, README, AGENTS guidance, architecture docs, semgrep fixtures, and developer docs. + - Document spherical support as a Level 4/5 backend extension, with full 2D-5D integration and mutable-triangulation support still called out as future work. + - Add the validation paper sources, BibTeX, generated PNG figures, tracked reviewer PDF, and papers README. + - Rename the validation notebook to notebooks/01_validation.ipynb and make it generate reproducible validation hierarchy and failure figures. + - Add just papers and `paper-*` recipes plus a dedicated papers.yml CI workflow using Tectonic, tex-fmt, chktex, uv, and notebook-generated figures. + - Add uv-managed paper support CLIs for PDF sanity checks, deterministic PDF metadata normalization, and TeX source-date extraction. + - Include paper artifacts in the packaged crate and ignore LaTeX build intermediates. + - Update local/CI cargo-nextest pins and setup/tooling guidance for the new paper toolchain. +- Adopt la-stack 0.4.4 exact APIs [#524](https://github.com/acgetchell/delaunay/pull/524) + [`e817406`](https://github.com/acgetchell/delaunay/commit/e817406567d1fe299103babe2aeb8a5e36f31aa3) + + - Use paired certified determinant filters and finite-by-construction matrices. + - Preserve exact versus numerical singularity handling in circumcenter solves. + - Add exact-fallback predicate and circumcenter benchmarks with a robustness example. +- Add simplicial-complex artifact workflows [#525](https://github.com/acgetchell/delaunay/pull/525) + [`de8b861`](https://github.com/acgetchell/delaunay/commit/de8b861e74bbf748785de205d1a788f089d448fc) + + - Expose generic visualization JSON and deterministic S² hero exports through the CLI. + - Add notebook-generated validation and spherical README imagery, with canonical assets shared by documentation and the paper. + - Make notebook execution explicit, enforce stable descriptive cell IDs, and guard artifact conventions with Semgrep. +- Add intrinsic orientability witnesses [#526](https://github.com/acgetchell/delaunay/pull/526) + [`cf93dec`](https://github.com/acgetchell/delaunay/commit/cf93dec02826562d989f22222edf03c1bf12ad54) + + - Expose orientation certificates for pure 2D and 3D simplicial complexes. + - Report typed non-orientability failures during Level 3 PL-manifold validation. + - Document intrinsic orientation and refresh the generated validation diagrams. +- [**breaking**] Validate periodic quotient orientation [#521](https://github.com/acgetchell/delaunay/pull/521) + [#527](https://github.com/acgetchell/delaunay/pull/527) [`b4a2ef3`](https://github.com/acgetchell/delaunay/commit/b4a2ef3cefb31ca0c0b2534c2b593c533c4d1745) + + - Enforce lifted facet parity across periodic neighbors and self-identifications. + - Include quotient constraints in Level 2 coherence and Level 3 orientability. + - Propagate contradictory quotient orientation as typed construction failures. + - Document translation-normalized parity and the distinction from Level 4 realization. + +#### Added: Support compact 3D periodic quotients + +- construct connected, closed 2D and compact 3D quotients with opposite facet orientations and complete canonical vertex coverage +- preserve distinct lifted vertex identities through simplex storage, incidence maps, snapshots, and realization validation +- recover deterministically from periodic covering-space degeneracies without changing ordinary Euclidean insertion behavior +- document the validated Euclidean, toroidal, and spherical construction scopes +- update the reviewed dprint and rumdl tool pins +- [**breaking**] Add certified realization intersection fast paths [#531](https://github.com/acgetchell/delaunay/pull/531) + [`36e68ab`](https://github.com/acgetchell/delaunay/commit/36e68ab471371e6801aead28c74be9b3a054ab5b) + + - Add orientation, shared-face, and exact linear-program certificates before the conservative active-set fallback. + - Dispatch finite floating-point systems through la-stack's exact Bareiss solver while preserving rational fallbacks and typed witnesses. + - Bound the 4D and 5D release regressions and document the broader evidence deferred to #482 and #483. + - Align release documentation and tooling with Rust 1.97.1. + - Refresh pinned development tools and override Semgrep's vulnerable MCP dependency with the patched release. + - Harden Tectonic dependency discovery across supported development environments. ### Changed @@ -151,9 +274,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [`2f310d9`](https://github.com/acgetchell/delaunay/commit/2f310d91e0b600fefdc488f2117dc6413b907b25) - Box nested typed `FlipError` payloads and the inserted-simplex witness while keeping scalar and key diagnostics inline. - - Preserve typed inspection through `Error::source` , `reason.as_ref()` , and `source.as_ref()` for flip context, predicate, adjacency, simplex, + - Preserve typed inspection through `Error::source`, `reason.as_ref()`, and `source.as_ref()` for flip context, predicate, adjacency, simplex, neighbor-wiring, and mutation failures. - - Add repository Semgrep checks for the boxed-source policy and document the tooling rationale. - Preserve padded changelog category headings during post-processing. - [**breaking**] Adopt la-stack 0.4.3 API [#424](https://github.com/acgetchell/delaunay/pull/424) [#438](https://github.com/acgetchell/delaunay/pull/438) @@ -161,19 +283,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Route stack-matrix dispatch, checked access, determinant filters, and singular tolerances through the local geometry matrix shim. - - Preserve typed la-stack solve and factorization errors in geometry error paths instead of stringifying backend diagnostics. - - Use rounded exact solve fallback for circumcenters and reject non-finite predicate matrices at construction boundaries. - - Make `.toroidal()` the periodic image-point constructor and move wrapping-only construction to `.canonicalized_toroidal()`. - - Align pinned just, rumdl, taplo, dprint, and typos setup through cargo installs instead of Homebrew. - - Disable la-stack default features explicitly while selecting exact arithmetic. - [**breaking**] Require refined generator and ordering parameters [#439](https://github.com/acgetchell/delaunay/pull/439) [`ca95380`](https://github.com/acgetchell/delaunay/commit/ca95380b4f6ae1a736f34e3badbc899475feac84) @@ -186,13 +303,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add CoordinateRange and route generator and Hilbert range inputs through typed boundary parsing before internal use. - - Replace stringly numeric diagnostics with typed coordinate, count, range, and error-reason payloads across geometry and generator APIs. - - Restrict the public coordinate scalar contract to f64 while documenting future exact-coordinate support as an explicit API addition. - - Move geometry and generator error types into their owning modules and update prelude exports, docs, examples, and semgrep guardrails accordingly. - [**breaking**] Require validated generator and Hilbert inputs [#452](https://github.com/acgetchell/delaunay/pull/452) @@ -208,7 +322,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Store coordinates through validated finite-coordinate types and remove the public coordinate-scalar parameter from core geometry, TDS, hull, and triangulation APIs. - - Replace macro and infallible raw constructors with explicit fallible smart constructors for points, vertices, simplices, edges, facets, and flip handles. - Serialize topology relationships through stable vertex and simplex UUIDs instead of process-local slotmap keys. - Add semgrep guardrails and update docs, examples, benches, and tests for the validated-coordinate API. @@ -217,7 +330,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Make all-facet and boundary-facet traversal yield `Result<FacetView, FacetError>` so corrupted facet views and invalid boundary incidence are surfaced instead of skipped. - - Route boundary-facet consumers, hull extraction, Euler counting, examples, benches, and prelude coverage through explicit item-error handling. - Use `SimplexKeyBuffer` for local repair and topology frontiers, and add a Semgrep guard for future raw `Vec<SimplexKey>` regressions. - Add a compact 2D-5D timing summary to `just perf-large-scale-smoke`. @@ -226,7 +338,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Route TDS serialization through a validated UUID snapshot boundary that carries vertex, simplex, neighbor, and periodic-offset relationships without storage-local slotmap handles. - - Rebuild runtime TDS storage only from validated snapshots, with fresh slotmap keys and full topology validation before exposing hydrated state. - Keep standalone simplex records from becoming an alternate hydration path, so simplex connectivity is resolved only in the TDS snapshot context. - Update repository guards and documentation to describe snapshot-based persistence as the serialization boundary. @@ -267,10 +378,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a unified PachnerMove request/result API with attempt_pachner dispatch and a focused prelude::pachner import surface. - Move vertex deletion into its own Delaunay module with typed DeleteVertexError and keep insertion/deletion terminology explicit through public docs and examples. - - Keep primitive bistellar flip APIs available from delaunay::flips while hiding them from focused preludes intended for workflow users. - Add Pachner stress coverage, delete_vertex benchmarks, and Semgrep rules that require fallible results to be consumed and workflow fixtures to use vertex!. - Split long agent/development guidance into focused dev and architecture docs, including release citation and performance-tuning checklists. +- [**breaking**] Make fluent Delaunay builders canonical [#499](https://github.com/acgetchell/delaunay/pull/499) + [`9cecd49`](https://github.com/acgetchell/delaunay/commit/9cecd49dea00faa0e830ea033774f085e36b0bd4) + + - Make DelaunayTriangulationBuilder the canonical construction API, with + default simplex storage, typed simplex-data selection, kernel terminals, and + statistics terminals in one staged workflow. + - Remove the legacy `DelaunayTriangulation::try_new*` and `try_with_*` batch + constructor family, and update examples, benches, docs, preludes, and + semgrep rules to use builder chains. + - Add post-construction simplex-data filling from closures or secondary maps + with typed SimplexDataFillError handling. + - Rework RandomTriangulationBuilder around validated point counts, coordinate + ranges, vertex/simplex data type selection, and fluent build terminals. + - Refresh public Pachner, Delaunay repair, and locate workflows around the + current proposal and builder APIs. +- [**breaking**] Replace raw TDS access with owner topology queries [#502](https://github.com/acgetchell/delaunay/pull/502) + [`bc53e32`](https://github.com/acgetchell/delaunay/commit/bc53e32eae7a2f5e234cb851cbb17b1833888839) + + - Expose owner-bound topology, identity, ridge, facet, locate, and validation queries on Triangulation and DelaunayTriangulation so callers no longer need raw + TDS access. + - Route Pachner moves through the owner transaction API with rollback, orientation repair, and post-move validation while keeping primitive flips as internal + building blocks. + - Publish Level 3 topology helpers for PL-manifold checks, including ridge-link and vertex-link validation, and align docs, examples, doctests, and preludes + around the new API surface. + - Add MCMC-backed Pachner stress and repair transaction-pressure benchmarks with diagnostics for failed long-run move chains. + - Extend Semgrep rules to prevent regressions into public TDS/storage access and validation naming drift. +- [**breaking**] Tighten invariant-bearing triangulation APIs [#511](https://github.com/acgetchell/delaunay/pull/511) + [`6d5020d`](https://github.com/acgetchell/delaunay/commit/6d5020d53e0279c8f8962a01bf021447ad868e1d) + + - Encapsulate flip-kind dimensions and periodic span witnesses behind accessors while adding fluent repair and delaunayize config setters. + - Relax unnecessary serialization, surface-measure, and coordinate-representation bounds so callers can use narrower payload and kernel types. + - Precheck explicit simplex imports for duplicate cells and over-shared facets before using the prechecked TDS assembly path. + - Add explicit-import benchmark coverage, consolidate repeated dimension tests, and quiet ad hoc test logging. + - Align uv-backed workflows on uv 0.11.27 and run the papers workflow on macOS with Homebrew system dependencies. +- Perf/436 release benchmark workflow [#514](https://github.com/acgetchell/delaunay/pull/514) + [`ff74d7c`](https://github.com/acgetchell/delaunay/commit/ff74d7c98b5c2a3ab51a6f667b7547e3903a254a) +- Refactor/445 realization validation [#515](https://github.com/acgetchell/delaunay/pull/515) + [`e6e22f6`](https://github.com/acgetchell/delaunay/commit/e6e22f63045514ea2c806819a4fdcd11932f6353) +- [**breaking**] Simplify public APIs and repository workflows [#529](https://github.com/acgetchell/delaunay/pull/529) + [`9bfeb2a`](https://github.com/acgetchell/delaunay/commit/9bfeb2a5b528d7800c87c92321154ac2145ec279) + + - Remove redundant public helpers and generation-tracked facet caching while retaining immutable convex-hull memoization. + - Replace the ambiguous canonicalized-toroidal mode with true periodic construction and consistent T^n/S^n notation. + - Complete workflow discoverability through focused Rust examples, visualization notebooks, rustdoc idioms, and the v0.8.0 reviewer artifact guide. + - Make Just recipes orthogonal, composable, sorted, and protected by CI-aligned tool-version guards. ### Dependencies @@ -282,12 +437,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Reorganize the README around a concise quickstart, documentation map, ecosystem notes, benchmarking guidance, and current limitations. - - Preserve the citation abstract and detailed feature checklist while updating quickstart guidance for the current published crate version. - - Regenerate the active and archived changelog files with current release-note formatting. +- Refresh validation failure artifacts [`282a72d`](https://github.com/acgetchell/delaunay/commit/282a72d3e56e76b345733a063072affa580faacc) + + - Regenerate the validation-failure figure after explicit duplicate-simplex diagnostics switched to input-index wording. + - Rebuild the tracked reviewer PDF so it embeds the refreshed figure. +- Align the five-level validation contract [#528](https://github.com/acgetchell/delaunay/pull/528) + [`93fcdce`](https://github.com/acgetchell/delaunay/commit/93fcdce2c42f58c03f24ac07c81bf2622be8aee6) + + - Distinguish stored orientation, intrinsic orientability, and geometric + orientation across the public documentation. + - Synchronize validation APIs, layered errors, and backend-specific + realization guarantees. + - Refresh the mechanical paper table and author TODO scaffolding without replacing manuscript prose. +- Condition benchmark bullet on staged summary [`d0e3af1`](https://github.com/acgetchell/delaunay/commit/d0e3af12750b508fe788144195ee5af4c8c87cab) + + - Add the benchmark commit bullet only when PERFORMANCE_RESULTS.md is staged. + - Omit both the summary file and its bullet when no benchmark summary changed. ### Fixed @@ -336,7 +505,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Restore seeded construction finalization from the final Delaunay policy so returned triangulations keep the intended repair and global-fallback behavior. - - Keep the workflow vertex-macro guardrail Rust-AST aware so it only flags real Vertex constructor calls. @@ -357,9 +525,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extend PL-manifold repair from facet over-sharing to bounded boundary-ridge, ridge-link, and vertex-link repair stages with typed diagnostics. - Run delaunayize through the Delaunay rollback transaction so failed topology repair, failed Delaunay repair, fallback snapshot failures, and rebuild failures restore the pre-call triangulation. - - Expose PlManifoldRepairStage through the crate root and delaunayize prelude, and add benchmark fixtures for targeted topology repair. - Align local and CI tooling on Python 3.14, uv 0.11.26, and the reviewed Rust/Python tool pins. +- [**breaking**] Report explicit topology preflight failures precisely [#512](https://github.com/acgetchell/delaunay/pull/512) + [`bbae9ed`](https://github.com/acgetchell/delaunay/commit/bbae9ed5898f6e2633f9cb75a08aacfa5e75c25f) + + - Add typed explicit-simplex duplicate and facet-sharing errors that preserve input simplex and vertex indices. + - Preflight explicit topology from validated simplex specs before constructing TDS simplices. + - Rename the Delaunay repair flip-budget fluent setters to make their repair scope explicit. + - Repair the papers workflow TeX dependency setup for macOS runners. +- Harden benchmark parsing and correct audit guidance [#530](https://github.com/acgetchell/delaunay/pull/530) + [`91efa35`](https://github.com/acgetchell/delaunay/commit/91efa35ef26fa9ad7360651c686578b0591ff3c1) + + - Reject non-finite, non-positive, and misordered benchmark intervals. + - Align numerical and validation documentation with implemented behavior. + - Record completed remediation work and correct the Level 4 issue owner. + - Update the pinned uv version to 0.11.29. +- Harden changelog publication and repository tooling [#540](https://github.com/acgetchell/delaunay/pull/540) + [`1f15b93`](https://github.com/acgetchell/delaunay/commit/1f15b9352456aca9eade44d116cd8d15d3d1ac20) + + - Reject malformed, duplicated, misordered, or invalidly dated release headings before modifying changelog files. + - Publish root and archived changelogs transactionally with rollback-safe writes and concise CLI errors. + - Lock uv-backed workflows and include the complete console-script module closure in Python packages. + - Consolidate durable tooling guidance, correct documented predicate and validation limits, and archive historical performance observations. + - Refresh validation-paper metadata and clarify reviewer-artifact comparisons. +- Prevent wildcard changelog prose from parsing as emphasis [`291439d`](https://github.com/acgetchell/delaunay/commit/291439d2786eb6a88fb272bff1e69106adedefcf) + + - Code-span wildcard Rust API paths and filename globs throughout generated prose. + - Preserve Markdown emphasis and existing code spans during normalization. + - Regenerate the v0.8.0 changelog and completed-series archives. ### Maintenance @@ -373,17 +567,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/1.0.0...1.0.1) - ---- - - updated-dependencies: - -- dependency-name: starlette - dependency-version: 1.0.1 - dependency-type: indirect - dependency-group: uv - ... - - Bump taiki-e/install-action from 2.79.1 to 2.81.1 [#427](https://github.com/acgetchell/delaunay/pull/427) [`3798932`](https://github.com/acgetchell/delaunay/commit/37989328340d1fcc6c8fc0a8be5adf03b31f7fcd) @@ -392,22 +575,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/taiki-e/install-action/releases) - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/b550161ef8a7bc4f2a671c0b03a18ac9ccedea1e...e49978b799e49ff429d162b7a30601a569ab6538) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.81.1 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump the dependencies group across 1 directory with 4 updates [#426](https://github.com/acgetchell/delaunay/pull/426) [`daabc99`](https://github.com/acgetchell/delaunay/commit/daabc99f012f4c35789f71777d77e3e2b08593aa) - Bumps the dependencies group with 4 updates in the / directory: [uuid](https://github.com/uuid-rs/uuid) , [pastey](https://github.com/as1100k/pastey) , - [serde_json](https://github.com/serde-rs/json) and [sysinfo](https://github.com/GuillaumeGomez/sysinfo) . + Bumps the dependencies group with 4 updates in the / directory: [uuid](https://github.com/uuid-rs/uuid), [pastey](https://github.com/as1100k/pastey), + [serde_json](https://github.com/serde-rs/json) and [sysinfo](https://github.com/GuillaumeGomez/sysinfo). Updates `uuid` from 1.23.1 to 1.23.2 @@ -415,50 +587,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Commits](https://github.com/uuid-rs/uuid/compare/v1.23.1...v1.23.2) Updates `pastey` from 0.2.2 to 0.2.3 - - [Release notes](https://github.com/as1100k/pastey/releases) - [Changelog](https://github.com/AS1100K/pastey/blob/master/CHANGELOG.md) - [Commits](https://github.com/as1100k/pastey/compare/v0.2.2...v0.2.3) Updates `serde_json` from 1.0.149 to 1.0.150 - - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.149...v1.0.150) Updates `sysinfo` from 0.39.2 to 0.39.3 - - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.39.2...v0.39.3) - ---- - - updated-dependencies: - -- dependency-name: uuid - dependency-version: 1.23.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: pastey - dependency-version: 0.2.3 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: serde_json - dependency-version: 1.0.150 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: sysinfo - dependency-version: 0.39.3 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - [**breaking**] Update tooling to Rust 1.96.0 [#430](https://github.com/acgetchell/delaunay/pull/430) [#431](https://github.com/acgetchell/delaunay/pull/431) [`1ec1d5a`](https://github.com/acgetchell/delaunay/commit/1ec1d5ac6ab02ecefee37495bf9b82fbc434f645) @@ -466,9 +605,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Align pinned developer tools and install Cargo tools through cache-cargo-install-action where appropriate. - Add the Zizmor workflow and tighten workflow/Semgrep policy for checkout credentials, GitHub script interpolation, doctest error handling, and subprocess wrappers. - - Replace doctest and test assert-matches patterns with std::assert_matches! / assert_matches! diagnostics. - - Harden support tooling for Python 3.13 [#433](https://github.com/acgetchell/delaunay/pull/433) [`289b9b7`](https://github.com/acgetchell/delaunay/commit/289b9b76cadda9201748357c536031131a8ddb26) @@ -476,7 +613,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parse SARIF, Criterion estimates, benchmark metrics, and baseline fetch options into validated boundary models before use. - Align changelog archive and postprocessing helpers with sibling repository behavior for archive links and release-heading detection. - Add repository-owned Semgrep guardrails for strict CI JSON handling and positive benchmark metric counts. - - Bump codecov/codecov-action from 6.0.1 to 7.0.0 [#457](https://github.com/acgetchell/delaunay/pull/457) [`7b017a0`](https://github.com/acgetchell/delaunay/commit/7b017a041090918efbc2bda0ee786070353a4605) @@ -485,17 +621,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/e79a6962e0d4c0c17b229090214935d2e33f8354...fb8b3582c8e4def4969c97caa2f19720cb33a72f) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 7.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump actions/checkout from 6.0.2 to 6.0.3 [#456](https://github.com/acgetchell/delaunay/pull/456) [`b41393e`](https://github.com/acgetchell/delaunay/commit/b41393e0f6598e3598e1d533a7ca59f5bb195b46) @@ -504,22 +629,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: 6.0.3 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - Harden GHAS security workflows [`add3dea`](https://github.com/acgetchell/delaunay/commit/add3deab592415e28f95faeb197bac099facf792) - Restrict manual performance-baseline materialization to main and semver tags instead of checking out arbitrary validated branches. - - Pin CodeQL actions to the documented v4.36.2 commit so hash comments verify cleanly. - - Rename benchmark Cargo-mode metadata to avoid CodeQL treating benchmark profile strings as clear-text secret storage. - Avoid CodeQL benchmark metadata false positive [`9b16822`](https://github.com/acgetchell/delaunay/commit/9b1682299f0254c42f7c305dd4fc889d1ade862e) @@ -528,8 +641,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump the uv group across 1 directory with 3 updates [#462](https://github.com/acgetchell/delaunay/pull/462) [`4fbc838`](https://github.com/acgetchell/delaunay/commit/4fbc8383c7ea07fef943e3e0fe677d819b1d4761) - Bumps the uv group with 3 updates in the / directory: [cryptography](https://github.com/pyca/cryptography) , - [python-multipart](https://github.com/Kludex/python-multipart) and [starlette](https://github.com/Kludex/starlette) . + Bumps the uv group with 3 updates in the / directory: [cryptography](https://github.com/pyca/cryptography), + [python-multipart](https://github.com/Kludex/python-multipart) and [starlette](https://github.com/Kludex/starlette). Updates `cryptography` from 46.0.7 to 48.0.1 @@ -537,37 +650,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Commits](https://github.com/pyca/cryptography/compare/46.0.7...48.0.1) Updates `python-multipart` from 0.0.27 to 0.0.31 - - [Release notes](https://github.com/Kludex/python-multipart/releases) - [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md) - [Commits](https://github.com/Kludex/python-multipart/compare/0.0.27...0.0.31) Updates `starlette` from 1.0.1 to 1.3.1 - - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/1.0.1...1.3.1) - ---- - - updated-dependencies: - -- dependency-name: cryptography - dependency-version: 48.0.1 - dependency-type: indirect - dependency-group: uv - -- dependency-name: python-multipart - dependency-version: 0.0.31 - dependency-type: indirect - dependency-group: uv - -- dependency-name: starlette - dependency-version: 1.3.1 - dependency-type: indirect - dependency-group: uv - ... - - Bump actions/checkout from 6.0.3 to 7.0.0 [#485](https://github.com/acgetchell/delaunay/pull/485) [`9a73c9d`](https://github.com/acgetchell/delaunay/commit/9a73c9dd5092e18b8d910d63b9f19110ecdeffe7) @@ -576,17 +666,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: 7.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 [#484](https://github.com/acgetchell/delaunay/pull/484) [`f1109b6`](https://github.com/acgetchell/delaunay/commit/f1109b6c2e2aab5c54280058eb8bd1d80c830b2b) @@ -594,16 +673,104 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) - [Commits](https://github.com/zizmorcore/zizmor-action/compare/5f14fd08f7cf1cb1609c1e344975f152c7ee938d...192e21d79ab29983730a13d1382995c2307fbcaa) +- Install native Tectonic dependencies [`2ba9c64`](https://github.com/acgetchell/delaunay/commit/2ba9c643ba34c107b05cac6991ca1b715e943672) + + - Install the Linux font, Graphite2, HarfBuzz, ICU, libpng, and zlib development headers needed to compile Tectonic in the papers workflow. + - Document the paper workflow's native dependency boundary for local setup and CI parity. + - Keep the validation paper outline ChkTeX/tex-fmt clean without changing author-owned prose. + - Add a progress breadcrumb before benchmark harness compilation so long Windows/MSVC CI runs do not look idle. +- Repair paper workflow and audit lockfile [`703eb1e`](https://github.com/acgetchell/delaunay/commit/703eb1ebb4f8d92b475b2acc8017cdb6eacba3fe) + + - Prebuild the perf-profile `delaunay` CLI before executing paper notebooks so nbconvert timeouts cover the validation demo run instead of Rust compilation. + - Pass the prebuilt binary through `DELAUNAY_BINARY` when refreshing paper figures. + - Document the paper CLI prebuild step for local and CI paper workflows. + - Update transitive `crossbeam-epoch` to 0.9.20 to clear RUSTSEC-2026-0204. +- Stabilize paper dependency setup [`d8f02e5`](https://github.com/acgetchell/delaunay/commit/d8f02e5ce551c632d773475cb3664821c527ede4) + + - Cache Homebrew downloads for paper workflow bottles and casks. + - Install the native Tectonic bridge dependencies expected by Cargo builds. + - Update BasicTeX's tlmgr before installing chktex on fresh macOS runners. +- [**breaking**] Require Rust 1.97 for v0.8.0 [#523](https://github.com/acgetchell/delaunay/pull/523) + [`9592849`](https://github.com/acgetchell/delaunay/commit/95928496a58a4c61a941de80d891ff760f7a073a) + + - align MSRV metadata, tooling, and documentation with Rust 1.97 + - adopt the stabilized Hilbert highest-bit helper + - apply new Clippy and rustdoc diagnostics and finish assertion cleanup + - clarify the predicate benchmark workload and cold-path audit evidence +- Bump actions/checkout from 7.0.0 to 7.0.1 [#533](https://github.com/acgetchell/delaunay/pull/533) + [`faa807d`](https://github.com/acgetchell/delaunay/commit/faa807d0d581ffed208fc293a44cb960ddaded9d) + + Bumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1. + + - [Release notes](https://github.com/actions/checkout/releases) + - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) + - [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1) +- Bump zizmorcore/zizmor-action from 0.5.7 to 0.6.0 [#538](https://github.com/acgetchell/delaunay/pull/538) + [`3a96ffc`](https://github.com/acgetchell/delaunay/commit/3a96ffc6bc82c9a637d9e635948c989b829c8557) + + Bumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.5.7 to 0.6.0. + + - [Release notes](https://github.com/zizmorcore/zizmor-action/releases) + - [Commits](https://github.com/zizmorcore/zizmor-action/compare/192e21d79ab29983730a13d1382995c2307fbcaa...6599ee8b7a49aef6a770f63d261d214911a7ce02) +- Bump actions/setup-python from 6.3.0 to 7.0.0 [#536](https://github.com/acgetchell/delaunay/pull/536) + [`a536730`](https://github.com/acgetchell/delaunay/commit/a5367308df59d981677032b7d1f2ba51807cb007) + + Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.3.0 to 7.0.0. + + - [Release notes](https://github.com/actions/setup-python/releases) + - [Commits](https://github.com/actions/setup-python/compare/ece7cb06caefa5fff74198d8649806c4678c61a1...5fda3b95a4ea91299a34e894583c3862153e4b97) +- Bump github/codeql-action/upload-sarif [#539](https://github.com/acgetchell/delaunay/pull/539) + [`01f6d8d`](https://github.com/acgetchell/delaunay/commit/01f6d8d06b5aa0326744d969a9338d331fffc450) + + Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.0 to 4.37.1. + + - [Release notes](https://github.com/github/codeql-action/releases) + - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/github/codeql-action/compare/99df26d4f13ea111d4ec1a7dddef6063f76b97e9...7188fc363630916deb702c7fdcf4e481b751f97a) +- Bump github/codeql-action/init from 4.37.0 to 4.37.1 [#537](https://github.com/acgetchell/delaunay/pull/537) + [`a0d15b1`](https://github.com/acgetchell/delaunay/commit/a0d15b1319b97e96522ed79876f62428627d1ded) ---- + Bumps [github/codeql-action/init](https://github.com/github/codeql-action) from 4.37.0 to 4.37.1. - updated-dependencies: + - [Release notes](https://github.com/github/codeql-action/releases) + - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/github/codeql-action/compare/99df26d4f13ea111d4ec1a7dddef6063f76b97e9...7188fc363630916deb702c7fdcf4e481b751f97a) +- Bump github/codeql-action/analyze from 4.37.0 to 4.37.1 [#535](https://github.com/acgetchell/delaunay/pull/535) + [`4df0e84`](https://github.com/acgetchell/delaunay/commit/4df0e84b4bdf1d96db91c00a2ecbbfce5c3c9d34) -- dependency-name: zizmorcore/zizmor-action - dependency-version: 0.5.7 - dependency-type: direct:production - update-type: version-update:semver-patch - ... + Bumps [github/codeql-action/analyze](https://github.com/github/codeql-action) from 4.37.0 to 4.37.1. + + - [Release notes](https://github.com/github/codeql-action/releases) + - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/github/codeql-action/compare/99df26d4f13ea111d4ec1a7dddef6063f76b97e9...7188fc363630916deb702c7fdcf4e481b751f97a) +- Bump the dependencies group across 1 directory with 4 updates [#534](https://github.com/acgetchell/delaunay/pull/534) + [`8836e34`](https://github.com/acgetchell/delaunay/commit/8836e346fb4d997e1a1301f101fe9585ec55d7d8) + + Bumps the dependencies group with 4 updates in the / directory: [clap](https://github.com/clap-rs/clap), [serde](https://github.com/serde-rs/serde), + [thiserror](https://github.com/dtolnay/thiserror) and [uuid](https://github.com/uuid-rs/uuid). + + Updates `clap` from 4.6.1 to 4.6.2 + + - [Release notes](https://github.com/clap-rs/clap/releases) + - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) + - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.1...clap_complete-v4.6.2) + + Updates `serde` from 1.0.228 to 1.0.229 + - [Release notes](https://github.com/serde-rs/serde/releases) + - [Commits](https://github.com/serde-rs/serde/compare/v1.0.228...v1.0.229) + + Updates `thiserror` from 2.0.18 to 2.0.19 + - [Release notes](https://github.com/dtolnay/thiserror/releases) + - [Commits](https://github.com/dtolnay/thiserror/compare/2.0.18...2.0.19) + + Updates `uuid` from 1.23.5 to 1.24.0 + - [Release notes](https://github.com/uuid-rs/uuid/releases) + - [Commits](https://github.com/uuid-rs/uuid/compare/v1.23.5...v1.24.0) +- Gate automatic merges on CodeRabbit review [`c30083e`](https://github.com/acgetchell/delaunay/commit/c30083ea1bc4bf1b276a35feb35fe647dec1768e) + + - Request CodeRabbit review and enable squash auto-merge for Dependabot PRs. + - Fail closed when CodeRabbit cannot review and group GitHub Actions updates. + - Refresh Rust dependencies and allow the intentional syn 2/syn 3 split. ### Performance @@ -632,3759 +799,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add validated ridge-star support so k=3 flip benchmarks inspect the full incident support with typed ridge errors. - Align Codacy Markdownlint exclusions with the repository release checklist policy. -## [0.7.8] - 2026-05-21 - -### ⚠️ Breaking Changes - -- Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) -- Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) -- Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) -- Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) -- Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) -- Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) [#404](https://github.com/acgetchell/delaunay/pull/404) -- Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) -- Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) - -### Merged Pull Requests - -- Roll back failed topology repair [#418](https://github.com/acgetchell/delaunay/pull/418) -- Validate compact 3D toroidal quotients [#417](https://github.com/acgetchell/delaunay/pull/417) -- Enforce 10-second default test budget [#415](https://github.com/acgetchell/delaunay/pull/415) -- Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) -- Isolate strict insphere consistency control [#383](https://github.com/acgetchell/delaunay/pull/383) [#411](https://github.com/acgetchell/delaunay/pull/411) -- Use typed errors in public examples [#365](https://github.com/acgetchell/delaunay/pull/365) [#410](https://github.com/acgetchell/delaunay/pull/410) -- Prefer builder-based fallible examples [#214](https://github.com/acgetchell/delaunay/pull/214) [#409](https://github.com/acgetchell/delaunay/pull/409) -- Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) -- Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) -- Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) [#404](https://github.com/acgetchell/delaunay/pull/404) -- Localize remove_vertex repair [#401](https://github.com/acgetchell/delaunay/pull/401) -- Bump idna in the uv group across 1 directory [#400](https://github.com/acgetchell/delaunay/pull/400) -- Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) -- Bump codecov/codecov-action from 6.0.0 to 6.0.1 [#398](https://github.com/acgetchell/delaunay/pull/398) -- Bump sysinfo in the dependencies group across 1 directory [#397](https://github.com/acgetchell/delaunay/pull/397) -- Bump taiki-e/install-action from 2.77.5 to 2.79.1 [#396](https://github.com/acgetchell/delaunay/pull/396) -- Surface squash-body commit entries [#395](https://github.com/acgetchell/delaunay/pull/395) -- Replace Node markdown tooling with rumdl [#394](https://github.com/acgetchell/delaunay/pull/394) -- Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) -- Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) -- Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) -- Refactor/387 tds mutation boundaries [#390](https://github.com/acgetchell/delaunay/pull/390) -- Refresh release docs and benchmark guidance [#389](https://github.com/acgetchell/delaunay/pull/389) - -### Added - -- [**breaking**] Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) - [`5fb2d4a`](https://github.com/acgetchell/delaunay/commit/5fb2d4a22927231ba3396950cf2bbbc481f69285) - - - Preserve periodic vertex offsets when bistellar flips build replacement cells. - - Align external-facet parity checks across periodic cell frames instead of rejecting periodic external cells. - - Surface replacement periodic-offset shape and frame conflicts with typed flip-context errors. -- [**breaking**] Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) - [`71336b5`](https://github.com/acgetchell/delaunay/commit/71336b52ffad7ad6923ea0268928a700e37c43e3) - - - Make insert_with_statistics return typed insertion errors for skipped - duplicate or retry-exhausted vertices so callers using ? cannot silently - ignore skipped inputs. - - - Add insert_best_effort_with_statistics for diagnostic and bulk-ingestion - workflows that intentionally preserve skipped insertions as outcomes with - telemetry. - - - Derive the default validation policy from the active topology guarantee so - PLManifold starts in ExplicitOnly mode while Pseudomanifold keeps - OnSuspicion. - - - Document skipped-input observability across construction, workflows, and - robustness guidance. - -### Changed - -- Refactor/387 tds mutation boundaries [#390](https://github.com/acgetchell/delaunay/pull/390) - [`da30293`](https://github.com/acgetchell/delaunay/commit/da3029302e8484d26d2a88d1291050c332e6b822) -- [**breaking**] Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) - [`655ff4c`](https://github.com/acgetchell/delaunay/commit/655ff4c944ac918c1a88ab70b26908bd1ebd329f) - - - Make `crate::core` private and expose low-level APIs through curated - `tds`, `collections`, `algorithms`, and `query` modules. - - - Add focused prelude/docs coverage for the new public import paths. - - Update downstream-style tests and doctests to stop relying on - `delaunay::core`. -- [**breaking**] Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) - [`48935d5`](https://github.com/acgetchell/delaunay/commit/48935d5c1ecbeef1b9b833b1de0d1cbcc2e72938) - - - Replace cell-oriented public types, methods, error variants, maps, and diagnostics with simplex terminology across TDS, triangulation, construction, repair, - flips, examples, benches, docs, and tests. - - - Preserve typed construction and insertion error context for cavity filling, explicit construction summaries, focused preludes, and Delaunay repair - diagnostics under the simplex API. - - - Remove redundant integration tests whose coverage is now exercised by unit, property, and public API tests. - - Move Codacy SARIF filtering into a tested support script and simplify Cargo package metadata. -- [**breaking**] Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) - [`774fd1b`](https://github.com/acgetchell/delaunay/commit/774fd1b92756a070d945061eff203fbc80563dbe) - - - Move Delaunay-facing APIs from the old triangulation facade to crate-root - modules and focused preludes such as construction, insertion, flips, - repair, validation, and delaunayize. - - - Split generic Triangulation behavior into construction, insertion, query, - orientation, repair, and validation modules with colocated tests and errors. - - - Keep the broad prelude for exploratory use while making focused preludes - orthogonal and workflow-specific. - - - Refresh docs, examples, benchmarks, and API export tests for the new module - layout and 7,500-vertex 3D debug-scale default. -- [**breaking**] Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) - [#404](https://github.com/acgetchell/delaunay/pull/404) [`e5a74a1`](https://github.com/acgetchell/delaunay/commit/e5a74a10586b162fad56d7f227ab194997f7a87c) - - - Add explicit caller-owned validation mode for PL-manifold topology guarantees. - - Reject incoherent topology guarantee and validation policy pairings through typed fallible setters. - - Keep compatibility setters non-committal when a requested pairing is invalid. - - Derive builder validation policy from the selected topology guarantee and document the compatibility matrix. -- [**breaking**] Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) - [`1789ceb`](https://github.com/acgetchell/delaunay/commit/1789cebd4f56b4dc09e014482d8d90176fdaeffc) - - - Box `DelaunayRepairError::Flip` sources while preserving typed `FlipError` - inspection through `From<FlipError>` and `Error::source`. - - - Update repair and construction mappings for the named boxed variant. - - Cover clone and source behavior for wrapped linear-algebra errors. -- Isolate strict insphere consistency control [#383](https://github.com/acgetchell/delaunay/pull/383) [#411](https://github.com/acgetchell/delaunay/pull/411) - [`222e572`](https://github.com/acgetchell/delaunay/commit/222e572b4364007cdbf6d1fa6428ea7e670cfb56) - - - Document the strict insphere consistency environment knob as a process-wide - once-per-process snapshot. - - - Add a thread-local test override guard so strict diagnostic paths can be - exercised without mutating global environment state. - - - Mark the production review checklist item complete. -- [**breaking**] Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) - [`1498153`](https://github.com/acgetchell/delaunay/commit/149815313530335a98f6951c63924e4774d509c1) - - - Define the slow-test bucket around deterministic correctness tests that exceed the default-suite budget. - - Move runnable high-dimensional properties out of ignored tests and into either the default suite or the slow-tests feature. - - Give just test-slow a release-mode nextest profile with a longer watchdog for intentional multi-minute regressions. - - Add a repository Semgrep guard against reintroducing slow ignored tests. - -#### Changed: Enforce explicit test buckets - -- Sort correctness tests into default and slow-tests buckets instead of relying on ignored tests. -- Move benchmark-style boundary and UUID iterator measurements into a Criterion benchmark target. -- Replace ignored flaky or known-failure cases with active assertions or slow-tests gating. -- Add a Semgrep guard against reintroducing ignored tests and align docs and helper recipes with the new taxonomy. -- Enforce 10-second default test budget [#415](https://github.com/acgetchell/delaunay/pull/415) - [`ba15de8`](https://github.com/acgetchell/delaunay/commit/ba15de8e97ab3dace8a2f5e0443f473930d1d344) - - - Gate default-suite cases at or above the 10-second budget behind - slow-tests and remove obsolete high-dimensional periodic validation from - routine runs. - - - Move allocation hot-path contracts into a Criterion benchmark over - calibrated 2D-5D fixtures, leaving allocation_api as wiring smoke coverage. - - - Document the toroidal validation limits and add the bench-allocations - workflow. - -### Documentation - -- Refresh release docs and benchmark guidance [#389](https://github.com/acgetchell/delaunay/pull/389) - [`526583c`](https://github.com/acgetchell/delaunay/commit/526583c627d32d9336910bce1913b7f458ca413c) - - - Update the README pitch, feature list, references, and docs.rs-facing guidance - around exact predicates, SoS, PL-manifold validation, and bistellar repair. - - - Refresh roadmap, release, limitation, robustness, orientation, invariant, - diagnostics, property-testing, workflow, and validation docs for the v0.7.8 - cleanup path and v0.8.0 paper-facing work. - - - Align contributor and script docs around non-mutating `just` checks before - mutating fixes. - - - Update generated benchmark-summary guidance to surface `just bench-perf-summary`, - current Criterion metadata, and large-scale characterization defaults. -- Prefer builder-based fallible examples [#214](https://github.com/acgetchell/delaunay/pull/214) [#409](https://github.com/acgetchell/delaunay/pull/409) - [`238dc12`](https://github.com/acgetchell/delaunay/commit/238dc124f6fb930cbeee31ea07c16d017f1822bd) - - - Present `DelaunayTriangulationBuilder` as the primary construction path while retaining `DelaunayTriangulation::new` as a legacy convenience constructor. - - Replace doctest `unwrap()` patterns with typed `?` propagation and explicit optional guards across construction, validation, repair, geometry, and topology - examples. - - - Re-export `DelaunayTriangulationBuilder` from `prelude::delaunayize` so single-prelude delaunayize examples can use the builder directly. -- Use typed errors in public examples [#365](https://github.com/acgetchell/delaunay/pull/365) [#410](https://github.com/acgetchell/delaunay/pull/410) - [`15633e2`](https://github.com/acgetchell/delaunay/commit/15633e2c03d2b2b9af1532676f0ce2c1292a538c) - - - Replace public doctest unwraps and expects with typed Result examples across core and geometry APIs. - - Use concrete crate errors or small local thiserror enums in guides instead of boxed dynamic errors. - - Clarify toroidal builder wording and point the README at the workflow docs for periodic construction. - -### Fixed - -- Surface squash-body commit entries [#395](https://github.com/acgetchell/delaunay/pull/395) - [`44dc3ed`](https://github.com/acgetchell/delaunay/commit/44dc3ede1012ed4b1f3a560b3c724e2e21d5169e) - - - Mirror conventional pseudo-commit headings from squash merge bodies into their matching changelog sections while preserving the primary PR entry. - - Regenerate active and archived changelogs so historical squash-body fixes, docs, maintenance, and performance notes appear under the right headings. - - Resolve production-review hygiene by clarifying Cargo feature gates, relabeling TDS UUID-map invariants, and recording UUID panic paths as test-only. -- Validate compact 3D toroidal quotients [#417](https://github.com/acgetchell/delaunay/pull/417) - [`3456ca9`](https://github.com/acgetchell/delaunay/commit/3456ca96abeeee5efb2ef413c3eb91d57f3921b4) - - - Validate periodic image-point quotients through final Levels 1-3 topology and Level 4 Delaunay checks before returning them. - - Preserve lifted periodic vertex identity in Euler and manifold validation so 3D quotient links and ridges are checked in the correct lattice frame. - - Select periodic quotient candidates by circumcenter ownership instead of barycenter ownership. - - Add a typed UnsupportedPeriodicDimension guardrail so 4D/5D periodic quotient construction fails fast pending scalable follow-up work in #416. - - Refresh toroidal periodic docs to state the 2D/compact 3D release boundary and high-dimensional guardrails. -- Roll back failed topology repair [#418](https://github.com/acgetchell/delaunay/pull/418) - [`8a9cbf3`](https://github.com/acgetchell/delaunay/commit/8a9cbf3510ebc16b884951791f2de20412cf6c36) - - - Restore the incoming triangulation when topology repair fails before fallback rebuild can recover. - - Add a regression for partial topology-repair mutation that exhausts its iteration budget. - - Update the v0.7.8 release metadata, roadmap, benchmark summary, changelog, and citation data. - - Tighten the doctest `.expect(` release guard to the current zero-count baseline. - -### Maintenance - -- Replace Node markdown tooling with rumdl [#394](https://github.com/acgetchell/delaunay/pull/394) - [`5654d14`](https://github.com/acgetchell/delaunay/commit/5654d14bc04dba538d776800495846d0a6ea94da) - - - Switch Markdown checks and Codacy configuration from markdownlint/npx to rumdl. - - Add dprint/pretty_yaml YAML formatting and wire yaml-check/yaml-fix through dprint plus yamllint. - - Format generated changelog archives with rumdl after git-cliff postprocessing. - - Add Semgrep guards for check-before-fix docs and pinned, allowlisted GitHub Actions. -- Bump codecov/codecov-action from 6.0.0 to 6.0.1 [#398](https://github.com/acgetchell/delaunay/pull/398) - [`325aa94`](https://github.com/acgetchell/delaunay/commit/325aa941ba9adaca7973c1f2a3f623c88b9a5d27) - - Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 6.0.1. - - - [Release notes](https://github.com/codecov/codecov-action/releases) - - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/codecov/codecov-action/compare/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 6.0.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump sysinfo in the dependencies group across 1 directory [#397](https://github.com/acgetchell/delaunay/pull/397) - [`8800150`](https://github.com/acgetchell/delaunay/commit/88001505822ed949c5075f9000a7f2e114bcf089) - - Bumps the dependencies group with 1 update in the / directory: [sysinfo](https://github.com/GuillaumeGomez/sysinfo). - - Updates `sysinfo` from 0.39.1 to 0.39.2 - - - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) - - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.39.1...v0.39.2) - ---- - - updated-dependencies: - -- dependency-name: sysinfo - dependency-version: 0.39.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - -- Bump taiki-e/install-action from 2.77.5 to 2.79.1 [#396](https://github.com/acgetchell/delaunay/pull/396) - [`d89961c`](https://github.com/acgetchell/delaunay/commit/d89961cfdc4af5c354c78f4e5fe008f1f273c6e2) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.77.5 to 2.79.1. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/fa0dd4cd0a40696e6f9766370614a5ce482e6aa8...b550161ef8a7bc4f2a671c0b03a18ac9ccedea1e) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.79.1 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump idna in the uv group across 1 directory [#400](https://github.com/acgetchell/delaunay/pull/400) - [`dadb724`](https://github.com/acgetchell/delaunay/commit/dadb7248243e2b320095c647d8314fd952c116e0) - - Bumps the uv group with 1 update in the / directory: [idna](https://github.com/kjd/idna). - - Updates `idna` from 3.13 to 3.15 - - - [Release notes](https://github.com/kjd/idna/releases) - - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md) - - [Commits](https://github.com/kjd/idna/compare/v3.13...v3.15) - ---- - - updated-dependencies: - -- dependency-name: idna - dependency-version: '3.15' - dependency-type: indirect - dependency-group: uv - ... - -- Run Windows tests with cargo-nextest [`bc5d48f`](https://github.com/acgetchell/delaunay/commit/bc5d48f61012d49224d783f6c49f88024948959c) - - - Install and verify the pinned cargo-nextest version across the CI build matrix. - - Run Windows library and release integration tests through nextest while keeping doctests on cargo test. - - Document the Windows nextest alignment in the tooling notes. - -### Performance - -- Localize remove_vertex repair [#401](https://github.com/acgetchell/delaunay/pull/401) - [`382f9e1`](https://github.com/acgetchell/delaunay/commit/382f9e13cff0f4a325361c056ea1d59be18003c5) - - - Avoid global simplex scans and incident-simplex rebuilds on successful - vertex removal by using the affected vertex star and scoped repair. - - - Promote and validate orientation over the touched removal scope, with the - full global orientation path retained as a fallback. - - - Add a Criterion remove_vertex benchmark covering successful removals and - invalid-remnant rollback across 2D through 5D. - -#### Performance: Stress remove_vertex cases - -- Add adversarial remove_vertex benchmark fixtures for near-boundary, - cospherical, near-degenerate, and large-coordinate point sets. - -- Include the selected fixture kind in Criterion case names so benchmark - output shows which geometry each run exercises. - -- Name the vertex-removal orientation normalization budget. - -#### Changed: Cover vertex-removal helper invariants - - Add focused regression coverage for vertex-removal helper behavior: - -- affected-vertex collection and missing-simplex error preservation -- local validation-scope deduplication and live-simplex filtering -- incident-simplex repair, isolated-vertex reporting, and postcondition failure -- fan-boundary filtering for facets that already contain the apex - -#### Fixed: Bound local facet repair removals - -- Preserve local repair removal budgets before mutating the TDS. -- Reuse scoped neighbor repair after vertex-removal facet cleanup. -- Install and verify cargo-nextest for faster CI test recipes. -- Build examples once before running their compiled binaries. - -## [0.7.7] - 2026-05-15 - -### ⚠️ Breaking Changes - -- Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) -- Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) -- Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) -- Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) -- Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) -- Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) - -### Merged Pull Requests - -- Stabilize large-scale profiling and construction [#377](https://github.com/acgetchell/delaunay/pull/377) -- Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) -- Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) -- Bump urllib3 in the uv group across 1 directory [#374](https://github.com/acgetchell/delaunay/pull/374) -- Bump actions-rust-lang/setup-rust-toolchain [#373](https://github.com/acgetchell/delaunay/pull/373) -- Bump sysinfo in the dependencies group [#372](https://github.com/acgetchell/delaunay/pull/372) -- Bump taiki-e/install-action from 2.76.0 to 2.77.5 [#371](https://github.com/acgetchell/delaunay/pull/371) -- Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) -- Cover fallback rebuild and flip roundtrips [#368](https://github.com/acgetchell/delaunay/pull/368) -- Harden SARIF tooling [#367](https://github.com/acgetchell/delaunay/pull/367) -- Repair insertion neighbors locally [#335](https://github.com/acgetchell/delaunay/pull/335) [#366](https://github.com/acgetchell/delaunay/pull/366) -- Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) -- Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) -- Bump python-multipart in the uv group across 1 directory [#361](https://github.com/acgetchell/delaunay/pull/361) -- Bump taiki-e/install-action from 2.75.26 to 2.76.0 [#360](https://github.com/acgetchell/delaunay/pull/360) -- Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) -- Enable repo Semgrep rules for issue #338 [#354](https://github.com/acgetchell/delaunay/pull/354) -- Type repair diagnostics and harden invariants [#332](https://github.com/acgetchell/delaunay/pull/332) [#352](https://github.com/acgetchell/delaunay/pull/352) -- Harden Python benchmark parsing [#351](https://github.com/acgetchell/delaunay/pull/351) -- Expand profiling benchmarks around public API workflows [#349](https://github.com/acgetchell/delaunay/pull/349) -- Bump taiki-e/install-action from 2.75.18 to 2.75.22 [#348](https://github.com/acgetchell/delaunay/pull/348) - -### Changed - -- Type repair diagnostics and harden invariants [#332](https://github.com/acgetchell/delaunay/pull/332) [#352](https://github.com/acgetchell/delaunay/pull/352) - [`a244053`](https://github.com/acgetchell/delaunay/commit/a2440531ae7ee1407e7436379a82fe092f02e7dd) - - - Replace stringified flip-repair skip samples with typed diagnostic context. - - Make vertex removal transactional across post-removal repair and orientation canonicalization. - - Deprecate DelaunayTriangulation::as_triangulation_mut ahead of removal in v0.8.0. - - Use scale-aware degeneracy checks for low-dimensional simplex and facet measures. - - Add regression and property coverage for rollback behavior, typed diagnostics, and scaled valid measures. - - Tolerate throughput formatting precision in benchmark baseline round-trip tests. -- [**breaking**] Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) - [`0c1f477`](https://github.com/acgetchell/delaunay/commit/0c1f477658ffbad2198cb55b76089dadfdba0a6d) - - - Enforce checked Delaunay construction and reconstruction so explicit connectivity, deserialization, and TDS wrapping cannot produce invalid - DelaunayTriangulation values. - - - Replace stringly insertion and construction failures with typed, matchable errors, and route topology/TDS failures without production panics. - - Tighten public API names, trait bounds, prelude exports, docs, and doctests around mutation, reconstruction, construction statistics, and feature-gated - behavior. - - - Standardize on DenseSlotMap storage, remove SlotMap backend comparison tooling, and align CI, docs.rs, changelog, benchmark, Semgrep, and release workflows. - - Harden benchmark comparison parsing so individual regressions and malformed baseline sections fail explicitly. -- Cover fallback rebuild and flip roundtrips [#368](https://github.com/acgetchell/delaunay/pull/368) - [`aa0de2c`](https://github.com/acgetchell/delaunay/commit/aa0de2cf8892b8caecfc3e8a3b04e3f4eefa23b5) - - - Add dimension-generic flip roundtrip properties for public k=1 and internal k=2/k=3 paths. - - Exercise fallback rebuilds after supported Delaunay repair failures and duplicate-simplex topology failures. - - Cover circumradius agreement between direct and precomputed-center paths. - - Exclude debug-only circumsphere logging branches from LCOV. -- [**breaking**] Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) - [`e187cf0`](https://github.com/acgetchell/delaunay/commit/e187cf06761308b96a98f524c32bd3cf712250f8) - - - Replace stringly validation and repair contexts with typed summaries and failure categories across insertion, flips, TDS, builder, and Delaunay validation - paths. - - - Tighten kernel, coordinate, and data trait contracts so exact predicates are dimension-scoped and payload bounds apply only where needed. - - Split explicit-construction validation into orthogonal typed errors and preserve structured source details through fallback and repair paths. - - Narrow focused prelude exports, add repository style rules, and document the 10,000-vertex 3D acceptance envelope. -- [**breaking**] Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) - [`4c6d55e`](https://github.com/acgetchell/delaunay/commit/4c6d55e12ff60155c97e117aefabc5ff80d2f47f) - - - Replace scalar-unit duplicate detection with scale-aware tolerances and keep the spatial index usable across rollback-safe insertion and removal paths. - - Route matrix dispatch, predicate degeneracy, non-finite geometry, and robust insphere overflow through typed errors and exact relative-coordinate - predicates. - - - Preserve TDS identity across transactional rollback, run required pseudomanifold validation during insertion, and remove raw cell-storage mutation. - - Use DoS-resistant hashing for coordinate-derived buckets and gate insertion timing telemetry to callers that consume it. - - Normalize root and archived changelog markdown through shared post-processing. - - Simplify validation telemetry, predicate helpers, cache invalidation, and prelude coverage without changing the correctness/performance contracts. - -### Fixed - -- Harden Python benchmark parsing [#351](https://github.com/acgetchell/delaunay/pull/351) - [`fea5898`](https://github.com/acgetchell/delaunay/commit/fea58987a2fb84e47603be9f0d1960aaa7e0f5f0) - - - Reject non-finite and unordered Criterion timing estimates before using them in summaries, baselines, or backend comparisons. - - Preserve full Criterion benchmark IDs and normalize timing units when comparing storage backend results. - - Reuse the shared baseline parser while preserving malformed-section skip behavior and supporting scientific notation. - - Fall back from unusable lscpu output to /proc CPU core detection on Linux. - - Add regression and round-trip tests for parser behavior, benchmark IDs, unit normalization, and Linux CPU fallback. - - Document Python parser/file-format round-trip test expectations. - -#### Fixed: Harden Criterion estimate parsing and validation - - Consolidates estimate validation into a single public helper, - `is_valid_criterion_estimate`, now used by `PerformanceSummaryGenerator` - and `StorageBackendComparator`. Adds explicit type checks to - `PerformanceSummaryGenerator` to reject structurally malformed JSON - data, improving parsing robustness. - -- [**breaking**] Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) - [`83d9619`](https://github.com/acgetchell/delaunay/commit/83d96197cc5f7b2b2242904b7bab76ac9e058e6c) - - - Make duplicate-cell removal and bistellar flip mutation fail before committing invalid TDS state. - - Preserve typed topology, validation, and insertion errors through retry and flip-wiring paths. - - Enforce typed error handling in public examples, benchmarks, and public API integration tests. - - - Rebuild and validate TDS topology after duplicate-cell removal so neighbor and incident-cell links stay consistent. - - Preserve flip validation, wiring, and repair failure kinds instead of flattening them into coarse mutation errors. - - Propagate construction failures from examples and route benchmark diagnostics through feature-gated tracing. - - Clarify public API docs for collection aliases and facet error paths. - -#### Fixed: Make duplicate-cell removal transactional - -- Validate duplicate-cell removals on a cloned TDS and commit only after neighbor rebuilding, incident-cell assignment, and full validation succeed. -- Preserve typed construction and mutation errors in examples and doctests, including prelude coverage for TdsMutationError. -- Share feature-gated tracing abort helpers across benchmarks and keep setup error handling out of measured closures. -- Remove committed debug printing from collection tests. - -### Maintenance - -- Bump taiki-e/install-action from 2.75.18 to 2.75.22 [#348](https://github.com/acgetchell/delaunay/pull/348) - [`31ec720`](https://github.com/acgetchell/delaunay/commit/31ec720a8638103b9acd7ea58c35b2baa5f571b9) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.18 to 2.75.22. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/055f5df8c3f65ea01cd41e9dc855becd88953486...cf525cb33f51aca27cd6fa02034117ab963ff9f1) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.75.22 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Enable repo Semgrep rules for issue #338 [#354](https://github.com/acgetchell/delaunay/pull/354) - [`9d51d30`](https://github.com/acgetchell/delaunay/commit/9d51d3038ae3f3316102ecaf39429bdfb73ff1cc) - - - Enable project-owned Semgrep rules in local checks, CodeRabbit, and Codacy/OpenGrep scanning. - - Harden Semgrep execution with strict mode, a higher timeout, and fixture coverage for hot-path hash collection rules. - - Replace flagged diagnostics and silent numeric fallbacks with explicit tracing, expectations, and typed Hilbert quantization errors. - - Centralize Delaunay triangulation cache invalidation through the existing repair-cache helper. - -#### Maintenance: Enable repository Semgrep rules - -- Rename the Semgrep config to semgrep.yaml and wire it into local checks, CodeRabbit, and Codacy/OpenGrep. -- Add strict Semgrep execution plus fixture coverage for hot-path hash collections and targeted panic bypasses. -- Make Hilbert errors non-exhaustive and document quantization-scale conversion failures on APIs that can return them. -- Replace fragile VertexBuilder expect paths with infallible Vertex point constructors. - -#### Maintenance: Expand repository Semgrep rules - -- Add project-specific Semgrep checks for Rust dynamic errors, lint suppression reasons, Python subprocess mocks, and typed script helpers. -- Add focused Semgrep fixtures for hot-path hash collections, Rust project rules, and Python test conventions. -- Wire the expanded Semgrep fixture suite into `just check`. -- Replace stale Clippy `allow` suppressions with documented `expect` attributes and remove dynamic error trait-object usage from tests. - -#### Maintenance: Refresh quality tooling and diagnostics - -- Pin GitHub workflow tool versions and update action SHAs for cache, artifact upload, install-action, and SARIF upload. -- Exclude Semgrep fixtures from Codacy analysis so intentional rule-test violations do not surface as production issues. -- Add a cargo-machete backed just unused-deps recipe for checking unused direct dependencies. -- Gate convex hull test diagnostics behind diagnostics tracing instead of unconditional stdout output. -- Add Hilbert ordering and zero-dimensional sort coverage for Codecov patch gaps. - -#### Fixed: Harden Hilbert ordering errors and prelude checks [#338](https://github.com/acgetchell/delaunay/pull/338) - -- Return typed Hilbert errors for non-finite quantization inputs and failed u32 coordinate conversions instead of silently collapsing values. -- Preserve item order when Hilbert sort key construction fails, and add regression coverage for the new error paths. -- Add the focused ordering prelude and update doctests, examples, benchmarks, and integration tests to use orthogonal prelude imports. -- Add a Semgrep rule and fixture coverage for examples and benchmarks that bypass focused preludes. -- Verify pinned shfmt binaries in CI with explicit SHA256 values instead of downloading a missing upstream checksum file. -- [**breaking**] Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) - [`5d8a9ff`](https://github.com/acgetchell/delaunay/commit/5d8a9ff3bfd260636a8fa4209cb00801c134aaa5) - - - Skip empty Codacy SARIF runs before uploading results to GitHub Code Scanning. - - Limit Codacy code scanning uploads to repository-owned OpenGrep analysis. - - Migrate triangulation doctests to focused prelude imports for #355. - - Add Semgrep coverage to keep triangulation doctest imports on focused preludes. - - Clarify vertex point-constructor docs and avoid UUID-bearing facet assertion output. - -#### Added: Add focused preludes for doctest imports - -- Add minimal, task-focused preludes for triangulation, TDS, geometry, queries, generators, ordering, collections, and topology workflows. -- Update doctests, examples, integration tests, and benchmarks to use focused preludes instead of deep internal imports. -- Expand the Semgrep doctest import rule to cover all Rust source files and hidden doctest imports. -- Harden Codacy SARIF handling so empty analyses skip upload cleanly instead of creating noisy code-scanning results. -- Document the new prelude structure and update guides to use public prelude imports. - -#### Fixed: Gate public diagnostic exports behind diagnostics - -- Replace profile-based public diagnostic exports with the documented diagnostics feature. -- Keep debug-only helper definitions and diagnostic call sites aligned with feature-gated API visibility. -- Allow hidden doctest prelude imports in the Semgrep prelude-import rule. - -#### Changed: Rename diagnostics feature flag - -- Use the diagnostics feature flag for opt-in diagnostic helpers and verbose test diagnostics. -- Add prelude::diagnostics for debug verification helpers while keeping focused preludes narrow and orthogonal. -- Move diagnostic helper exports out of unrelated focused preludes and update cfg gates, tests, docs, and just recipes. -- Document that focused preludes should favor precise taxonomy over backwards compatibility for unrelated re-exports. -- Bump taiki-e/install-action from 2.75.26 to 2.76.0 [#360](https://github.com/acgetchell/delaunay/pull/360) - [`5b764e0`](https://github.com/acgetchell/delaunay/commit/5b764e0ab8c63223e63835b475d4829081db5e94) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.26 to 2.76.0. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/b651345a718c8f44efa2460560b3dbf29cbd7ee1...711e1c3275189d76dcc4d34ddea63bf96ac49090) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.76.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump python-multipart in the uv group across 1 directory [#361](https://github.com/acgetchell/delaunay/pull/361) - [`af6e210`](https://github.com/acgetchell/delaunay/commit/af6e210cba687606c24c8c2a2ba519470d787abe) - - Bumps the uv group with 1 update in the / directory: [python-multipart](https://github.com/Kludex/python-multipart). - - Updates `python-multipart` from 0.0.26 to 0.0.27 - - - [Release notes](https://github.com/Kludex/python-multipart/releases) - - [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md) - - [Commits](https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27) - ---- - - updated-dependencies: - -- dependency-name: python-multipart - dependency-version: 0.0.27 - dependency-type: indirect - dependency-group: uv - ... -- Harden SARIF tooling [#367](https://github.com/acgetchell/delaunay/pull/367) - [`e5b20cd`](https://github.com/acgetchell/delaunay/commit/e5b20cd78fd58ba1bc77c20e5076dc778304b917) - - - Add a repository-rule Semgrep SARIF workflow for direct Code Scanning uploads. - - Harden Clippy SARIF generation with pipefail, cargo lint coverage, and guarded uploads. - - Discover Semgrep rule fixtures dynamically so new fixtures are tested automatically. - - Document the tooling parity updates ported from causal-triangulations. -- Bump taiki-e/install-action from 2.76.0 to 2.77.5 [#371](https://github.com/acgetchell/delaunay/pull/371) - [`b7fa94c`](https://github.com/acgetchell/delaunay/commit/b7fa94cb7611c12c2277b16ac9c215e177e95f41) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.76.0 to 2.77.5. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/711e1c3275189d76dcc4d34ddea63bf96ac49090...fa0dd4cd0a40696e6f9766370614a5ce482e6aa8) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.77.5 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump urllib3 in the uv group across 1 directory [#374](https://github.com/acgetchell/delaunay/pull/374) - [`6b9716a`](https://github.com/acgetchell/delaunay/commit/6b9716ac2ccd01e979fe10b72303694e362af579) - - Bumps the uv group with 1 update in the / directory: [urllib3](https://github.com/urllib3/urllib3). - - Updates `urllib3` from 2.6.3 to 2.7.0 - - - [Release notes](https://github.com/urllib3/urllib3/releases) - - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - - [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0) - ---- - - updated-dependencies: - -- dependency-name: urllib3 - dependency-version: 2.7.0 - dependency-type: indirect - dependency-group: uv - ... - -- Bump actions-rust-lang/setup-rust-toolchain [#373](https://github.com/acgetchell/delaunay/pull/373) - [`3a9dabc`](https://github.com/acgetchell/delaunay/commit/3a9dabc1b84f804a86a0ae13ab16b7efc0a06d38) - - Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.16.0 to 1.16.1. - - - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/2b1f5e9b395427c92ee4e3331786ca3c37afe2d7...46268bd060767258de96ed93c1251119784f2ab6) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.16.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump sysinfo in the dependencies group [#372](https://github.com/acgetchell/delaunay/pull/372) - [`efc2bb7`](https://github.com/acgetchell/delaunay/commit/efc2bb700e51039407794db7e0b9b47591187e02) - - Bumps the dependencies group with 1 update: [sysinfo](https://github.com/GuillaumeGomez/sysinfo). - - Updates `sysinfo` from 0.39.0 to 0.39.1 - - - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) - - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.39.0...v0.39.1) - ---- - - updated-dependencies: - -- dependency-name: sysinfo - dependency-version: 0.39.1 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - -### Performance - -- Expand profiling benchmarks around public API workflows [#349](https://github.com/acgetchell/delaunay/pull/349) - [`0acbf65`](https://github.com/acgetchell/delaunay/commit/0acbf651b57c287aecc10bd51eea55fdbcbe2442) - - - Run profiling comparisons with the checked-out crate toolchain by default - - Add local `just profile` support for comparing code refs and compiler versions - - Expand `ci_performance_suite` beyond construction to cover hulls, boundary traversal, validation, and bistellar flips - - Emit a versioned API benchmark manifest so benchmark logs show which public workflows were measured -- Repair insertion neighbors locally [#335](https://github.com/acgetchell/delaunay/pull/335) [#366](https://github.com/acgetchell/delaunay/pull/366) - [`f09d698`](https://github.com/acgetchell/delaunay/commit/f09d69802fd9ebc554b7df8745db1e6b9ca2126a) - - - Replace post-insertion global neighbor rebuilds with seeded local repair - over new cells, removed-cell frontiers, and facet-issue survivors. - - - Preserve facet-compatible existing neighbor pointers while repairing - empty, dangling, or stale local slots. - - - Add a release-mode escape hatch for forcing global neighbor rebuilds - during A/B isolation. - - - Expose the low-level local repair helper through the insertion prelude - and preserve typed neighbor-repair error sources. -- [**breaking**] Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) - [`a984b3a`](https://github.com/acgetchell/delaunay/commit/a984b3aa0c57a967b0ae6f33b88042af49ac52cb) - - - Add a batch repair policy option to ConstructionOptions so bulk insertion can repair local Delaunay fronts every N insertions. - - Carry pending local repair seeds through batch construction and finalization so cadenced repairs cover the accumulated frontier. - - Report construction telemetry for locate walks, conflict regions, global exterior scans, skipped-vertex budgets, and initial-simplex A/B runs in the - large-scale debug harness. - -#### Performance: Keep bulk repair seeding local - -- Return live insertion-created cells as repair seeds so batch construction can - accumulate local frontiers without scanning vertex stars globally. - -- Move repair seed frontier helpers into triangulation locality utilities and - defer broad repair fallback to final construction repair. - -- Extend construction telemetry and large-scale debug output with seed - accumulation timing. - -#### Performance: Keep exterior repair seeding local - -- Preserve the terminal locate cell so exterior insertion can seed nearby repair work without scanning the full triangulation. -- Skip global conflict-region scans during exterior hull extension and defer broad Delaunay cleanup to cadenced and final repair. -- Move local repair seed bookkeeping helpers into triangulation locality utilities. - -#### Performance: Localize construction repair cadence - -- Keep exterior repair seeding local when conflict buffers are empty, avoiding global conflict-region scans during insertion. -- Gate topology-validation telemetry on actual validation work and add typed validation cadences for large-scale diagnostics. -- Preserve typed Delaunay repair failures with construction repair phases and keep mutation repair gates independent of insertion cadence. -- Add focused triangulation construction, repair, and validation preludes across docs, examples, benches, and tests. - -#### Performance: Trigger batch repair on seed backlog [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Add an adaptive seed-backlog trigger for batch local Delaunay repair. -- Track local repair frontier sizes and cadence versus backlog triggers. -- Expose the 3D large-scale repair interval in the debug just recipe. -- Clarify batch repair policy docs and cover trigger/telemetry behavior with focused tests. - -#### Performance: Fast-path retry validation [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Use the flip-based Delaunay verifier when accepting shuffled construction - retries instead of the brute-force property scan. - -- Add construction phase telemetry for preprocessing, insertion, finalization, - and final validation timing. - -- Default the large-scale debug repair interval to 2 for the 3K repair sweep. - -#### Performance: Default batch repair to EveryN(2) [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Default batch construction repair to EveryN(2) while keeping direct incremental repair at EveryInsertion. -- Preserve final repair and validation as the acceptance gate for valid Delaunay output. -- Surface construction skip and slow-insertion diagnostics through the construction prelude. -- Align repair-policy docs with the batch default and the current 500/3000-point proxy results. - -#### Fixed: Tolerate degenerate Delaunay retessellation [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Compare quality metrics only for cells shared across independently - transformed triangulations, rejecting cases with no comparable cells. - -- Narrow locality repair helper visibility where the current module graph - allows it while preserving core insertion repair access. - -- Clarify that non-substantive PRs may be declined unless justified by - cleanup or tooling needs. - -#### Fixed: Distinguish insertion telemetry [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Count only full insertion validation runs in topology validation telemetry while preserving required link checks. -- Exclude caller-provided conflict buffers from discovered conflict-region telemetry. -- Keep large-scale debug validation cadence tied to inserted vertices and tighten triangulation proptest acceptance. -- Add explicit unsafe-code forbids to remaining bench, example, and test crates. - -#### Performance: Tune batch construction repair [#341](https://github.com/acgetchell/delaunay/pull/341) - -- Default batch construction to the real-vertex max-volume initial simplex and - every-insertion Delaunay repair cadence. - -- Add focused construction diagnostics telemetry for repair phase timing, - queued work, seed frontiers, and construction phase costs. - -- Keep local repair postcondition replay tied to observed repair work so skipped - flip candidates cannot suppress required validation. - -- Update large-scale debug docs and recipes to reflect the new defaults. - -- Stabilize large-scale profiling and construction [#377](https://github.com/acgetchell/delaunay/pull/377) - [`77ba50b`](https://github.com/acgetchell/delaunay/commit/77ba50b23c6f22fbeaa6acf240bb144bbb1458f7) - - - Calibrate the 2D-5D debug-large-scale acceptance runs around maintainer - hardware and document generated simplex counts. - - - Fold large-scale profiling into profiling_suite with construction, memory, - validation, and traversal workloads. - - - Compare performance regressions against same-machine main-ref baselines. - - Harden insertion topology preflight and exact insphere paths used by repair - and high-dimensional construction. - -## [0.7.6] - 2026-04-25 - -### ⚠️ Breaking Changes - -- Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) - [#318](https://github.com/acgetchell/delaunay/pull/318) - -### Merged Pull Requests - -- Preserve fallback rebuild cell data [#305](https://github.com/acgetchell/delaunay/pull/305) [#346](https://github.com/acgetchell/delaunay/pull/346) -- Switch coverage reporting to cargo-llvm-cov [#345](https://github.com/acgetchell/delaunay/pull/345) -- Clarify research scope and changelog hygiene [#344](https://github.com/acgetchell/delaunay/pull/344) -- Instrument large-scale 4D debugging and widen local repair seeds [#339](https://github.com/acgetchell/delaunay/pull/339) -- Orient Delaunay repair replacement cells [#307](https://github.com/acgetchell/delaunay/pull/307) [#336](https://github.com/acgetchell/delaunay/pull/336) -- Use dedicated perf profile for consistent benchmark measurement [#334](https://github.com/acgetchell/delaunay/pull/334) -- Periodic-aware Delaunay verification (Level 4) for toroidal tria… [#333](https://github.com/acgetchell/delaunay/pull/333) -- Adopt Rust 1.95.0 MSRV [#330](https://github.com/acgetchell/delaunay/pull/330) -- Bump actions-rust-lang/setup-rust-toolchain [#328](https://github.com/acgetchell/delaunay/pull/328) -- Bump actions/setup-node from 6.3.0 to 6.4.0 [#327](https://github.com/acgetchell/delaunay/pull/327) -- Bump taiki-e/install-action from 2.75.9 to 2.75.18 [#326](https://github.com/acgetchell/delaunay/pull/326) -- Bump astral-sh/setup-uv from 8.0.0 to 8.1.0 [#325](https://github.com/acgetchell/delaunay/pull/325) -- Bump pytest in the uv group across 1 directory [#322](https://github.com/acgetchell/delaunay/pull/322) -- Bump taiki-e/install-action from 2.73.0 to 2.75.9 [#321](https://github.com/acgetchell/delaunay/pull/321) -- Bump actions/github-script from 8.0.0 to 9.0.0 [#320](https://github.com/acgetchell/delaunay/pull/320) -- Unify flip-repair and retry constants across build profiles [#306](https://github.com/acgetchell/delaunay/pull/306) - [#319](https://github.com/acgetchell/delaunay/pull/319) -- Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) - [#318](https://github.com/acgetchell/delaunay/pull/318) -- Rename tds file and move delaunay/builder into triangulation/ [#317](https://github.com/acgetchell/delaunay/pull/317) -- Allow explicit cell construction with non-sphere Euler characteristic [#314](https://github.com/acgetchell/delaunay/pull/314) - -### Added - -- Allow explicit cell construction with non-sphere Euler characteristic [#314](https://github.com/acgetchell/delaunay/pull/314) - [`c81bb1a`](https://github.com/acgetchell/delaunay/commit/c81bb1a69f50a8c777890c0ac95b07cb99033d83) - - Add `.global_topology()` builder setter so callers can declare the - intended topology (e.g. Toroidal) for explicit cell construction. - `validate_topology_core()` uses this metadata to override the heuristic - classification: closed toroidal meshes expect χ = 0 instead of the - sphere default χ = 1+(-1)^D. - - - Add `ToroidalConstructionMode::Explicit` variant for explicit builds - - Add `TopologyClassification::ClosedToroid(D)` with χ(T^d) = 0 - - Add `global_topology` field and setter to `DelaunayTriangulationBuilder` - - Thread `GlobalTopology` through `build_explicit()`, set before validation - - Override Euler classification in `validate_topology_core()` when - `global_topology` is `Toroidal` and heuristic yields `ClosedSphere` - - - Add T² (3×3 grid) and T³ (3×3×3 Freudenthal) integration tests - validating χ = 0 via explicit construction - -- Instrument large-scale 4D debugging and widen local repair seeds [#339](https://github.com/acgetchell/delaunay/pull/339) - [`3af976e`](https://github.com/acgetchell/delaunay/commit/3af976ec2f7c33d49803b24ab8f1a7da598fea0b) - - - Thread cavity-touched cells through insertion as `repair_seed_cells` - so post-insertion local Delaunay repair widens its frontier beyond - the inserted vertex star; cells shrunk out of the conflict region - during cavity reduction now participate in the next repair pass. - - - Accumulate ridge-fan extras across every fan in a conflict region - before returning `RidgeFan`, letting one cavity-reduction step - shrink all detected fans at once instead of peeling them iteration - by iteration. - - - Add release-visible diagnostic hooks routed through `tracing::debug!`: - `DELAUNAY_BULK_PROGRESS_EVERY` for periodic batch-construction - progress, `DELAUNAY_DEBUG_RETRYABLE_SKIP` for retryable - conflict-region skip traces, `DELAUNAY_DEBUG_CAVITY_REDUCTION_ONCE` - for the first cavity-reduction chain, `DELAUNAY_DEBUG_RIDGE_FAN_ONCE` - for the first detected ridge fan, and - `DELAUNAY_REPAIR_DEBUG_POSTCONDITION_FACET` / - `DELAUNAY_REPAIR_DEBUG_RIDGE_MIN_MULTIPLICITY` for repair - postcondition debugging. - - - Thread `last_applied_flip` through repair postcondition verification - so unresolved k=2 facet and ridge snapshots can relate the violating - local star to the immediately preceding flip. - - - Replace `ConflictError::InternalInconsistency { context: String }` - with a typed `InternalInconsistencySite` enum carrying structured - indices and counts, so callers can `matches!` on specific sites - instead of parsing prose. - - - Generalize the large-scale incremental prefix bisect over `const D`, - add a 4D counterpart targeting the seeded 500-point repro - (`0xD225_B8A0_7E27_4AE6`), and expose it via - `just debug-large-scale-4d-incremental-bisect`. - - - Switch the large-scale debug just recipes to `--release` and - document the 2026-04-23 re-verification: historical 35-point 3D and - 100-point 4D correctness repros from #306/#307 now pass, while a - 500-point 4D seed still fails all shuffled retries with - `Ridge fan detected: 4 facets share ridge with 3 vertices`. - - - Default the large-scale debug harness tracing filter to `debug` when - any of the new release-visible env vars are present so library-side - `tracing::debug!` events surface without extra `RUST_LOG` wiring. - - - Broaden `test_perturbation_retry_and_exhaustion_4d` and - `test_perturbation_retry_seeded_branch_4d` to iterate over 50 seeds - so the retry-path assertions stay robust to insertion-path - improvements that make individual well-conditioned seeds less likely - to trigger retries. - -#### Fixed: Close the 4D bulk repair retry collapse - -- Raise the D≥4 per-insertion repair budget, add a rate-limited escalation pass, and widen local post-repair validation so the 500-point #204 repro converges - without skipped vertices. - -- Preserve removed-cell snapshots and predecessor context in flip diagnostics, drop stale repair seeds after cavity reduction, and re-export locate conflict - diagnostics from the prelude. - -- Replace committed `eprintln!` diagnostics in production, tests, and benches with `tracing` , using `diagnostics` and `bench-logging` gates and keeping logs - out of Criterion hot loops. - -- Document the #204 investigation, refresh the 4D known-issues and TODO notes, and record the repository logging policy plus release-visible debug environment - variables. - -#### Changed: Harden flip diagnostics and refine large-scale debug workflows - - Refactor flip snapshotting and cavity-reduction bookkeeping to ensure - diagnostic reliability and accurate repair-seed collection. Update - documentation and justfile recipes to reflect fixed historical repros - and transition to monitoring active scalability investigations for 3D, - 4D, and 5D datasets. - -- Move removed-cell vertex capturing into fallible internal helpers -- Implement lazy evaluation for cavity-reduction diagnostic logs -- Harden vertex deduplication with fallible epsilon validation -- Update 4D known issues to reflect 100-point and 500-point fixes -- Simplify the large-scale debug harness CLI and documentation - -### Changed - -- Rename tds file and move delaunay/builder into triangulation/ [#317](https://github.com/acgetchell/delaunay/pull/317) - [`25faa5b`](https://github.com/acgetchell/delaunay/commit/25faa5b4b2fe54b20e609cd390fe3edb221da29b) - - - Rename src/core/triangulation_data_structure.rs → src/core/tds.rs - - Move src/core/delaunay_triangulation.rs → src/triangulation/delaunay.rs - - Move src/core/builder.rs → src/triangulation/builder.rs - - Widen pub(in crate::core) → pub(crate) for cross-module access - - Preserve public API via re-exports in core {} - - Add GlobalTopology::is_euclidean() for API symmetry with is_toroidal() - - Add doctests for topology_guarantee, global_topology, topology_kind, - set_global_topology accessors - - - Hoist in-function test imports to module-level per project convention - - Shorten fully-qualified paths (CellValidationError, ConflictError, etc.) - - Bump la-stack 0.3.0 → 0.4.0 (integer-only Bareiss, stack-backed exact - arithmetic, custom f64→BigRational via IEEE 754 bit decomposition) - - - Update README, code_organization.md, debug_env_vars.md, rust.md, - numerical_robustness_guide.md, COVERAGE.md, and other active docs - - - Archive docs left unchanged (historical state) -- [**breaking**] Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) - [#318](https://github.com/acgetchell/delaunay/pull/318) [`c612188`](https://github.com/acgetchell/delaunay/commit/c61218858a169108da51067e9b65f6a26baede16) - - - Absorb AddAssign, SubAssign, and Sum bounds into CoordinateScalar - - Remove ScalarAccumulative and ScalarSummable traits and their blanket impls - - Replace all ScalarAccumulative bounds with CoordinateScalar across 20 files - - Simplify operator usage (e.g. coords[axis] += … instead of manual add-assign) -- Update dependencies and synchronize changelog (internal) [`7a1066b`](https://github.com/acgetchell/delaunay/commit/7a1066b4da9229a5148994f8a80f3521df62ec6c) - - Perform a general dependency update, including a patch bump for `uuid`. - Synchronize `CHANGELOG.md` with recent maintenance tasks, documentation - updates, and merged pull requests. Add `.kilo/` to the ignored user - configuration patterns. -- Use dedicated perf profile for consistent benchmark measurement [#334](https://github.com/acgetchell/delaunay/pull/334) - [`f527c0c`](https://github.com/acgetchell/delaunay/commit/f527c0cf37b76f09222800afcfc138e623957678) - - Introduce a `perf` Cargo profile that inherits from `release` but - restores ThinLTO and single codegen units. This ensures local, CI, and - release benchmarks are generated with identical optimization settings. - - Update all benchmark harnesses, `just` recipes, and documentation to - standardize on `--profile perf` for performance measurements, while - retaining the default release profile for fast validation in `just ci`. - A new `bench-smoke` target provides quick harness validation without - the overhead of high-sample measurements. - - Also deniest warnings via the manifest lint policy to ensure consistent - repository-wide enforcement. - -#### Changed: Standardize benchmark profiles and enhance SARIF analysis - - Standardize benchmark workflows to use the `perf` profile by default - across local scripts and CI for consistent optimization settings. Add a - dedicated CodeQL analysis workflow and refactor SARIF reporting for - cargo-audit, Clippy, and Codacy to improve GitHub Code Scanning - integration. Update manifest lints to comply with RFC 3389 priority - requirements and fix the minimum sample size for benchmark smoke tests. - -#### Changed: Track sampling metadata and standardize benchmark profiles - - Enhance performance regression testing by embedding sampling configuration - (Criterion settings and Cargo profile) into baseline files. This enables - automatic detection of configuration mismatches during comparisons. - Standardize benchmarking scripts on the trusted perf profile and update - developer guidelines for naming conventions and local imports. - -#### Changed: Enable debug line tables for perf profile and refine validation - - Include `debug = "line-tables-only"` in the perf Cargo profile to - enable source-level profiling. Update the benchmark comparison logic - to ensure that legacy baselines with missing or "Unknown" metadata - trigger configuration mismatch warnings. - -#### Changed: Expand benchmark metadata validation tests - - Update the benchmark utility tests to verify that differences or - omissions in Criterion measurement and warm-up time are correctly - reported in configuration mismatch warnings. - -#### Changed: Enable CodeRabbit request changes workflow - - Enable the request_changes_workflow in the CodeRabbit configuration to - allow the AI reviewer to formally request changes on pull requests. This - ensures that identified issues are explicitly addressed during the - review process rather than appearing as informational comments only. - -- Revise SECURITY.md for clarity and completeness [`bd041fa`](https://github.com/acgetchell/delaunay/commit/bd041fa18456abad59a11088ab8a14e7f399adbe) - -### Documentation - -- Sync documentation with post-v0.7.5 changes [skip ci] [`5fa36aa`](https://github.com/acgetchell/delaunay/commit/5fa36aa67cb99bb3a5781e4c2733c2acec3adea8) - - - Add missing files to code_organization.md directory tree - (debug_env_vars.md, TODO.md, conflict_region_verification.rs, - regression_issue_306.rs) - - - Add delaunayize_repair example to README.md examples list - - Document new test files in tests/README.md (delaunayize_workflow, - conflict_region_verification, regression_issue_306) - - - Update docs/TODO.md: mark completed items (#288, #302, #306/#307), - refresh next-release candidates - -- Clarify research scope and changelog hygiene [#344](https://github.com/acgetchell/delaunay/pull/344) - [`f46b7ae`](https://github.com/acgetchell/delaunay/commit/f46b7ae1e64734e441854e9868fae73d5d503c68) - - - Refresh README research positioning with current scope, non-goals, - predicate limits, and documentation links. - - - Add current limitations and roadmap docs, and archive stale 4D known - issues and TODO snapshots. - - - Update stale module/workflow references across docs and regenerate the - active and archived changelogs. - - - Teach changelog post-processing to render squash-body pseudo-headings as - prose, with tests covering the new normalization helpers. - -### Fixed - -- Handle geometric degeneracy gracefully in profiling benchmarks - [`3532624`](https://github.com/acgetchell/delaunay/commit/3532624ed1d669d215b2df2bbcea49236b720d10) - - - Replace .unwrap() on triangulation build with graceful error handling - across all benchmark functions in profiling_suite.rs - - - Scaling and memory benchmarks skip iterations that hit degeneracy - - Query latency and algorithmic bottleneck benchmarks skip entries when - setup construction fails - - - Fixes CI panic: GeometricDegeneracy during 3D memory profiling with - 10,000 random points (seed 42) - -- Unify flip-repair and retry constants across build profiles [#306](https://github.com/acgetchell/delaunay/pull/306) - [#319](https://github.com/acgetchell/delaunay/pull/319) [`14f0d16`](https://github.com/acgetchell/delaunay/commit/14f0d16b7de52d25d64e7d1fb810b82817e5d7b6) - - Several flip-repair and construction-retry constants were split by - cfg(any(test, debug_assertions)), causing release builds to fail on - valid 3D inputs that debug/test builds handled correctly. - - Primary fix: RetryPolicy::default() was Disabled in release but - DebugOnlyShuffled { attempts: 6 } in debug/test. When the initial - Hilbert-ordered insertion hits a co-spherical flip cycle, shuffled - retries find a working vertex ordering. Without retries, the first - failure was fatal. Changed to Shuffled { attempts: 6 } unconditionally. - - Secondary fixes in flips.rs: - - - Unify MAX_REPEAT_SIGNATURE to 128 (was 32 in release) - - Unify default_max_flips 3D multiplier to 8x (was 4x in release) - - Make is_connected() postcondition check unconditional - - Also in delaunay.rs: - - - Unify HEURISTIC_REBUILD_ATTEMPTS to 6 (was 2 in release) - - Remove cfg-gated DELAUNAY_SHUFFLE_ATTEMPTS constant - -#### Fixed: Enable construction retries in release builds by default - - Update RetryPolicy::default() to return Shuffled retries in all build - profiles. Previously, retries were disabled in release mode, causing - fatal construction failures on 3D configurations that required - alternative vertex insertion orders to converge. This change ensures - consistent behavior between debug and release builds and includes a - regression test for the reported failure case. - -- Periodic-aware Delaunay verification (Level 4) for toroidal tria… [#333](https://github.com/acgetchell/delaunay/pull/333) - [`7c788aa`](https://github.com/acgetchell/delaunay/commit/7c788aa1a7e3b2a94a53193d8d5894718b6afa07) - -#### Fixed: Periodic-aware Delaunay verification (Level 4) for toroidal triangulations [#315](https://github.com/acgetchell/delaunay/pull/315) - -- Thread GlobalTopologyModelAdapter through all flip-predicate evaluation - functions (k=2 facets, k=3 ridges, and their inverses) so insphere - predicates use lifted coordinates for periodic topologies. - -- Add verify_delaunay_for_triangulation() as the preferred topology-aware - Level 4 entry point; is_delaunay_via_flips() now delegates to it. - -- Add periodic lifting helpers: vertices_to_points_with_optional_lift, - vertex_point_lifted_into_cell, align_periodic_offset, and supporting - functions for offset lookup, validation, and cross-cell alignment. - -- Repair paths continue to use GlobalTopology::DEFAULT (non-periodic), - which is correct since flip repair runs during construction. - -- Add integration test reproducing the issue: toroidal_periodic 2D - triangulation now passes dt.validate() (Levels 1–4). - -- Add doctest for verify_delaunay_for_triangulation. - -- Add unit tests for align_periodic_offset (identity, delta shifts, - higher-dimension, overflow). - -#### Fixed: Use reference frames for periodic inverse predicates in flip repair - - Update Delaunay violation predicates to accept an optional frame cell, - ensuring coordinate lifting remains consistent for inverse k=2 and k=3 - moves. This prevents verification failures in toroidal triangulations - where inverse simplices lack a direct matching cell in the removal - buffer. Additionally, document the intent and invariants of internal - functions across the flip and construction modules to align with - updated developer guidelines. - -- Orient Delaunay repair replacement cells [#307](https://github.com/acgetchell/delaunay/pull/307) [#336](https://github.com/acgetchell/delaunay/pull/336) - [`68deb62`](https://github.com/acgetchell/delaunay/commit/68deb6212a0860cd85776744d29ba7e76f368579) - - - Build flip replacement cell order from oriented cavity-boundary constraints. - - Keep raw bistellar flips topology-oriented while requiring positive replacement geometry for Delaunay repair. - - Canonicalize bulk repair results before continuing construction. - - Add a 4D regression test for the issue #307 bulk construction failure. - - Document branch naming conventions for contributors and agents. - -#### Fixed: Harden flip repair invariants and PR quality gates - -- Reject periodic external cells when replacement-cell parity constraints cannot be preserved. -- Canonicalize after D>=4 bulk repair failures before continuing with later insertions. -- Consolidate fixed-bug regression coverage into tests/regressions.rs and document the pattern. -- Narrow CodeQL/Codacy code scanning noise while keeping curated PR quality feedback via Codacy and CodeRabbit. -- Stage repository-owned Semgrep rules for future cleanup without enabling broad default rule packs. - -#### Changed: Cover flip repair checks and quality tooling - -- Add focused coverage for replacement-cell orientation helper error paths and D>=4 bulk-repair canonicalization branches. -- Strengthen the #307 regression with a longer 4D prefix and explicit geometric-orientation validation. -- Add an opt-in `just semgrep` workflow, pin Semgrep in uv dev dependencies, and refresh Python tool versions. -- Clarify CodeRabbit/Codacy quality-scan documentation and workflow labels. -- Preserve profiling benchmark rustflags behavior under setup-rust-toolchain. -- Preserve fallback rebuild cell data [#305](https://github.com/acgetchell/delaunay/pull/305) [#346](https://github.com/acgetchell/delaunay/pull/346) - [`7e42be8`](https://github.com/acgetchell/delaunay/commit/7e42be8fba9abe571d0137710fbd7ed0151ebc85) - - - Restore cell payloads during delaunayize fallback rebuilds when a rebuilt cell matches exactly one original vertex UUID signature. - - Treat duplicate original cell signatures as ambiguous, even when their payloads are identical. - - Preserve typed snapshot, rebuild, and restore errors for debuggable fallback failure paths. - - Expose delaunayize error payload types through the focused workflow prelude and add normal-type coverage. - - Document fallback cell-data preservation and refresh related test/docs utility updates. - -### Maintenance - -- Bump pytest in the uv group across 1 directory [#322](https://github.com/acgetchell/delaunay/pull/322) - [`c5e3c3b`](https://github.com/acgetchell/delaunay/commit/c5e3c3bb35c94add75dc1550860b77a0a7e01f32) - - Bumps the uv group with 1 update in the / directory: [pytest](https://github.com/pytest-dev/pytest). - - Updates `pytest` from 8.4.2 to 9.0.3 - - - [Release notes](https://github.com/pytest-dev/pytest/releases) - - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - - [Commits](https://github.com/pytest-dev/pytest/compare/8.4.2...9.0.3) - ---- - - updated-dependencies: - -- dependency-name: pytest - dependency-version: 9.0.3 - dependency-type: direct:development - dependency-group: uv - ... - -- Bump actions/github-script from 8.0.0 to 9.0.0 [#320](https://github.com/acgetchell/delaunay/pull/320) - [`80f5984`](https://github.com/acgetchell/delaunay/commit/80f5984dbe45535226a26a47b2f3eb509b0b9f88) - - Bumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0. - - - [Release notes](https://github.com/actions/github-script/releases) - - [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3) - ---- - - updated-dependencies: - -- dependency-name: actions/github-script - dependency-version: 9.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - -- Bump taiki-e/install-action from 2.73.0 to 2.75.9 [#321](https://github.com/acgetchell/delaunay/pull/321) - [`d9fa322`](https://github.com/acgetchell/delaunay/commit/d9fa322eda20cbb4f9b35f3db954618072905613) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.73.0 to 2.75.9. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/7a562dfa955aa2e4d5b0fd6ebd57ff9715c07b0b...d0f23220b09a75c6db730f13bb37c4f8144b4382) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.75.9 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump actions-rust-lang/setup-rust-toolchain [#328](https://github.com/acgetchell/delaunay/pull/328) - [`b8222f5`](https://github.com/acgetchell/delaunay/commit/b8222f505e7b7980f228d3f75eed3ffcabb43c0e) - - Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.4 to 1.16.0. - - - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/150fca883cd4034361b621bd4e6a9d34e5143606...2b1f5e9b395427c92ee4e3331786ca3c37afe2d7) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.16.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump astral-sh/setup-uv from 8.0.0 to 8.1.0 [#325](https://github.com/acgetchell/delaunay/pull/325) - [`dc6b5eb`](https://github.com/acgetchell/delaunay/commit/dc6b5ebbfdf4340ad76c96178024c7e076f1ae8d) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/cec208311dfd045dd5311c1add060b2062131d57...08807647e7069bb48b6ef5acd8ec9567f424441b) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 8.1.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump taiki-e/install-action from 2.75.9 to 2.75.18 [#326](https://github.com/acgetchell/delaunay/pull/326) - [`f14b760`](https://github.com/acgetchell/delaunay/commit/f14b7607b76a7914c31556295005c7b7559932f4) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.9 to 2.75.18. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/d0f23220b09a75c6db730f13bb37c4f8144b4382...055f5df8c3f65ea01cd41e9dc855becd88953486) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.75.18 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump actions/setup-node from 6.3.0 to 6.4.0 [#327](https://github.com/acgetchell/delaunay/pull/327) - [`7de0dc1`](https://github.com/acgetchell/delaunay/commit/7de0dc18fddf65d00fa218361e01d727a71aeefa) - - Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.3.0 to 6.4.0. - - - [Release notes](https://github.com/actions/setup-node/releases) - - [Commits](https://github.com/actions/setup-node/compare/53b83947a5a98c8d113130e565377fae1a50d02f...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e) - ---- - - updated-dependencies: - -- dependency-name: actions/setup-node - dependency-version: 6.4.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... -- Adopt Rust 1.95.0 MSRV [#330](https://github.com/acgetchell/delaunay/pull/330) - [`d0c53d9`](https://github.com/acgetchell/delaunay/commit/d0c53d95e748bac33e079a4256222b7bff7fad53) - - Bump MSRV from 1.94 to 1.95 and adopt stabilized features where - they fit. Coordinates with la-stack 0.4.0 -> 0.4.1, which also - requires 1.95. - - Toolchain and docs: - - - Cargo.toml (rust-version), rust-toolchain.toml (channel) and - clippy.toml (msrv) all set to 1.95. - - - AGENTS.md and CONTRIBUTING.md MSRV references refreshed; - AGENTS.md Design Principles section expanded. - - - CITATION.cff caught up to 0.7.5. - - la-stack bumped 0.4.0 -> 0.4.1 in Cargo.toml / Cargo.lock. -- Switch coverage reporting to cargo-llvm-cov [#345](https://github.com/acgetchell/delaunay/pull/345) - [`b5fb221`](https://github.com/acgetchell/delaunay/commit/b5fb22134a07b28b40b45ef8484a4f0c79e4d61e) - - - Replace tarpaulin coverage commands with cargo-llvm-cov for local HTML and CI Cobertura reports. - - Update Codecov workflow setup, caching, validation, and coverage documentation for the new toolchain. - - Add GitHub issue templates and clarify private vulnerability reporting guidance. - - Tighten Python lint/typecheck settings and clean up benchmark/changelog utility diagnostics. - - Add changelog post-processing coverage for version-heading reset behavior. - -## [0.7.5] - 2026-04-10 - -### ⚠️ Breaking Changes - -- Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) - -### Merged Pull Requests - -- V0.7.5 cleanup — impl-block split, builder decomposition, p… [#311](https://github.com/acgetchell/delaunay/pull/311) -- Add diagnostic infrastructure for v0.7.6 investigation (#306, #… [#309](https://github.com/acgetchell/delaunay/pull/309) -- Bump taiki-e/install-action from 2.70.2 to 2.73.0 [#308](https://github.com/acgetchell/delaunay/pull/308) -- Add MVP delaunayize-by-flips workflow [#227](https://github.com/acgetchell/delaunay/pull/227) [#303](https://github.com/acgetchell/delaunay/pull/303) -- Add explicit construction from vertices and cells [#293](https://github.com/acgetchell/delaunay/pull/293) - [#301](https://github.com/acgetchell/delaunay/pull/301) -- Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) -- Bump pygments from 2.19.2 to 2.20.0 [#298](https://github.com/acgetchell/delaunay/pull/298) -- Bump astral-sh/setup-uv from 7.6.0 to 8.0.0 [#297](https://github.com/acgetchell/delaunay/pull/297) -- Bump taiki-e/install-action from 2.69.6 to 2.70.2 [#296](https://github.com/acgetchell/delaunay/pull/296) -- Bump codecov/codecov-action from 5.5.3 to 6.0.0 [#295](https://github.com/acgetchell/delaunay/pull/295) -- Bump the dependencies group with 3 updates [#294](https://github.com/acgetchell/delaunay/pull/294) - -### Added - -- Add explicit construction from vertices and cells [#293](https://github.com/acgetchell/delaunay/pull/293) - [#301](https://github.com/acgetchell/delaunay/pull/301) [`458ebae`](https://github.com/acgetchell/delaunay/commit/458ebae0fbbd6c5142f88d24c4ff254f058f9285) - - - Introduce `DelaunayTriangulationBuilder::from_vertices_and_cells` for - combinatorial construction bypassing Delaunay insertion - - - Add `build_explicit` path that constructs a TDS directly from given - vertices and cell index lists, with adjacency and orientation repair - - - Define `ExplicitConstructionError` enum with `IndexOutOfBounds`, - `InvalidCellArity`, `DuplicateVertexInCell`, `EmptyCells`, and - `IncompatibleTopology` variants - - - Wire `ExplicitConstruction` variant into - `DelaunayTriangulationConstructionError` - - - Expose `assign_neighbors` as `pub(crate)` in the TDS - - Add comprehensive integration tests for explicit construction across - 2D/3D, round-trip fidelity, error cases, and topology guarantees - -#### Changed: Refine explicit construction validation and error reporting - - Update the triangulation builder to return specific ValidationFailed - errors when structural invariants are violated. Refine the Delaunay - property check in the validation suite to use flip-based verification - for more precise error reporting. Expand the test suite to cover 3D - round-trip fidelity, non-manifold topology errors, and vertex data - consistency during explicit construction. - -- Add MVP delaunayize-by-flips workflow [#227](https://github.com/acgetchell/delaunay/pull/227) [#303](https://github.com/acgetchell/delaunay/pull/303) - [`0370070`](https://github.com/acgetchell/delaunay/commit/037007076e20728f0b23e528c89c783a1f5d2a70) - - Add a public `delaunayize_by_flips` entrypoint that performs bounded - deterministic topology repair followed by flip-based Delaunay repair, - with an optional fallback rebuild from the vertex set. - - New files: - - - src/core/algorithms/pl_manifold_repair.rs: pub(crate) bounded - facet over-sharing repair (iterative worst-quality cell removal) - - - src/triangulation/delaunayize.rs: public API with DelaunayizeConfig, - DelaunayizeOutcome, DelaunayizeError, and delaunayize_by_flips() - - - tests/delaunayize_workflow.rs: 13 integration tests covering - success paths, fallback behavior, determinism, error variants, - and flip-then-repair round-trip - - Other changes: - - - Box DelaunayRepairDiagnostics in NonConvergent variant to keep - DelaunayRepairError small (eliminates downstream boxing) - - - Wire modules in src/lib.rs with self-contained prelude at - prelude::triangulation::delaunayize - - - Re-export PlManifoldRepairStats, PlManifoldRepairError, and - DelaunayRepairStats from the delaunayize module - - - Update docs/api_design.md and docs/code_organization.md - -#### Changed: Allow manifold repair to proceed on over-shared facets - - Refactor `repair_facet_oversharing` to use partial structural pre-checks - rather than full validation, as the latter rejects over-shared facets - before repair can occur. Expand test coverage for budget exhaustion, - cell removal logic, and repair determinism. - -- Add diagnostic infrastructure for v0.7.6 investigation (#306, #… [#309](https://github.com/acgetchell/delaunay/pull/309) - [`b25dff3`](https://github.com/acgetchell/delaunay/commit/b25dff390f27bc8b34ec99fa0c45a6163b6fd723) - -#### Added: Add diagnostic infrastructure for v0.7.6 investigation (#306, #307) - -- Enhance conflict-region verifier with neighbor-reachability analysis -- Add BFS boundary logging to find_conflict_region -- Add orientation tracing and post-insertion audit (DELAUNAY_DEBUG_ORIENTATION) -- Add cell creation provenance logging to fill_cavity -- Re-export diagnostic types (DelaunayRepairDiagnostics, etc.) in prelude -- Create comprehensive debug env var reference (docs/dev/debug_env_vars.md) - -### Changed - -- [**breaking**] Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) - [`71cca10`](https://github.com/acgetchell/delaunay/commit/71cca109607c66fb8af62b3e427078458bcef66d) - - - More ergonomic: callers pass a key directly instead of looking up and - borrowing the full Vertex struct - - - More efficient: O(1) key dereference replaces UUID-based lookup - - Consistent with set_vertex_data, set_cell_data, and the Edit API which - all use keys - - - Aligned with the stated API design in docs/api_design.md - - Simplifies internal callers in flips.rs (remove get+copy+remove - pattern) and builder.rs (eliminate intermediate vertex copies) - - - Add stale-key idempotency test for the new VertexKey API -- V0.7.5 cleanup — impl-block split, builder decomposition, p… [#311](https://github.com/acgetchell/delaunay/pull/311) - [`5bf5c81`](https://github.com/acgetchell/delaunay/commit/5bf5c8192b378d320d35f0a074a57f5b7e8170ff) - -#### Changed: V0.7.5 cleanup — impl-block split, builder decomposition, prelude guidance, re-enable 3D proptests - -- Split monolithic DelaunayTriangulation impl block into 6 trait-minimal - blocks per #302 (ScalarAccumulative only where needed) -- Decompose search_closed_2d_selection: extract ClosedSelectionDfs struct - and sort_candidates_by_rarity_and_domain helper, remove clippy suppressions -- Add "Which import do I need?" prelude guidance table to lib.rs -- Re-enable 43 previously-ignored 3D proptests (all <1s in release mode) -- Audit doctests for builder migration (no changes needed; deferred to #214) -- Update internal performance results for v0.7.5 [`76b2ff7`](https://github.com/acgetchell/delaunay/commit/76b2ff7c4409a8bfa8aa6b9f5362a3dfb8b67999) - - Refresh the performance documentation with updated benchmark metrics, - timestamps, and commit references to align with the v0.7.5 release. - -### Documentation - -- Update KNOWN_ISSUES_4D.md with #204 debug run findings [`87d3054`](https://github.com/acgetchell/delaunay/commit/87d3054a3d722029aeedf881f00caeec1bd7e639) - - - 3D: minimal failing prefix is 35 vertices (previously ~130+) - - 3D: flip cycles confirmed NOT predicate-related (ambiguous=0) - - 4D: negative-orientation cell causes 88% vertex skip rate - - Add release-mode reproduction commands - - Update recommendations section - - Filed follow-up issues #306 and #307 - -### Maintenance - -- Bump pygments from 2.19.2 to 2.20.0 [#298](https://github.com/acgetchell/delaunay/pull/298) - [`6228a59`](https://github.com/acgetchell/delaunay/commit/6228a5990cfe38e711cafd2ce851bc3c9494ddc3) - - Bumps [pygments](https://github.com/pygments/pygments) from 2.19.2 to 2.20.0. - - - [Release notes](https://github.com/pygments/pygments/releases) - - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) - - [Commits](https://github.com/pygments/pygments/compare/2.19.2...2.20.0) - ---- - - updated-dependencies: - -- dependency-name: pygments - dependency-version: 2.20.0 - dependency-type: indirect - ... - -- Bump the dependencies group with 3 updates [#294](https://github.com/acgetchell/delaunay/pull/294) - [`4b3ccb3`](https://github.com/acgetchell/delaunay/commit/4b3ccb3da6827bd63b3c76219ea32a1cb5029b64) - - Bumps the dependencies group with 3 updates: [rustc-hash](https://github.com/rust-lang/rustc-hash) , - [ordered-float](https://github.com/reem/rust-ordered-float) and [uuid](https://github.com/uuid-rs/uuid) . - - Updates `rustc-hash` from 2.1.1 to 2.1.2 - - - [Changelog](https://github.com/rust-lang/rustc-hash/blob/master/CHANGELOG.md) - - [Commits](https://github.com/rust-lang/rustc-hash/compare/v2.1.1...v2.1.2) - - Updates `ordered-float` from 5.2.0 to 5.3.0 - - - [Release notes](https://github.com/reem/rust-ordered-float/releases) - - [Commits](https://github.com/reem/rust-ordered-float/compare/v5.2.0...v5.3.0) - - Updates `uuid` from 1.22.0 to 1.23.0 - - - [Release notes](https://github.com/uuid-rs/uuid/releases) - - [Commits](https://github.com/uuid-rs/uuid/compare/v1.22.0...v1.23.0) - ---- - - updated-dependencies: - -- dependency-name: rustc-hash - dependency-version: 2.1.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: ordered-float - dependency-version: 5.3.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - -- dependency-name: uuid - dependency-version: 1.23.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - -- Bump codecov/codecov-action from 5.5.3 to 6.0.0 [#295](https://github.com/acgetchell/delaunay/pull/295) - [`420a1c5`](https://github.com/acgetchell/delaunay/commit/420a1c50a8e34b6b02ba4b64e460a6d9c6ae30c5) - - Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.3 to 6.0.0. - - - [Release notes](https://github.com/codecov/codecov-action/releases) - - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/codecov/codecov-action/compare/1af58845a975a7985b0beb0cbe6fbbb71a41dbad...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 6.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - -- Bump astral-sh/setup-uv from 7.6.0 to 8.0.0 [#297](https://github.com/acgetchell/delaunay/pull/297) - [`0a0c539`](https://github.com/acgetchell/delaunay/commit/0a0c539c743afc5919b3ab6af55f4cec5d780280) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.6.0 to 8.0.0. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/37802adc94f370d6bfd71619e3f0bf239e1f3b78...cec208311dfd045dd5311c1add060b2062131d57) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 8.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - -- Bump taiki-e/install-action from 2.69.6 to 2.70.2 [#296](https://github.com/acgetchell/delaunay/pull/296) - [`0ab08a7`](https://github.com/acgetchell/delaunay/commit/0ab08a76c46117e633741653bf3e0ab6449671f6) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.69.6 to 2.70.2. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/06203676c62f0d3c765be3f2fcfbebbcb02d09f5...e9e8e031bcd90cdbe8ac6bb1d376f8596e587fbf) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.70.2 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump taiki-e/install-action from 2.70.2 to 2.73.0 [#308](https://github.com/acgetchell/delaunay/pull/308) - [`839877f`](https://github.com/acgetchell/delaunay/commit/839877f6db184e766fc9f4e3515b5fee3e70918f) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.70.2 to 2.73.0. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/e9e8e031bcd90cdbe8ac6bb1d376f8596e587fbf...7a562dfa955aa2e4d5b0fd6ebd57ff9715c07b0b) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.73.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -## [0.7.4] - 2026-03-27 - -### ⚠️ Breaking Changes - -- Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) -- Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) - [#290](https://github.com/acgetchell/delaunay/pull/290) - -### Merged Pull Requests - -- Release v0.7.4 [#291](https://github.com/acgetchell/delaunay/pull/291) -- Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) - [#290](https://github.com/acgetchell/delaunay/pull/290) -- Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) -- Add set_vertex_data and set_cell_data methods [#284](https://github.com/acgetchell/delaunay/pull/284) [#285](https://github.com/acgetchell/delaunay/pull/285) - -### Added - -- Add set_vertex_data and set_cell_data methods [#284](https://github.com/acgetchell/delaunay/pull/284) [#285](https://github.com/acgetchell/delaunay/pull/285) - [`b398d54`](https://github.com/acgetchell/delaunay/commit/b398d5467114610053902a141980f3583eb71aec) - - - Add `set_vertex_data` and `set_cell_data` to `Tds` for O(1) mutation - of auxiliary vertex/cell data without affecting geometry or topology - - - Add convenience wrappers on `Triangulation` and `DelaunayTriangulation` - that delegate to the TDS methods without invalidating caches - - - All doctests use `prelude::triangulation::*` to demonstrate idiomatic - imports including `DelaunayTriangulationBuilder::from_vertices` - - - 9 unit tests covering replacement, no-data vertices, invalid keys, - invariant preservation, multi-key mutation, and locate-hint stability - - - Add `set_vertex_data` and `set_cell_data` to `Tds` accepting - `Option<U>` / `Option<V>` for setting or clearing auxiliary data - in O(1) without affecting geometry or topology - - - Add convenience wrappers on `Triangulation` and `DelaunayTriangulation` - that delegate to the TDS methods without invalidating caches - - - All doctests use `prelude::triangulation::*` and demonstrate both - setting and clearing data paths - - - 11 unit tests covering Tds basics, Triangulation wrappers, invariant - preservation, multi-key mutation, clearing, and locate-hint stability - -### Changed - -- [**breaking**] Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) - [`07f1565`](https://github.com/acgetchell/delaunay/commit/07f15658aac65e5cce3ecb3b7172502305173b95) - - - Change `Vertex::data` and `Cell::data` from `pub` to `pub(crate)` - - Add `const fn data() -> Option<&U>` accessor on `Vertex` and - `const fn data() -> Option<&V>` accessor on `Cell` - - - Update struct-level doc comments with `data()` / `set_vertex_data` - / `set_cell_data` cross-references - - - Update all external-facing doctests and integration tests to use - the new accessor -- [**breaking**] Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) - [#290](https://github.com/acgetchell/delaunay/pull/290) [`7694a3e`](https://github.com/acgetchell/delaunay/commit/7694a3effba4eefb53238d15323e76452eec56ea) - - - Move `new()` from the `<f64, (), D>` impl to `<f64, U, D>` so it - accepts any vertex data type — U is inferred from the vertex slice - - - Deprecate `from_vertices()` (now redundant for f64 vertices) - - Migrate all `from_vertices` call sites to `new` - - Fix type-inference regression in NaN test by annotating VertexBuilder -- Release v0.7.4 [#291](https://github.com/acgetchell/delaunay/pull/291) - [`bee1b04`](https://github.com/acgetchell/delaunay/commit/bee1b0409f19631775cbe5bfd1b0618e54380c46) - - - chose(release): release v0.7.4 - - - Bump version to v0.7.4 - - Update changelog with latest changes - - Update documentation for release - - Add performance results for v0.7.4 - -#### Changed: Clarify adaptive_tolerance_insphere delegation in 4D docs - - Update the documentation for provable error bounds to clarify that the - `adaptive_tolerance_insphere` wrapper function remains available but now - delegates entirely to the provable `insphere_from_matrix` path. - -### Fixed - -- Fix keyword validation and add publish-check recipe [`676df6b`](https://github.com/acgetchell/delaunay/commit/676df6b36d1ba78a17388baea685f0b4b082a844) - - - Replace `computational-geometry` keyword with `geometry` (crates.io - enforces a 20-character limit) - - - Add `just publish-check` recipe that validates crates.io metadata - (keywords, categories, description) and runs `cargo publish --dry-run` - - - Add publish-check to RELEASING.md Step 1.3 so metadata issues are - caught in the release PR, not at publish time - - - Remove redundant dry-run from RELEASING.md Step 2.7 - -## [0.7.3] - 2026-03-24 - -### ⚠️ Breaking Changes - -- Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) - [#251](https://github.com/acgetchell/delaunay/pull/251) - -- Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) - [#255](https://github.com/acgetchell/delaunay/pull/255) - -- Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) - -- Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) - [#277](https://github.com/acgetchell/delaunay/pull/277) - -- Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) - [#260](https://github.com/acgetchell/delaunay/pull/260) - -- Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) [#265](https://github.com/acgetchell/delaunay/pull/265) - -- Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) - -### Merged Pull Requests - -- Simplify trait bounds and re-export secondary maps [#282](https://github.com/acgetchell/delaunay/pull/282) -- Bump codecov/codecov-action from 5.5.2 to 5.5.3 [#280](https://github.com/acgetchell/delaunay/pull/280) -- Bump taiki-e/install-action from 2.68.34 to 2.69.6 [#279](https://github.com/acgetchell/delaunay/pull/279) -- Bump arc-swap from 1.8.2 to 1.9.0 in the dependencies group [#278](https://github.com/acgetchell/delaunay/pull/278) -- Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) - [#277](https://github.com/acgetchell/delaunay/pull/277) -- Add progressive scale-invariant perturbation [#209](https://github.com/acgetchell/delaunay/pull/209) [#274](https://github.com/acgetchell/delaunay/pull/274) -- Add ExactPredicates marker trait for flip repair type safety (#… [#273](https://github.com/acgetchell/delaunay/pull/273) -- Identity-based SoS perturbation via canonical vertex ordering (… [#272](https://github.com/acgetchell/delaunay/pull/272) -- Bump astral-sh/setup-uv from 7.3.1 to 7.5.0 [#271](https://github.com/acgetchell/delaunay/pull/271) -- Bump actions-rust-lang/setup-rust-toolchain [#270](https://github.com/acgetchell/delaunay/pull/270) -- Bump taiki-e/install-action from 2.68.25 to 2.68.33 [#269](https://github.com/acgetchell/delaunay/pull/269) -- Bump tracing-subscriber in the dependencies group [#268](https://github.com/acgetchell/delaunay/pull/268) -- Bump actions/download-artifact from 8.0.0 to 8.0.1 [#267](https://github.com/acgetchell/delaunay/pull/267) -- Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) [#265](https://github.com/acgetchell/delaunay/pull/265) -- Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) -- Canonicalize positive orientation after bulk construction repair… [#261](https://github.com/acgetchell/delaunay/pull/261) -- Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) - [#260](https://github.com/acgetchell/delaunay/pull/260) -- Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) - [#255](https://github.com/acgetchell/delaunay/pull/255) -- Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) - [#251](https://github.com/acgetchell/delaunay/pull/251) -- Replace panicking calls with error propagation [#242](https://github.com/acgetchell/delaunay/pull/242) [#250](https://github.com/acgetchell/delaunay/pull/250) -- Replace derive_builder with hand-written VertexBuilder [#212](https://github.com/acgetchell/delaunay/pull/212) - [#249](https://github.com/acgetchell/delaunay/pull/249) -- Archive completed changelog minor series into per-minor files [#248](https://github.com/acgetchell/delaunay/pull/248) -- Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) - -### Added - -- Archive completed changelog minor series into per-minor files [#248](https://github.com/acgetchell/delaunay/pull/248) - [`45e4781`](https://github.com/acgetchell/delaunay/commit/45e47818b93b87aa2c0970d3bf7da0159d299cf1) - - Add archive_changelog.py to split CHANGELOG.md by minor series: - - - Parse version blocks, group by X.Y minor key, write completed - minors to docs/archive/changelog/X.Y.md (0.2–0.6) - - - Extract and distribute git-cliff reference-style link definitions - so each output file contains only its own version defs (fixes MD053) - - - Keep Unreleased + active minor (0.7) in root CHANGELOG.md with an - Archives link section; root shrinks from ~4,000 to ~1,400 lines - - - Pipeline is idempotent: repeated runs produce no diff - - Update tag_release.py to fall back to archive files when a requested - version is no longer in the root changelog (extract_changelog_section - and _github_anchor both search docs/archive/changelog/X.Y.md). - - Register archive-changelog CLI entry point in pyproject.toml and wire - it into the justfile changelog recipe after postprocess-changelog. - - Add 24 tests covering parsing, grouping, link-def distribution, - archive writing, idempotency, and tag_release archive fallback. - - Other changes: - - - Sort justfile recipes in lexicographic order - - Update docs/code_organization.md tree (new files, fix NBSP encoding) - - Update AGENTS.md, README.md, RELEASING.md with archive references - - Exclude docs/archive/changelog/** from typos checks -- [**breaking**] Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) - [#251](https://github.com/acgetchell/delaunay/pull/251) [`6ed6f88`](https://github.com/acgetchell/delaunay/commit/6ed6f889b6bd2df7d263d4aae108823ebb71b608) - - - New `src/geometry/sos.rs` with dimension-generic SoS tie-breaking - - `sos_orientation_sign<D>()` for degenerate orientation predicates - - `sos_insphere_sign<D>()` for co-spherical insphere predicates - - Two-stage exact det sign: `det_errbound()` fast filter + Bareiss exact - - 18 unit tests covering 2D–5D degenerate configurations - - No coordinate modification — purely a decision rule - - Part of AdaptiveKernel implementation (B2 of #233). -- [**breaking**] Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) - [#255](https://github.com/acgetchell/delaunay/pull/255) [`faf84de`](https://github.com/acgetchell/delaunay/commit/faf84ded97e8343fd36292d38b051be9df39c353) - - Remove the `use_robust_on_ambiguous` flag and `robust_insphere_sign()` - fallback from flip repair. With AdaptiveKernel providing exact+SoS - predicates, the old tolerance-based override was the root cause of - flip-repair non-convergence. - - - Remove override blocks in k2/k3 violation functions - - Remove `both_positive_artifact` workaround - - Simplify repair attempts from 3 to 2 (FIFO then LIFO) - - Remove `used_robust_predicates` from `DelaunayRepairDiagnostics` - - Fix pre-existing clippy `match_same_arms` in matrix.rs/measures.rs -- [**breaking**] Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) - [`526b39e`](https://github.com/acgetchell/delaunay/commit/526b39e4c1f634208db9014793806e2e94f9c0ed) - -#### Added: Apply SoS to AdaptiveKernel::orientation() and tolerate degenerate cells [#263](https://github.com/acgetchell/delaunay/pull/263) - -- Apply Simulation of Simplicity to AdaptiveKernel::orientation() so - degenerate ties are broken deterministically (returns ±1 for all - distinct-point inputs, 0 only for identical f64 points) - -- Tolerate degenerate cells (zero exact determinant) in orientation - normalization after flip-based Delaunay repair: - - - promote_cells_to_positive_orientation: skip instead of error - - cells_require_positive_orientation_promotion: skip instead of error - - canonicalize_global_orientation_sign: scan past degenerate cells - - validate_geometric_cell_orientation: only flag negative orientation - -- Add Hilbert-sort preprocessing dedup (Phase 4 in order_vertices_hilbert) - that removes vertices mapping to the same quantized grid cell - -- Add per-cell coordinate uniqueness validation (DuplicateCoordinatesInCell - variant, CellCoordinateUniqueness invariant kind) - -- Document three-layer duplicate vertex handling strategy in - docs/numerical_robustness_guide.md - -- Update convex_hull and quality tests to accept InsufficientVertices - alongside GeometricDegeneracy for extreme-scale dedup inputs - -- Add macro-generated dedup integration tests covering 2D–5D - -#### Added: Normalize SoS orientation callers and harden Hilbert dedup [#263](https://github.com/acgetchell/delaunay/pull/263) - -- Refactor evaluate_cell_orientation_for_context to use robust_orientation - as the sole oracle, removing the duplicate kernel call - -- Add robust_orientation guard in apply_bistellar_flip_with_k to reject - degenerate cells before kernel invocation (fixes 4D perf regression) - -- Switch find_boundary_edge_split_facet to robust_orientation for true - collinearity/degeneracy detection instead of kernel SoS - -- Use robust_orientation sign directly in build_initial_simplex, removing - unused kernel variable and redundant orientation call - -- Extract hilbert_dedup_sorted from order_vertices_hilbert so the - ordering function is pure; apply dedup in - preprocess_vertices_for_construction after Hilbert sort regardless of - DedupPolicy (safety-critical for SoS identical-point failures) - -- Add validate_cell_coordinate_uniqueness to validation_report with - CoordinateScalar bound - -- Fix quantization bits table in numerical_robustness_guide.md (2D/3D - capped at 31 bits, not 64/42) - -- Update rustdoc for cells_require_positive_orientation_promotion to - reflect skip-degenerate semantics - -- Trim inaccurate near-duplicate claim from dedup_batch_construction docs - -- Add SoS identical-points regression tests (2D–5D) verifying - AdaptiveKernel returns 0 when all cofactors vanish - -- Add standalone hilbert_dedup_sorted edge-case tests - -#### Changed: Address review comments for SoS orientation normalization [#263](https://github.com/acgetchell/delaunay/pull/263) - -- Propagate `robust_orientation` errors in `apply_bistellar_flip_with_k` - instead of silently ignoring `Err` via `matches!` - -- Switch `k2_flip_would_create_degenerate_cell` from kernel orientation - to `robust_orientation` so degenerate cells are detected under SoS; - remove unused `kernel` parameter - -- Delegate `AdaptiveKernel::orientation()` to `robust_orientation` for - layers 1+2, eliminating duplicated matrix build + exact_det_sign logic - -- Remove unused `kernel` parameter from `find_boundary_edge_split_facet` - and update call site in `extend_hull` - -- Update stale rustdoc: `validate_geometric_cell_orientation` and - `build_initial_simplex` now reference `robust_orientation` instead of - kernel predicates / `K::default()` - -- Add `vkeys[i] == vkeys[j]` guard in `validate_cell_coordinate_uniqueness` - to avoid misleading error when vertex keys are duplicated - -- Replace broad `assert!(result.is_err())` in all-duplicates test with - precise `InsufficientVertices` match - -- Decouple many-duplicates test from magic `$dim + 2` by using the - helper's returned distinct count - -- Update docs: numerical_robustness_guide, KNOWN_ISSUES_4D, - ORIENTATION_SPEC, validation.md - -#### Changed: Remove unused kernel parameter from flip-application functions [#263](https://github.com/acgetchell/delaunay/pull/263) - -- Replace `K: Kernel<D>` with `T: CoordinateScalar` in 7 functions: - apply_bistellar_flip_with_k, apply_bistellar_flip, - apply_bistellar_flip_dynamic, apply_bistellar_flip_k2/k3/k1, - apply_bistellar_flip_k1_inverse -- Update ~40 call sites across flips.rs, triangulation/flips.rs, - delaunay_triangulation.rs -- Delete ZeroOrientationKernel2d test struct (now redundant) -- Update ORIENTATION_SPEC.md flip pseudocode to match new signatures -- Address review round 3 comments: guard coordinate uniqueness - validation, add #[non_exhaustive] to InvariantKind, extract - generic flip_would_create_degenerate_cell, add nitpick tests - -#### Fixed: Remove Morton and Lexicographic ordering, unconditional Hilbert dedup, strengthen flip assertions - -[#263](https://github.com/acgetchell/delaunay/pull/263) - -- Strengthen assert_context_has_nonzero_robust_orientation to explicitly - fail on Err variants instead of only checking for DEGENERATE - -- Merge hilbert_dedup_sorted into order_vertices_hilbert via - dedup_quantized parameter, eliminating redundant re-quantization - -- Make Hilbert quantized dedup unconditional (not gated on DedupPolicy) - -- Update DedupPolicy docs to frame as performance-tuning knob - -- Remove InsertionOrderStrategy::Morton variant and all supporting code - (~100 lines: morton_bits_per_coord, morton_code, order_vertices_morton) - -- Remove InsertionOrderStrategy::Lexicographic variant and associated - tests; keep internal order_vertices_lexicographic as Hilbert fallback - -- Remove Morton/Lexicographic doc references from README, invariants.md, - numerical_robustness_guide.md, and triangulation_generation.rs - -- Identity-based SoS perturbation via canonical vertex ordering (… [#272](https://github.com/acgetchell/delaunay/pull/272) - [`a125d98`](https://github.com/acgetchell/delaunay/commit/a125d988566bb7196c025212833f3e539665e7de) - -#### Added: Identity-based SoS perturbation via canonical vertex ordering [#266](https://github.com/acgetchell/delaunay/pull/266) - -- Add canonical_points module with sorted_cell_points and - sorted_facet_points_with_extra helpers that sort vertices by - VertexKey identity before resolving to points - -- Update all 5 kernel call sites (locate, flips, triangulation) to - use canonical ordering for consistent SoS tie-breaking - -- Fix misleading error variant in find_conflict_region BFS traversal - (InvalidStartCell → CellDataAccessFailed) - -- Add 6 unit tests including 2D/3D permutation-invariance tests - -#### Added: Identity-based SoS perturbation via canonical vertex ordering [#266](https://github.com/acgetchell/delaunay/pull/266) - -- Add canonical_points module with sorted_cell_points and - sorted_facet_points_with_extra helpers that sort vertices by - VertexKey identity before resolving to points - -- Update all 5 kernel call sites (locate, flips, triangulation) to - use canonical ordering for consistent SoS tie-breaking - -- Fix misleading error variant in find_conflict_region BFS traversal - (InvalidStartCell → CellDataAccessFailed) - -- Document canonical ordering convention in numerical_robustness_guide - -- Add canonical_points.rs to code_organization.md util listing - -- Add 14 new tests: permutation invariance (2D all 6, 3D all 24), - canonical ordering helpers, and error-path coverage for - is_point_outside_facet and find_conflict_region - -#### Changed: Reuse canonical cell ordering for query simplex construction - - Optimize the construction of the query simplex by reusing the - canonical vertex ordering of the cell. This ensures consistent - identity-based SoS perturbation and includes a safety check to - prevent out-of-range facet index access. - -- Add ExactPredicates marker trait for flip repair type safety (#… [#273](https://github.com/acgetchell/delaunay/pull/273) - [`4877151`](https://github.com/acgetchell/delaunay/commit/48771518b2b5a8a6dd9b4036b0903f7c3158b7c9) - -#### Added: Add ExactPredicates marker trait for flip repair type safety [#257](https://github.com/acgetchell/delaunay/pull/257) - -- Define `ExactPredicates` marker trait in `kernel.rs`, implemented for - `AdaptiveKernel` and `RobustKernel` but not `FastKernel` - -- Add `K: ExactPredicates` bound to flip repair entry points in - `flips.rs` and propagate through `delaunay_triangulation.rs`, - `builder.rs`, and `triangulation_generation.rs` - -- Add `compile_fail` doctest asserting `FastKernel` cannot satisfy the - bound, plus positive compile-time assertion tests for the other kernels - -- Update test code to use `AdaptiveKernel` where `DelaunayTriangulation` - construction or flip repair is invoked - -- Document the trait and its design rationale in - `numerical_robustness_guide.md` - -#### Changed: Narrow ExactPredicates bound to public repair methods only [#257](https://github.com/acgetchell/delaunay/pull/257) - -- Remove K: ExactPredicates from ~20 internal, construction, insertion, - and removal methods so FastKernel remains usable for all operations - except explicit Delaunay repair - -- Retain ExactPredicates bound on repair_delaunay_with_flips, - repair_delaunay_with_flips_advanced, and rebuild_with_heuristic - -- Replace run_flip_repair_fallbacks with inline robust-only fallback in - maybe_repair_after_insertion; remove dead code (run_flip_repair_fallbacks, - remap_vertex_key_by_uuid, HeuristicRebuildRecursionGuard::in_progress) - -- Update with_kernel / build_with_kernel docs to note FastKernel is - accepted but exact kernels are recommended - -- Restructure heuristic rebuild test to test_vertex_key_valid_after_explicit_heuristic_rebuild; - remove test_run_flip_repair_fallbacks_smoke_ok_with_local_seed - -#### Fixed: Preserve full fallback-chain context in advanced repair errors [#257](https://github.com/acgetchell/delaunay/pull/257) - -- Restore test_with_kernel_fast_kernel to use FastKernel (regressed when - ExactPredicates bound was added, now possible again after narrowing) - -- Restructure repair_delaunay_with_flips_advanced fallback: when primary, - robust, and heuristic rebuild all fail, the HeuristicRebuildFailed error - now includes context from all three stages instead of losing the robust - fallback error - -- Add test_advanced_repair_fallback_error_preserves_full_chain_context - asserting the composed error message includes primary, robust, and - heuristic failure details - -#### Changed: Remove redundant ScalarSummable where clauses [#257](https://github.com/acgetchell/delaunay/pull/257) - -- Remove 26 redundant `K::Scalar: ScalarSummable` where clauses from - `delaunay_triangulation.rs`; the impl block already bounds - `K::Scalar: ScalarAccumulative` which implies `ScalarSummable` via - blanket impl -- Remove unused `ScalarSummable` import -- Export `ExactPredicates` from `prelude::query` -- Update docs (numerical_robustness_guide, validation, workflows, - api_design) to reflect the narrowed `ExactPredicates` bound on - public repair methods and add `FastKernel` + `EveryN` guidance -- Add tests for non-retryable error pass-through in - `repair_delaunay_with_flips` and `repair_delaunay_with_flips_advanced` - -#### Added: Add test injection for robust-fallback coverage [#257](https://github.com/acgetchell/delaunay/pull/257) - -- Add FORCE_REPAIR_NONCONVERGENT thread-local and test guard -- Inject synthetic NonConvergent errors in repair_delaunay_with_flips - and maybe_repair_after_insertion to exercise robust-fallback paths -- Add tests for advanced robust fallback and insertion robust fallback -- Move test-only helpers into mod tests with pub(super) visibility -- Add progressive scale-invariant perturbation [#209](https://github.com/acgetchell/delaunay/pull/209) [#274](https://github.com/acgetchell/delaunay/pull/274) - [`4c35028`](https://github.com/acgetchell/delaunay/commit/4c35028537b9011d586be3b9b234925e3ca5bb5a) - - - Replace hardcoded perturbation retry count with - DEFAULT_PERTURBATION_RETRIES = 3 (4 total attempts) - - - Apply 10^(attempt-1) progressive scaling factor per retry, - spanning 4 orders of magnitude (e.g. 1e-8 → 1e-5 for f64) - - - Update debug messages with computed max perturbation values - - Update numerical robustness guide documentation - - Add tests for scale invariance, f32 base epsilon, and constant value - - Remove 32 redundant `where K::Scalar: CoordinateScalar` clauses - (implied by impl-level bounds) - -#### Fixed: Correct perturbation exponent off-by-one and improve test coverage [#209](https://github.com/acgetchell/delaunay/pull/209) - -- Fix progressive scale factor: use 10^attempt instead of 10^(attempt-1) - so the retry ladder reaches 1e-5 × local_scale (was capped at 1e-6), - matching the documented "4 orders of magnitude" range - -- Apply the same correction to the debug-message exponent computation - -- Update perturbation ladder in numerical_robustness_guide.md to reflect - the corrected values (1e-7, 1e-6, 1e-5) - -- Replace test_perturbation_f32_base_epsilon with - test_perturbation_epsilon_selection_and_retry: asserts mantissa_digits - for both f32 and f64, exercises insert_transactional with on-edge - near-degenerate points for both scalar types - -- Add absolute expected counts to test_perturbation_scale_invariance_3d - to catch regressions that affect all scales equally - -- Add test_perturbation_retry_and_exhaustion_4d: 4D random points - exercise the progressive retry loop body and exhaustion branch - -- Add test_perturbation_retry_seeded_branch_4d: calls - insert_transactional directly with perturbation_seed != 0 to cover - the seeded sign-selection path - -- [**breaking**] Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) - [#277](https://github.com/acgetchell/delaunay/pull/277) [`0684ec0`](https://github.com/acgetchell/delaunay/commit/0684ec01108cc6a816d5aa5b41179726ee7a51a5) - - Add configurable flip-budget capping, structured debug-harness outcomes, - enriched orientation diagnostics, and a seeded 4D regression test. - - Flip budget enforcement: - - - Move max_flips check before apply_bistellar_flip in all 5 repair - paths (k2, k3, dynamic, inverse) so Some(0) means truly zero flips - - - Change guard from `>` to `>=` to eliminate off-by-one - - Thread max_flips_override through repair_delaunay_with_flips_k2_k3, - the robust fallback, heuristic rebuild, and per-insertion repair - - Capped repair API: - - - Add max_flips: Option<usize> to DelaunayRepairHeuristicConfig - - Mark DelaunayRepairHeuristicConfig #[non_exhaustive] - - Add internal repair_delaunay_with_flips_capped() helper - - Add DELAUNAY_LARGE_DEBUG_REPAIR_MAX_FLIPS env var to debug harness - - Error taxonomy: - - - Add RepairFailed variant to DelaunayTriangulationValidationError for - mutating operations (remove_vertex); fix remove_vertex to use it - instead of VerificationFailed (which is for passive validation) - - Orientation diagnostics: - - - Enrich NegativeOrientation error message with vertex keys - - Add tracing::warn with cell key, UUID, vertex keys, neighbor keys, - and orientation sign for negative-orientation cells - - Debug harness: - - - Return DebugOutcome enum instead of panicking (Success, - ConstructionFailure, SkippedVertices, RepairNonConvergence, - ValidationFailure) - - - Print seed replay command on every abort path - - Add per-chunk insertion rate (pts/s) in progress output - - Harness tests now assert on DebugOutcome::Success - -### Changed - -- Replace panicking calls with error propagation [#242](https://github.com/acgetchell/delaunay/pull/242) [#250](https://github.com/acgetchell/delaunay/pull/250) - [`9d640c3`](https://github.com/acgetchell/delaunay/commit/9d640c378bdefd0043c28970b05b7162c47dc1bf) - - - Add `InternalInconsistency` variant to `TriangulationConstructionError` - for internal bookkeeping failures distinct from geometric degeneracy - - - Replace 5 `.expect()` calls on HashMap lookups in builder.rs periodic - quotient reconstruction with `?` propagation - - - Reclassify 3 additional internal operations (image vertex removal, - neighbor assignment, incident-cell rebuild) from `GeometricDegeneracy` - to `InternalInconsistency` - - - Replace `.expect()` on `initial_points.take()` in - triangulation_generation.rs with error propagation - - - Update doc comment from `# Panics` to `# Errors` - - Add single-quote guidance for gh --body in AGENTS.md -- [**breaking**] Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) - [#260](https://github.com/acgetchell/delaunay/pull/260) [`6764bac`](https://github.com/acgetchell/delaunay/commit/6764bacd7a02a9e7c95c88235b68bfcbc447eae3) - - - Delete RobustPredicateConfig struct and config_presets module - - Remove config parameter from robust_insphere, robust_orientation, - adaptive_tolerance_insphere, and verify_insphere_consistency - - - Simplify RobustKernel to a zero-size type (remove config field and - with_config constructor, derive Default) - - - Remove config threading from flips.rs, delaunay_validation.rs, and - coordinate_conversion_errors.rs - - - Delete tests that only exercised config field values - - Update numerical_robustness_guide.md: document AdaptiveKernel as the - default kernel, remove config_presets references -- [**breaking**] Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) - [#265](https://github.com/acgetchell/delaunay/pull/265) [`99b9810`](https://github.com/acgetchell/delaunay/commit/99b9810c7aeeb91f84efba019bb199da8ee4f87a) - - - Rename TdsValidationError -> TdsError across all source files - - Remove the type alias that bridged the old name - - Update all references in production code, tests, and examples - - Part of error hierarchy orthogonalization (Phase 5) - -#### Changed: Make TriangulationValidationError purely Level 3 [#262](https://github.com/acgetchell/delaunay/pull/262) - - Remove the Tds variant from TriangulationValidationError so it contains - only Level 3 (topology) errors. TDS-level errors now flow through - InvariantError, keeping Levels 1–2 orthogonal from Level 3. - - API changes: - -- is_valid, validate, validate_at_completion, validate_after_insertion - now return InvariantError instead of TriangulationValidationError -- validate_geometric_cell_orientation returns TdsError directly -- remove_vertex returns InvariantError -- Add Tds variant to DelaunayTriangulationValidationError -- TdsMutationError inner field made private; add as_tds_error() and - into_inner() accessors -- Remove From<TdsMutationError> for TriangulationValidationError -- Add From<ManifoldError> for InvariantError -- Simplify trait bounds and re-export secondary maps [#282](https://github.com/acgetchell/delaunay/pull/282) - [`04ea024`](https://github.com/acgetchell/delaunay/commit/04ea024f7091b7f1d9406c48d673e58a07a657d3) - - - Re-export VertexSecondaryMap and CellSecondaryMap in prelude and - prelude::collections; update doc examples to use prelude path - - - Replace ~50 vestigial ScalarSummable bounds with CoordinateScalar - across geometry and core modules (Sum is never called on T) - - - Remove ~34 redundant K::Scalar: CoordinateScalar where clauses - already implied by K: Kernel<D> (associated type bound) - - - Remove 8 redundant [T; D]: Copy + Sized bounds already implied - by T: CoordinateScalar (Float → Copy; arrays are always Sized) - - - Keep ScalarSummable trait definition and blanket impl for future use - -### Fixed - -- Canonicalize positive orientation after bulk construction repair… [#261](https://github.com/acgetchell/delaunay/pull/261) - [`dec8df9`](https://github.com/acgetchell/delaunay/commit/dec8df9f07b5e868825f31a64bee85c4a04e984d) - -#### Fixed: Canonicalize positive orientation after bulk construction repair [#258](https://github.com/acgetchell/delaunay/pull/258) - -- Call normalize_and_promote_positive_orientation() in - finalize_bulk_construction after the flip-repair block and before - topology validation, ensuring the global geometric sign is positive - -- Update #228 regression test to expect PLManifold (was Pseudomanifold) - now that orientation is correctly canonicalized - -#### Changed: Categorize errors during orientation canonicalization - - Distinguish structural `InsertionError` variants as `InternalInconsistency` - to separate algorithmic bugs from input-related `GeometricDegeneracy` - during post-repair orientation canonicalization. Added topology - validation to the issue #228 regression test to ensure manifold parity. - -### Maintenance - -- [**breaking**] Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) - [`1b2af41`](https://github.com/acgetchell/delaunay/commit/1b2af41fcb5115d82c1ae6f0ab66651c075fbd52) - - Replace ~4,000 lines of custom Python changelog generation - (changelog_utils.py, enhance_commits.py) with git-cliff and two - focused scripts (~640 lines total): - - - postprocess_changelog.py: lightweight markdown hygiene - (MD004, MD007, MD012, MD013, MD030, MD031, MD032, MD040) - plus summary section injection (Merged PRs, Breaking Changes) - - - tag_release.py: extract latest version section for git tag messages - - Pipeline changes: - - - cliff.toml: full git-cliff config with conventional commit parsing, - PR auto-linking, and Tera template for Keep a Changelog format - - - justfile: new changelog-update, changelog-tag, changelog recipes - replacing the old generate-changelog workflow - - - Idempotent output: postprocessor matches markdownlint --fix exactly, - so `just changelog-update && just fix` produces zero diff - - Tooling simplification: - - - Remove mypy in favor of ty (Astral) — mypy's permissive config was - catching nothing that ty doesn't already cover - - - Disable markdownlint MD037 (false positives on cron expressions and - glob patterns like saturating_*) -- Replace derive_builder with hand-written VertexBuilder [#212](https://github.com/acgetchell/delaunay/pull/212) - [#249](https://github.com/acgetchell/delaunay/pull/249) [`b017b39`](https://github.com/acgetchell/delaunay/commit/b017b39bc410e96703bc7370972a930b93f6d6be) - - - Add VertexBuilderError enum and VertexBuilder struct with - point(), data(), and build() methods in src/core/vertex.rs - - - Remove #[derive(Builder)] and #[builder(...)] attributes from Vertex - - Remove derive_builder dependency from Cargo.toml and lib.rs - - All ~30 call sites unchanged — builder API is a drop-in replacement -- Bump actions/download-artifact from 8.0.0 to 8.0.1 [#267](https://github.com/acgetchell/delaunay/pull/267) - [`3727781`](https://github.com/acgetchell/delaunay/commit/37277814a118d100bffed0e6fe48953094936280) - - Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 8.0.0 to 8.0.1. - - - [Release notes](https://github.com/actions/download-artifact/releases) - - [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) - ---- - - updated-dependencies: - -- dependency-name: actions/download-artifact - dependency-version: 8.0.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump tracing-subscriber in the dependencies group [#268](https://github.com/acgetchell/delaunay/pull/268) - [`7d355f4`](https://github.com/acgetchell/delaunay/commit/7d355f43418a3bad0da1badf5fde3a19d6306d37) - - Bumps the dependencies group with 1 update: [tracing-subscriber](https://github.com/tokio-rs/tracing). - - Updates `tracing-subscriber` from 0.3.22 to 0.3.23 - - - [Release notes](https://github.com/tokio-rs/tracing/releases) - - [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.22...tracing-subscriber-0.3.23) - ---- - - updated-dependencies: - -- dependency-name: tracing-subscriber - dependency-version: 0.3.23 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - -- Bump taiki-e/install-action from 2.68.25 to 2.68.33 [#269](https://github.com/acgetchell/delaunay/pull/269) - [`f7fb663`](https://github.com/acgetchell/delaunay/commit/f7fb6638c744f76a92325117160a420eb85e3d0b) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.25 to 2.68.33. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/a37010ded18ff788be4440302bd6830b1ae50d8b...cbb1dcaa26e1459e2876c39f61c1e22a1258aac5) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.68.33 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump actions-rust-lang/setup-rust-toolchain [#270](https://github.com/acgetchell/delaunay/pull/270) - [`73b8d63`](https://github.com/acgetchell/delaunay/commit/73b8d63896386e1f17d14e1b10421059d17a79c3) - - Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.3 to 1.15.4. - - - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/a0b538fa0b742a6aa35d6e2c169b4bd06d225a98...150fca883cd4034361b621bd4e6a9d34e5143606) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.15.4 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump astral-sh/setup-uv from 7.3.1 to 7.5.0 [#271](https://github.com/acgetchell/delaunay/pull/271) - [`3225d64`](https://github.com/acgetchell/delaunay/commit/3225d64974cb1d7772cf5cde4be6206578ef2da9) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.1 to 7.5.0. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/5a095e7a2014a4212f075830d4f7277575a9d098...e06108dd0aef18192324c70427afc47652e63a82) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.5.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump arc-swap from 1.8.2 to 1.9.0 in the dependencies group [#278](https://github.com/acgetchell/delaunay/pull/278) - [`da93901`](https://github.com/acgetchell/delaunay/commit/da93901c78a40e8e484e3fb21b117156167ec2a0) - - Bumps the dependencies group with 1 update: [arc-swap](https://github.com/vorner/arc-swap). - - Updates `arc-swap` from 1.8.2 to 1.9.0 - - - [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md) - - [Commits](https://github.com/vorner/arc-swap/compare/v1.8.2...v1.9.0) - ---- - - updated-dependencies: - -- dependency-name: arc-swap - dependency-version: 1.9.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - -- Bump taiki-e/install-action from 2.68.34 to 2.69.6 [#279](https://github.com/acgetchell/delaunay/pull/279) - [`6c7c8b1`](https://github.com/acgetchell/delaunay/commit/6c7c8b190e563f18555cbfee14e8608be1dadeed) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.34 to 2.69.6. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/de6bbd1333b8f331563d54a051e542c7dfef81c3...06203676c62f0d3c765be3f2fcfbebbcb02d09f5) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.69.6 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump codecov/codecov-action from 5.5.2 to 5.5.3 [#280](https://github.com/acgetchell/delaunay/pull/280) - [`47394f3`](https://github.com/acgetchell/delaunay/commit/47394f3543d4cbd2c69f45a6ce0c54814bd33875) - - Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 5.5.3. - - - [Release notes](https://github.com/codecov/codecov-action/releases) - - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...1af58845a975a7985b0beb0cbe6fbbb71a41dbad) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 5.5.3 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -## [0.7.2] - 2026-03-10 - -### Merged Pull Requests - -- Exact insphere predicates with f64 fast filter [#245](https://github.com/acgetchell/delaunay/pull/245) -- Use exact-sign orientation in robust_orientation() [#244](https://github.com/acgetchell/delaunay/pull/244) -- Bump actions/setup-node from 6.2.0 to 6.3.0 [#239](https://github.com/acgetchell/delaunay/pull/239) -- Bump taiki-e/install-action from 2.68.16 to 2.68.25 [#237](https://github.com/acgetchell/delaunay/pull/237) -- Use exact arithmetic for orientation predicates [#235](https://github.com/acgetchell/delaunay/pull/235) - [#236](https://github.com/acgetchell/delaunay/pull/236) -- Switch FastKernel to insphere_lifted and enable LTO [#234](https://github.com/acgetchell/delaunay/pull/234) -- Deduplicate D<4 repair fallback and improve diagnostics [#232](https://github.com/acgetchell/delaunay/pull/232) -- Resolve 3D seeded bulk construction orientation convergence failure [#228](https://github.com/acgetchell/delaunay/pull/228) -- Bump actions-rust-lang/setup-rust-toolchain [#226](https://github.com/acgetchell/delaunay/pull/226) -- Bump taiki-e/install-action from 2.68.8 to 2.68.16 [#225](https://github.com/acgetchell/delaunay/pull/225) -- Bump astral-sh/setup-uv from 7.3.0 to 7.3.1 [#224](https://github.com/acgetchell/delaunay/pull/224) -- Bump actions/upload-artifact from 6 to 7 [#223](https://github.com/acgetchell/delaunay/pull/223) -- Bump actions/download-artifact from 7.0.0 to 8.0.0 [#222](https://github.com/acgetchell/delaunay/pull/222) -- Introduce GlobalTopology behavior model adapter [#221](https://github.com/acgetchell/delaunay/pull/221) -- Enforce coherent orientation as a first-class invariant [#219](https://github.com/acgetchell/delaunay/pull/219) -- Use bulk Hilbert API in order_vertices_hilbert [#218](https://github.com/acgetchell/delaunay/pull/218) -- Improve Hilbert curve correctness and add bulk API [#207](https://github.com/acgetchell/delaunay/pull/207) - [#216](https://github.com/acgetchell/delaunay/pull/216) -- Update docs for DelaunayTriangulationBuilder and toroidal topology [#215](https://github.com/acgetchell/delaunay/pull/215) -- Feat/210 toroidalspace periodic [#213](https://github.com/acgetchell/delaunay/pull/213) -- Bump taiki-e/install-action from 2.67.30 to 2.68.8 [#211](https://github.com/acgetchell/delaunay/pull/211) - -### Added - -- Enforce coherent orientation as a first-class invariant [#219](https://github.com/acgetchell/delaunay/pull/219) - [`350f614`](https://github.com/acgetchell/delaunay/commit/350f614c3e18d148bfc88809c28fdc2de362dd9a) - - - add Level 2 coherent-orientation validation via `is_coherently_oriented()` and `OrientationViolation` diagnostics - - preserve/normalize orientation across flips, cavity/neighbor rebuild paths, periodic quotient reconstruction, and vertex-removal retriangulation - - add orientation coverage in `tests/tds_orientation.rs`, document the invariant, and update related docs/doctest examples - -#### Changed: Refine coherent orientation handling and validation - - The flip algorithms now explicitly manage the local orientation of newly created cells, canonicalizing their vertex order to a positive orientation before - insertion. This ensures consistent orientation within individual cells as they are added. - - Introduced `facet_vertex_identities_in_cell_order` to `TriangulationDataStructure` which derives canonical facet identities (vertex keys and relative periodic - offsets). This improves the robustness of `normalize_coherent_orientation` and `is_coherently_oriented` by ensuring consistent comparisons across facets, - especially in periodic domains. - - Added `resolve_facet_handle_for_key` and `resolve_ridge_handle_for_key` to `flips.rs` to allow robust re-resolution of facet/ridge handles. This is necessary - because vertex reordering within cells (e.g., during canonicalization) can invalidate direct facet/ridge indices. - - Updates documentation to reflect the new explicit orientation management strategy during flips, where post-flip normalization and validation are now standard - practice. - - Improved error handling by boxing `source` errors in `InsertionError` , `DelaunayTriangulationConstructionErrorWithStatistics` , and - `TriangulationConstructionError` , reducing struct size and preventing excessive stack usage. - - Enhanced robustness of `Cell::swap_vertex_slots` with additional bounds checks and `Triangulation::build_initial_simplex` to handle cases with insufficient - vertices more gracefully. - - Added `bump_generation` in `normalize_coherent_orientation` to correctly increment the TDS generation counter when cell orientations are modified. - - Expanded TDS orientation tests to include serialization, manual tampering of cell vertex order, and verification that `is_coherently_oriented` correctly - detects the violation. - -- Use exact arithmetic for orientation predicates [#235](https://github.com/acgetchell/delaunay/pull/235) - [#236](https://github.com/acgetchell/delaunay/pull/236) [`a62437f`](https://github.com/acgetchell/delaunay/commit/a62437f25c27259f145d3c193ce149ee14b421c7) - - Switch to la-stack v0.2.1 with the `exact` feature to obtain provably - correct simplex orientation via `det_sign_exact()`. - - Orientation predicates: - - - Add `orientation_from_matrix()` using `det_sign_exact()` with a - finite-entry guard and adaptive-tolerance fallback for non-finite cases - - - `simplex_orientation()` now delegates to `orientation_from_matrix()`, - eliminating manual tolerance comparison - - insphere_lifted optimization: - - - Reuse the relative-coordinate block already in the lifted matrix for - orientation instead of re-converting all D+1 simplex points - - - Combine the dimension-parity sign and (-1)^D orientation correction - into a single simplified formula: det_norm = −det × rel_sign - - - Remove `dimension_is_even`, `parity_sign`, and `orient_sign` variables - - Stack-matrix dispatch cleanup: - - - Reduce MAX_STACK_MATRIX_DIM from 18 to 7 (matching tested D≤5 range) - - Replace 19 hand-written match arms with a compact repetition macro - - Add `matrix_zero_like()` helper for creating same-sized zero matrices - within macro-dispatched blocks without nested dispatch - -- Use exact-sign orientation in robust_orientation() [#244](https://github.com/acgetchell/delaunay/pull/244) - [`2869cfe`](https://github.com/acgetchell/delaunay/commit/2869cfea111dbca3641e7f88119d67b93a0d4841) - - Replace f64 determinant + adaptive tolerance in `robust_orientation()` - with `orientation_from_matrix()`, which uses `det_sign_exact()` for - provably correct sign classification on finite inputs. - - - Make `orientation_from_matrix` pub(crate) so robust_predicates can call it - - Remove adaptive_tolerance / manual threshold comparison from robust_orientation() - - Add near-degenerate 2D and 3D tests that exercise the exact-sign path - -#### Changed: Ignore slow higher-dimensional Delaunay proptests - - Mark 4D and 5D incremental insertion proptests as ignored. The exact - arithmetic fallback for orientation matrices larger than 4×4 is - currently too slow for practical test execution. This is an internal - change. - -- Exact insphere predicates with f64 fast filter [#245](https://github.com/acgetchell/delaunay/pull/245) - [`fed429f`](https://github.com/acgetchell/delaunay/commit/fed429f281cb2bc2e4a97cd99ac1770ade76a202) - - - Add `insphere_from_matrix` helper in predicates.rs using a 3-stage - approach: f64 fast filter → exact Bareiss → f64 fallback - - - Update `insphere`, `insphere_lifted`, `adaptive_tolerance_insphere`, - and `conditioned_insphere` to use exact-sign path - - - Remove dead `interpret_insphere_determinant` function - - Add near-cocircular and near-cospherical exact-sign tests - - Switch convex hull performance test to FastKernel to avoid 5×5 - exact Bareiss on cospherical inputs - - - Document lint suppression preference (`expect` over `allow`) in - docs/dev/rust.md - -### Changed - -- Feat/210 toroidalspace periodic [#213](https://github.com/acgetchell/delaunay/pull/213) - [`c172796`](https://github.com/acgetchell/delaunay/commit/c1727967ae2c92440c42413c10e1d5859d4cb561) - -- Introduce GlobalTopology behavior model adapter [#221](https://github.com/acgetchell/delaunay/pull/221) - [`e56265b`](https://github.com/acgetchell/delaunay/commit/e56265bafeb4a1e0e65c72b2037ab0e747af7ffa) - - - add internal `GlobalTopologyModel` abstraction and concrete models - (euclidean, toroidal, spherical scaffold, hyperbolic scaffold) - - - add `GlobalTopologyModelAdapter` and `GlobalTopology::model()` bridge to keep - `GlobalTopology<D>` as the stable public metadata/config surface - - - migrate triangulation orientation lifting to model-based behavior calls - - migrate builder toroidal validation/canonicalization to model-based calls - - update topology/code-organization docs for metadata-vs-behavior split - -#### Changed: Improve global topology model validation and consistency - - Enhances periodic cell offset validation by leveraging `supports_periodic_facet_signatures`. - Introduces robust checks for non-finite coordinates during point canonicalization - in toroidal models, preventing invalid states. - Refactors the `GlobalTopologyModelAdapter` to consistently delegate all trait - method calls to specific underlying topology model implementations, - improving maintainability. - Updates error messages for clarity during topology validation. - Optimizes `periodic_domain` to return a reference, avoiding data copies. - Adjusts internal module visibility and re-exports `ToroidalConstructionMode` to prelude. - -#### Changed: Add comprehensive documentation and tests for GlobalTopologyModel - - Enhance the global_topology_model module with extensive documentation and unit test coverage: - - Documentation improvements: - -- Add module-level overview explaining trait abstraction and concrete implementations -- Enhance trait method documentation for periodic_domain() and supports_periodic_facet_signatures() -- Document public methods: ToroidalModel::new(), GlobalTopology::model(), GlobalTopologyModelAdapter::from_global_topology() - - Test coverage (41 tests added): -- EuclideanModel: comprehensive trait method coverage -- SphericalModel and HyperbolicModel: scaffolded model behavior -- GlobalTopologyModelAdapter: delegation verification for all trait methods -- Error handling: zero/negative/infinite/NaN periods, non-finite coordinates -- Edge cases: large coordinates, exact periods, zero/large offsets, f32 scalars, 5D - - Code quality improvements: -- Fix nitpick: delegate kind() and allows_boundary() in GlobalTopologyModelAdapter -- Fix nitpick: add NaN coordinate test for canonicalize_point_in_place -- Fix nitpick: add finiteness validation to lift_for_orientation with test -- Apply cargo fmt formatting -- Fix clippy warnings (float_cmp, suboptimal_flops) - -#### Changed: Optimize facet vertex processing and improve periodic facet key determinism - - Moves the facet vertex buffer initialization to only execute on the non-periodic path, - avoiding unnecessary work for periodic cells and improving efficiency. - - Enhances the `periodic_facet_key_from_lifted_vertices` function to ensure - deterministic sorting by considering both the vertex key value and its periodic - offset. This prevents inconsistencies when multiple lifted vertices share the same - base key. - -- Make Codacy analysis step continue on error [`24a1ad6`](https://github.com/acgetchell/delaunay/commit/24a1ad6a7e17025f40ea9d4f626f302670664c39) - - Configures the Codacy analysis step in the CI workflow to continue on - error. This prevents the entire workflow from failing due to intermittent - issues with Codacy's opengrep/semgrep engine, ensuring subsequent steps, - like SARIF report uploads, can still execute. This improves CI robustness. - This is an internal CI workflow improvement. - -- Enhance Codacy CI reliability and performance [`b980630`](https://github.com/acgetchell/delaunay/commit/b9806304bff5de8d6ee554e36ae5543929c6300f) - - Disables the Semgrep engine within Codacy due to intermittent failures - and excessively long runtimes observed in CI. Additionally, adds a - timeout to the Codacy analysis step to prevent hung analyzers from - consuming the full job timeout, improving overall workflow stability - and resource utilization. This is an internal CI/CD change. - -- Update MSRV to 1.93.1 and `sysinfo` dependency [`a2a42d5`](https://github.com/acgetchell/delaunay/commit/a2a42d58ed913b46bf81489658356dc4d09c3637) - - Increment the Minimum Supported Rust Version (MSRV) to 1.93.1 - across all project configuration and documentation. This updates - the pinned Rust toolchain, `Cargo.toml` settings, and `clippy.toml` - MSRV, ensuring consistency and compatibility. Additionally, the - `sysinfo` dependency is updated to 0.38.3. This is an internal - maintenance change. - -- Improve 3D incremental prefix debug harness [`515dade`](https://github.com/acgetchell/delaunay/commit/515dadeb975250217702a9ae1c0a705fc16f620f) - - Refactors the `run_incremental_prefix_3d` function to use a batch construction - method, aligning it with other large-scale debug tests and simplifying logic. - This enhances initial triangulation robustness and error reporting by capturing - detailed statistics from construction failures. - - Adds new environment variables, `DELAUNAY_LARGE_DEBUG_PREFIX_MAX_PROBES` and - `DELAUNAY_LARGE_DEBUG_PREFIX_MAX_RUNTIME_SECS`, to control the bisection - process, enabling more efficient and targeted debugging of failure points. - - Updates the `env_usize` helper to correctly parse environment variables - provided in a `key=value` format, improving test configuration flexibility. - -- Deduplicate D<4 repair fallback and improve diagnostics [#232](https://github.com/acgetchell/delaunay/pull/232) - [`14ff1b3`](https://github.com/acgetchell/delaunay/commit/14ff1b3aad4ab4c1869018d6cbbb59d2d0456fd3) - - - Extract try_d_lt4_global_repair_fallback helper to eliminate - duplicated repair-or-abort logic between the stats and non-stats - branches of insert_remaining_vertices_seeded. - - - Enrich the soft post-condition diagnostic in - normalize_and_promote_positive_orientation with the count of - residual negative cells and a sample of up to 5 CellKeys. - - - Add test_construction_options_global_repair_fallback_toggle unit - test verifying the without_global_repair_fallback builder toggle. - -#### Fixed: Switch default kernel from FastKernel to RobustKernel - -- Change all convenience constructors (new, new_with_topology_guarantee, - new_with_options, empty, etc.) to use RobustKernel<f64> -- Change builder build() default to RobustKernel<T> -- Add RobustKernel to prelude::query exports -- Update type annotations across tests, benches, and doc tests -- Preserve FastKernel in tests that explicitly test it via with_kernel() - -#### Changed: Use RobustKernel for random generation and 3D examples - - Update examples and random triangulation utilities to use RobustKernel, - aligning them with the core library's default. FastKernel is now - explicitly documented as unreliable for 3D workloads due to floating- - point precision issues in near-degenerate configurations. This change - also adds topological admissibility checks for flip-based repairs and - improves error diagnostics for per-insertion failures. - -### Documentation - -- Update docs for DelaunayTriangulationBuilder and toroidal topology [#215](https://github.com/acgetchell/delaunay/pull/215) - [`a90526c`](https://github.com/acgetchell/delaunay/commit/a90526cd53be4cbe07c0add0b52ef04bd7243c3d) - - Update all documentation to reflect that toroidal topology is fully - implemented and accessible via DelaunayTriangulationBuilder. - - Documentation updates: - - - docs/topology.md: Replace "future plumbing" language with current - implementation status; add complete toroidal triangulation examples - - - docs/api_design.md: Split Builder API section into simple (::new()) - vs advanced (Builder) construction with toroidal examples - - - docs/workflows.md: Add new section for toroidal/periodic triangulations - with practical examples and construction modes - - - docs/code_organization.md: Update file tree with missing files - (invariants.md, workflows.md, tests, geometry/util/ subdirectory) - - - README.md: Add toroidal feature to Builder API section with example - - Code updates: - - - src/lib.rs: Export TopologyKind and GlobalTopology from - prelude::triangulation for ergonomic imports - - - src/core/delaunay_triangulation.rs: Add "Advanced Configuration" - section to ::new() documentation mentioning Builder for toroidal - and custom options; fix redundant rustdoc link - - - examples/topology_editing_2d_3d.rs: Migrate to DelaunayTriangulationBuilder - - benches/profiling_suite.rs: Migrate to DelaunayTriangulationBuilder - -#### Changed: Adopt DelaunayTriangulationBuilder and update related documentation - - Migrates benchmark and example code to consistently use the - DelaunayTriangulationBuilder for creating triangulations. - This reflects the full implementation and accessibility of toroidal - topology via the builder, and updates documentation across various - sections (API design, workflows, topology) to guide users on its - proper and advanced configuration. Includes internal exports for - ergonomic usage. - -### Fixed - -- Ensure deterministic sorting and enforce coherent orientation - [`c0e4d4f`](https://github.com/acgetchell/delaunay/commit/c0e4d4fffc9e3ae116062b8bd2d89baf58678517) - - Resolves multiple issues to ensure deterministic behavior and strong - invariants across the triangulation data structure. - - Stabilizes vertex ordering, particularly for Hilbert curve sorts, by - refining tie-breaking, error handling, and fallback logic. This prevents - non-deterministic results and corrects inverse permutation calculations, - addressing previously identified breaking changes related to sorting. - - Enforces a consistent positive geometric orientation for all cells - throughout the triangulation lifecycle, making coherent orientation a - first-class invariant. This fixes 4D construction failures and improves - periodic self-neighbor validation by handling lifted coordinates. - - Enhances the global topology model, especially for toroidal domains, - by improving validation, canonicalization, and periodic facet key - derivation. This addresses edge cases related to non-finite coordinates, - zero/negative periods, and ensures consistent behavior. - -- Resolve 3D seeded bulk construction orientation convergence failure [#228](https://github.com/acgetchell/delaunay/pull/228) - [`c181f28`](https://github.com/acgetchell/delaunay/commit/c181f289c7d36a6668a8441b78aed596b9dae36c) - - - Soften post-condition in normalize_and_promote_positive_orientation: - add canonicalize_global_orientation_sign before the promote loop to - prevent oscillation; demote the residual negative-orientation check - from a hard error to a diagnostic log so near-degenerate but - structurally valid simplices no longer abort insertion. - - - Replace enlarged local repair fallback with global - repair_delaunay_with_flips_k2_k3 when D<4 per-insertion local repair - cycles on co-spherical FP configurations. The multi-attempt global - repair uses robust predicates and alternate queue orders to break - cycling. - - - Gate global repair fallback on a new ConstructionOptions field - (use_global_repair_fallback, default true) threaded through the - build chain via DelaunayInsertionState. The periodic builder disables - it (.without_global_repair_fallback()) so global repair cannot - disrupt the image-point topology; the existing 24-attempt shuffle - retry finds a working vertex ordering instead. - -### Maintenance - -- Bump taiki-e/install-action from 2.67.30 to 2.68.8 [#211](https://github.com/acgetchell/delaunay/pull/211) - [`a133758`](https://github.com/acgetchell/delaunay/commit/a13375884047d06aab280ff5cb17f48910e496f0) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.30 to 2.68.8. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/288875dd3d64326724fa6d9593062d9f8ba0b131...cfdb446e391c69574ebc316dfb7d7849ec12b940) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.68.8 - dependency-type: direct:production - update-type: version-update:semver-minor - ... -- Update docs, remove old files [`18679dc`](https://github.com/acgetchell/delaunay/commit/18679dc73e5764277906ee83d1465cb0134a9780) -- Bump actions-rust-lang/setup-rust-toolchain [#226](https://github.com/acgetchell/delaunay/pull/226) - [`3e2cd26`](https://github.com/acgetchell/delaunay/commit/3e2cd26f67d4845445f1b876ec31695a20e745be) - - Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.2 to 1.15.3. - - - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/1780873c7b576612439a134613cc4cc74ce5538c...a0b538fa0b742a6aa35d6e2c169b4bd06d225a98) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.15.3 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump actions/download-artifact from 7.0.0 to 8.0.0 [#222](https://github.com/acgetchell/delaunay/pull/222) - [`c172f09`](https://github.com/acgetchell/delaunay/commit/c172f09dd0a0f533f47e943bfbbbfc54240e40b0) - - Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7.0.0 to 8.0.0. - - - [Release notes](https://github.com/actions/download-artifact/releases) - - [Commits](https://github.com/actions/download-artifact/compare/37930b1c2abaa49bbe596cd826c3c89aef350131...70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3) - ---- - - updated-dependencies: - -- dependency-name: actions/download-artifact - dependency-version: 8.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - -- Bump taiki-e/install-action from 2.68.8 to 2.68.16 [#225](https://github.com/acgetchell/delaunay/pull/225) - [`25a09a4`](https://github.com/acgetchell/delaunay/commit/25a09a46f1c0d46775fd085e6b34053888d69277) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.8 to 2.68.16. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/cfdb446e391c69574ebc316dfb7d7849ec12b940...d6e286fa45544157a02d45a43742857ebbc25d12) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.68.16 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump actions/upload-artifact from 6 to 7 [#223](https://github.com/acgetchell/delaunay/pull/223) - [`0a25bfa`](https://github.com/acgetchell/delaunay/commit/0a25bfa55c5b9d4579e7747e1e7c8661185c4542) - - Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - - - [Release notes](https://github.com/actions/upload-artifact/releases) - - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) - ---- - - updated-dependencies: - -- dependency-name: actions/upload-artifact - dependency-version: '7' - dependency-type: direct:production - update-type: version-update:semver-major - ... - -- Bump astral-sh/setup-uv from 7.3.0 to 7.3.1 [#224](https://github.com/acgetchell/delaunay/pull/224) - [`1533402`](https://github.com/acgetchell/delaunay/commit/15334025d07c4dfeef43d01bbf3a190eaed54688) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.0 to 7.3.1. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/eac588ad8def6316056a12d4907a9d4d84ff7a3b...5a095e7a2014a4212f075830d4f7277575a9d098) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.3.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump taiki-e/install-action from 2.68.16 to 2.68.25 [#237](https://github.com/acgetchell/delaunay/pull/237) - [`abe7925`](https://github.com/acgetchell/delaunay/commit/abe79250b63aaf695a8a4447250402b6f1cbdcc8) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.16 to 2.68.25. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/d6e286fa45544157a02d45a43742857ebbc25d12...a37010ded18ff788be4440302bd6830b1ae50d8b) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.68.25 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump actions/setup-node from 6.2.0 to 6.3.0 [#239](https://github.com/acgetchell/delaunay/pull/239) - [`eb0000b`](https://github.com/acgetchell/delaunay/commit/eb0000bf27cb583a97370190861c01d4b8902bfe) - - Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.2.0 to 6.3.0. - - - [Release notes](https://github.com/actions/setup-node/releases) - - [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f) - ---- - - updated-dependencies: - -- dependency-name: actions/setup-node - dependency-version: 6.3.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -### Performance - -- Improve Hilbert curve correctness and add bulk API [#207](https://github.com/acgetchell/delaunay/pull/207) - [#216](https://github.com/acgetchell/delaunay/pull/216) [`2d198e7`](https://github.com/acgetchell/delaunay/commit/2d198e7d2f1f41f1b2e47009a1cf7cc12079fe05) - - Implements correctness fixes, API improvements, and comprehensive testing - for the Hilbert space-filling curve ordering utilities. - -#### Correctness Fixes - -- Add debug_assert guards in hilbert_index_from_quantized for parameter - validation (bits range and overflow checks) - -- Fix quantization truncation bias by changing from NumCast::from(scaled) - to scaled.round().to_u32() for fairer spatial distribution across grid - cells, improving point ordering quality - -#### API Design - -- Add HilbertError enum with InvalidBitsParameter, IndexOverflow, and - DimensionTooLarge variants for proper error handling - -- Implement hilbert_indices_prequantized() returning Result<Vec<u128>, - HilbertError> for bulk processing of pre-quantized coordinates - -- Bulk API avoids redundant quantization computation, significantly - improving performance for large insertion batches - -#### Testing - -- Add 4D continuity test verifying Hilbert curve property on 256-point - grid (bits=2) - -- Add quantization rounding distribution test validating fair cell - assignment - -- Add 5 comprehensive tests for prequantized API covering success cases, - empty input, and all error conditions - -- All 17 Hilbert-specific tests pass (11 existing + 6 new) - -#### Known Issue - - Temporarily ignore repair_fallback_produces_valid_triangulation test as - the rounding change affects insertion order, exposing a latent geometric - degeneracy issue in triangulation construction. This is properly - documented and tracked under issue #204 for investigation. - -#### Added: Explicitly handle zero-dimensional inputs in Hilbert index calculation - - Ensures correct behavior for `hilbert_indices_prequantized` when - the dimensionality `D` is zero. In such a space, all points map to - the single origin, and their Hilbert curve index is always 0. - This change adds an early return for this specific edge case. - -- Use bulk Hilbert API in order_vertices_hilbert [#218](https://github.com/acgetchell/delaunay/pull/218) - [`4782905`](https://github.com/acgetchell/delaunay/commit/478290556e88f770e0fcda07fb6137a3404b70f5) - - Refactored `order_vertices_hilbert` to use the bulk `hilbert_indices_prequantized` API - instead of calling `hilbert_index` individually for each vertex. This eliminates - redundant parameter validation (N validations → 1 validation for N vertices). - -- Switch FastKernel to insphere_lifted and enable LTO [#234](https://github.com/acgetchell/delaunay/pull/234) - [`91e290f`](https://github.com/acgetchell/delaunay/commit/91e290fca1a633f5b084accc367767f235780a49) - - Switch FastKernel::in_sphere() to use insphere_lifted() for 5.3x speedup in 3D. - Add release profile optimization with thin LTO and codegen-units=1. - - Benchmarks across dimensions (2D-5D): - - - insphere_lifted is 5.3x faster in 3D (15.5 ns vs 81.7 ns) - - Random query test: 3.75x faster (20.0 µs vs 75.0 µs for 1000 queries) - - insphere_lifted consistently fastest across all dimensions - - Performance gains attributed to la-stack v0.2.0's closed-form determinants for D=1-4. - -## [0.7.1] - 2026-02-20 - -### Merged Pull Requests - -- Prevents timeout in 4D bulk construction [#203](https://github.com/acgetchell/delaunay/pull/203) -- Bump taiki-e/install-action from 2.67.26 to 2.67.30 [#202](https://github.com/acgetchell/delaunay/pull/202) -- Bump the dependencies group with 3 updates [#201](https://github.com/acgetchell/delaunay/pull/201) -- Feat/ball pointgen and debug harness [#200](https://github.com/acgetchell/delaunay/pull/200) -- Ci/perf baselines by tag [#199](https://github.com/acgetchell/delaunay/pull/199) -- Refactors changelog generation to use git-cliff [#198](https://github.com/acgetchell/delaunay/pull/198) -- Bump astral-sh/setup-uv from 7.2.1 to 7.3.0 [#196](https://github.com/acgetchell/delaunay/pull/196) -- Bump taiki-e/install-action from 2.67.18 to 2.67.26 [#195](https://github.com/acgetchell/delaunay/pull/195) -- Improves flip algorithm with topology index [#194](https://github.com/acgetchell/delaunay/pull/194) -- Removes `CoordinateScalar` bound from `Cell`, `Tds`, `Vertex` [#193](https://github.com/acgetchell/delaunay/pull/193) -- Moves `TopologyEdit` to `triangulation::flips` [#192](https://github.com/acgetchell/delaunay/pull/192) -- Correctly wires neighbors after K2 flips [#191](https://github.com/acgetchell/delaunay/pull/191) -- Use borrowed APIs in utility functions [#190](https://github.com/acgetchell/delaunay/pull/190) -- Add ScalarSummable/ScalarAccumulative supertraits [#189](https://github.com/acgetchell/delaunay/pull/189) -- Refactors point access for efficiency (internal) [#187](https://github.com/acgetchell/delaunay/pull/187) -- Corrects kernel parameter passing in triangulation [#186](https://github.com/acgetchell/delaunay/pull/186) -- Examples to error and struct definitions [#185](https://github.com/acgetchell/delaunay/pull/185) -- Validates random triangulations for Euler consistency [#184](https://github.com/acgetchell/delaunay/pull/184) -- Validates ridge links locally after Delaunay repair [#183](https://github.com/acgetchell/delaunay/pull/183) -- Bump astral-sh/setup-uv from 7.2.0 to 7.2.1 [#182](https://github.com/acgetchell/delaunay/pull/182) -- Bump taiki-e/install-action from 2.67.17 to 2.67.18 [#181](https://github.com/acgetchell/delaunay/pull/181) -- Stabilizes Delaunay property tests with bistellar flips [#180](https://github.com/acgetchell/delaunay/pull/180) -- Bump taiki-e/install-action from 2.66.1 to 2.67.11 [#177](https://github.com/acgetchell/delaunay/pull/177) -- Bump actions/checkout from 6.0.1 to 6.0.2 [#176](https://github.com/acgetchell/delaunay/pull/176) -- Bump actions/setup-node from 6.1.0 to 6.2.0 [#175](https://github.com/acgetchell/delaunay/pull/175) -- Feature/bistellar flips [#172](https://github.com/acgetchell/delaunay/pull/172) - -### Added - -- Examples to error and struct definitions [#185](https://github.com/acgetchell/delaunay/pull/185) - [`a1bce55`](https://github.com/acgetchell/delaunay/commit/a1bce556cfd9a799f2a6aabb716443a14aaf6772) - - Adds code examples to various error enums and struct definitions - to improve documentation and provide usage guidance. - - This change enhances the discoverability and understanding of - various components, such as `AdjacencyIndexBuildError`, - `BistellarFlipKind`, `FlipDirection`, `FlipError`, `FlipInfo`, - `TriangleHandle`, `RidgeHandle`, `DelaunayRepairStats`, - `RepairQueueOrder`, `DelaunayRepairDiagnostics`, - `DelaunayRepairError`, `HullExtensionReason`, `InsertionError`, - `LocateResult`, `LocateError`, `ConflictError`, `LocateFallbackReason`, - `LocateFallback`, `LocateStats`, `CellValidationError`, `EdgeKey`, - `FacetError`, `TopologicalOperation`, `RepairDecision`, - `InsertionResult`, `InsertionStatistics`, - `TriangulationConstructionState`, `TdsConstructionError`, - `DelaunayValidationError`, `DelaunayRepairPolicy`, - `DelaunayRepairHeuristicConfig`, `DelaunayRepairHeuristicSeeds`, - `DelaunayRepairOutcome`, `DelaunayCheckPolicy`, - `UuidValidationError`, `VertexValidationError`, - `ConvexHullValidationError`, `ConvexHullConstructionError`, - `MatrixError`, `InSphere`, `Orientation`, `QualityError`, - `ConsistencyResult`, `CoordinateConversionError`, - `CoordinateValidationError`, `CircumcenterError`, - `SurfaceMeasureError`, `RandomPointGenerationError` and - `ValueConversionError` to make the crate easier to use. - -#### Changed: Improves examples and updates doc tests - - Updates doc tests to use clearer examples and more - idiomatic syntax, enhancing code readability and - maintainability. Modifies BistellarFlipKind to use a - getter method. Addresses issues identified during - documentation review. (internal) - -- Add ScalarSummable/ScalarAccumulative supertraits [#189](https://github.com/acgetchell/delaunay/pull/189) - [`abdeeb2`](https://github.com/acgetchell/delaunay/commit/abdeeb2f80ab03c998b9a29108c57ff9f0c54393) - - - Add ScalarSummable (CoordinateScalar + Sum) and ScalarAccumulative (CoordinateScalar + AddAssign + SubAssign + Sum) - - Refactor repeated scalar bounds across geometry/core modules to use the new supertraits - - Allow “supertrait(s)” in cspell -- Document geometric and topological invariants [`0283bf0`](https://github.com/acgetchell/delaunay/commit/0283bf01cd1860c1a44ff9f645ac304fa44b7345) - - Adds `invariants.md` to document the theoretical background and - rationale for the topological and geometric invariants enforced by - the `delaunay` crate. This includes simplicial complexes, - PL-manifolds, link-based validation, insertion strategies, and - convergence considerations. Updates `README.md` and `lib.rs` to - reference the new document. Also adds a `examples/README.md` file. - -### Changed - -- Feature/bistellar flips [#172](https://github.com/acgetchell/delaunay/pull/172) - [`66c7028`](https://github.com/acgetchell/delaunay/commit/66c7028d0c3d9dbc00f6b1a9cb791c41d39ab933) - -- Refactors point access for efficiency (internal) [#187](https://github.com/acgetchell/delaunay/pull/187) - [`8020065`](https://github.com/acgetchell/delaunay/commit/8020065afe66fc066ef51307a9de02621f087a54) - - Simplifies vertex coordinate access using `.coords()` instead of `.into()`, - improving code clarity and potentially performance. This change is - internal, affecting predicate calculations and geometric algorithms. - Also, moves the issue 120 investigation document to the archive. - -- Use borrowed APIs in utility functions [#190](https://github.com/acgetchell/delaunay/pull/190) - [`bee065b`](https://github.com/acgetchell/delaunay/commit/bee065bd13f9f7adb8a7767b5b907ea7886248d5) - - Updates `into_hashmap`, `dedup_vertices_exact`, - `dedup_vertices_epsilon`, and `filter_vertices_excluding` - functions to accept slices instead of vectors, improving - performance by avoiding unnecessary cloning. - - This aligns with the Rust agent's preference for borrowed - APIs, taking references as arguments and returning borrowed - views when possible, and only taking ownership when required. - -- Moves `TopologyEdit` to `triangulation::flips` [#192](https://github.com/acgetchell/delaunay/pull/192) - [`c491bb9`](https://github.com/acgetchell/delaunay/commit/c491bb913e1b49ff38d4ce52c180d5220e9db9df) - - Moves the `TopologyEdit` trait to `triangulation::flips` and renames it to `BistellarFlips`. - - This change involves updating imports and references throughout the codebase and documentation to reflect the new location and name of the trait. - -#### Changed: Refactors prelude modules for clarity (internal) - - Streamlines the prelude modules to provide clearer and more - focused exports for common triangulation tasks. This change - affects import statements in documentation and examples, - requiring more specific paths for certain types. - -#### Removed: Topology validation prelude module - - Removes the redundant topology validation prelude module. - - Moves its contents into the main topology prelude, simplifying - module structure and reducing code duplication. This change - internally refactors the prelude modules for better organization. - -- Removes `CoordinateScalar` bound from `Cell` , `Tds` , `Vertex` [#193](https://github.com/acgetchell/delaunay/pull/193) - [`e69f3d1`](https://github.com/acgetchell/delaunay/commit/e69f3d153961050e03a520e5b5457a165097c834) - - Relaxes trait bounds on `Cell`, `Tds`, and `Vertex` structs by - removing the `CoordinateScalar` requirement. - - This change prepares the triangulation data structure for combinatorial - operations independent of geometry. The `validate` method in `Tds` - now requires `CoordinateScalar` to perform coordinate validation, - where applicable. (Internal change). - -#### Changed: Clarifies `Vertex` constraints and moves `point` - - Clarifies the `Vertex` struct's constraints, emphasizing - `CoordinateScalar` requirement for geometric operations and - serialization but allowing combinatorial use without it. - - Moves the `point` method definition to ensure consistent API - presentation. (Internal refactoring, no functional change). - -- Improves flip algorithm with topology index [#194](https://github.com/acgetchell/delaunay/pull/194) - [`c4e37ed`](https://github.com/acgetchell/delaunay/commit/c4e37ed9e899170978196af4edad4e2c0a248141) - - Improves flip algorithm by introducing a topology index to - efficiently check for duplicate cells and non-manifold facets. - This avoids redundant scans of the triangulation data - structure, especially during repair operations, by pre-computing - and storing facet and cell signatures. This change is internal. - -- Updates typos-cli installation in CI workflow [`6168e83`](https://github.com/acgetchell/delaunay/commit/6168e83512509123f9c0443f9716752f88cc2aa3) - - Updates the typos-cli installation in the CI workflow to use the - `taiki-e/install-action` for simpler and more reliable installation. - This aligns with the switch from cspell to typos in the codebase. - -- Refactors changelog generation to use git-cliff [#198](https://github.com/acgetchell/delaunay/pull/198) - [`63553fa`](https://github.com/acgetchell/delaunay/commit/63553fa170a5603c98c3c5eee87caca756e0bb89) - -- Ci/perf baselines by tag [#199](https://github.com/acgetchell/delaunay/pull/199) - [`0c94dec`](https://github.com/acgetchell/delaunay/commit/0c94dec96ac73004b9b9c924a977499e29dfaf19) - -- Feat/ball pointgen and debug harness [#200](https://github.com/acgetchell/delaunay/pull/200) - [`79bf0e9`](https://github.com/acgetchell/delaunay/commit/79bf0e96b0d9c4f8cbdda8539910adfa18f412a4) - -### Documentation - -- Refresh docs and add workflows guide [`695e9a0`](https://github.com/acgetchell/delaunay/commit/695e9a0f700b8cb6bf7cb5a3acb6e4510c4b3939) - - - Add a new workflows guide covering Builder/Edit API usage, topology guarantees, and repair - - Wire README into doctests and refresh crate-level docs/examples (simplify type annotations, link to workflows) - - Update README Features + references (kernels, insertion ordering, construction options, validation/repair) - - Reorganize docs index and archive historical/roadmap material; refresh topology/robustness/validation guides - - Replace debug `eprintln!` with `tracing` in Hilbert utilities/tests - - Tweak spell-check + release docs (typos-cli, rename handling, release steps) and update CHANGELOG - -### Fixed - -- Stabilizes Delaunay property tests with bistellar flips [#180](https://github.com/acgetchell/delaunay/pull/180) - [`e3bd4bf`](https://github.com/acgetchell/delaunay/commit/e3bd4bfa77258484e6dab088a2980139efd0f182) - - Enables previously failing Delaunay property tests by - implementing bistellar flips for robust Delaunay repair. - Includes automatic repair and fast validation. - - Updates MSRV to 1.93.0. - -- Validates ridge links locally after Delaunay repair [#183](https://github.com/acgetchell/delaunay/pull/183) - [`7bc4792`](https://github.com/acgetchell/delaunay/commit/7bc4792b33ee1e6ecbeda729834a33fbf06cd0e6) - - Addresses potential topology violations (non-manifold configurations) - introduced by flip-based Delaunay repair by validating ridge links - for affected cells post-insertion. This prevents committing - invalid triangulations and surfaces topology validation failures - as insertion errors, enabling transactional rollback. - -- Validates random triangulations for Euler consistency [#184](https://github.com/acgetchell/delaunay/pull/184) - [`72eb272`](https://github.com/acgetchell/delaunay/commit/72eb2726f8c683339a23b17a63991ac87a35e412) - - Ensures that random triangulations satisfy Euler characteristic - validation to prevent construction errors or invalid classifications. - - Adds a validation function to check topology/Euler validity after - triangulation construction or robust fallback attempts, catching - potential issues that can lead to incorrect results. Removes - redundant validation checks. - -- Corrects kernel parameter passing in triangulation [#186](https://github.com/acgetchell/delaunay/pull/186) - [`df3c490`](https://github.com/acgetchell/delaunay/commit/df3c49033dd96558ee5ee0de572913e82c55f210) - - Addresses an issue where the kernel was being passed by value - instead of by reference in the Delaunay triangulation - construction. This change ensures that the kernel is correctly - accessed and used, preventing potential errors and improving - reliability. The fix involves modifying the `with_kernel` method - signatures and call sites to accept a kernel reference instead of - a kernel value. This affects benchmark code, documentation, - examples, and internal code. - -- Correctly wires neighbors after K2 flips [#191](https://github.com/acgetchell/delaunay/pull/191) - [`5ab686c`](https://github.com/acgetchell/delaunay/commit/5ab686c2177562bdeb852fe843c946181e03753a) - - Fixes an issue where external neighbors across the cavity - boundary were not being correctly rewired after a K2 flip. - - Introduces `external_facets_for_boundary` to collect the set - of external facets that are shared with the flip cavity boundary, - and then uses these to correctly wire up neighbors. - - Adds a test case to verify that external neighbors are correctly - rewired after the flip, ensuring that the triangulation remains - valid and consistent. - Refs: refactor/wire-cavity-neighbors - -#### Added: K=3 flip rewiring test - - Adds a test to verify correct rewiring of external neighbors - after a k=3 flip. This validates the boundary handling and - neighbor update logic in the bistellar flip implementation. - - This test constructs an explicit k=3 ridge-flip fixture and - checks neighbor rewiring. - -- Prevents timeout in 4D bulk construction [#203](https://github.com/acgetchell/delaunay/pull/203) - [`b071fb7`](https://github.com/acgetchell/delaunay/commit/b071fb787bf06ff196fade35fd5dab180822985b) - - Addresses a timeout issue in 4D bulk construction - by implementing per-insertion local Delaunay repair - (soft-fail) during bulk construction to prevent - violation accumulation, which slows down the global - repair process. Also adds a hard wall-clock time - limit to the test harness. - -### Maintenance - -- Bump actions/setup-node from 6.1.0 to 6.2.0 [#175](https://github.com/acgetchell/delaunay/pull/175) - [`8d15114`](https://github.com/acgetchell/delaunay/commit/8d15114553e05ecb9d46cfb9bd78eb9e27379796) - - Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.1.0 to 6.2.0. - - - [Release notes](https://github.com/actions/setup-node/releases) - - [Commits](https://github.com/actions/setup-node/compare/395ad3262231945c25e8478fd5baf05154b1d79f...6044e13b5dc448c55e2357c09f80417699197238) - ---- - - updated-dependencies: - -- dependency-name: actions/setup-node - dependency-version: 6.2.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump actions/checkout from 6.0.1 to 6.0.2 [#176](https://github.com/acgetchell/delaunay/pull/176) - [`c703f94`](https://github.com/acgetchell/delaunay/commit/c703f944a9928651b639d5e5b2a06db3b1b75e4f) - - Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2. - - - [Release notes](https://github.com/actions/checkout/releases) - - [Commits](https://github.com/actions/checkout/compare/v6.0.1...v6.0.2) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: 6.0.2 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump taiki-e/install-action from 2.66.1 to 2.67.11 [#177](https://github.com/acgetchell/delaunay/pull/177) - [`92292e0`](https://github.com/acgetchell/delaunay/commit/92292e01f5777fe4f13ab387a1f9ee4e39930ab3) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.66.1 to 2.67.11. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/3522286d40783523f9c7880e33f785905b4c20d0...887bc4e03483810873d617344dd5189cd82e7b8b) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.67.11 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump astral-sh/setup-uv from 7.2.0 to 7.2.1 [#182](https://github.com/acgetchell/delaunay/pull/182) - [`cfaaf60`](https://github.com/acgetchell/delaunay/commit/cfaaf600fef814bfe563524fcdbcb0ab83fa9028) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.0 to 7.2.1. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/61cb8a9741eeb8a550a1b8544337180c0fc8476b...803947b9bd8e9f986429fa0c5a41c367cd732b41) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.2.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump taiki-e/install-action from 2.67.17 to 2.67.18 [#181](https://github.com/acgetchell/delaunay/pull/181) - [`068f314`](https://github.com/acgetchell/delaunay/commit/068f314ed00a837678c968734f75b4b69327d9e0) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.17 to 2.67.18. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/29feb09ac22f4fde4175fe7b5c3548952234f69a...650c5ca14212efbbf3e580844b04bdccf68dac31) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.67.18 - dependency-type: direct:production - update-type: version-update:semver-patch - ... -- Bump rand to 0.10 and trim unused deps [`fe3e406`](https://github.com/acgetchell/delaunay/commit/fe3e406f19dcc6c9c72666d89b285626ea00465c) - - - Update rand to v0.10 and fix RNG trait imports (use rand::RngExt) in tests/utilities - - Move test-only crates to dev-dependencies (approx, serde_json) - - Remove unused runtime dependencies (anyhow, clap, serde_test) - - Drop clippy allow for multiple_crate_versions - - Update Cargo.lock and regenerate CHANGELOG.md -- Bump astral-sh/setup-uv from 7.2.1 to 7.3.0 [#196](https://github.com/acgetchell/delaunay/pull/196) - [`6c4662a`](https://github.com/acgetchell/delaunay/commit/6c4662a4008e5a43de71d3b83591350dbf4778b0) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.1 to 7.3.0. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/803947b9bd8e9f986429fa0c5a41c367cd732b41...eac588ad8def6316056a12d4907a9d4d84ff7a3b) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.3.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump taiki-e/install-action from 2.67.18 to 2.67.26 [#195](https://github.com/acgetchell/delaunay/pull/195) - [`1cd6008`](https://github.com/acgetchell/delaunay/commit/1cd6008503d0bc2694e934060f8ed986f2d9e05e) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.18 to 2.67.26. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/650c5ca14212efbbf3e580844b04bdccf68dac31...509565405a8a987e73cf742e26b26dcc72c4b01a) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.67.26 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump taiki-e/install-action from 2.67.26 to 2.67.30 [#202](https://github.com/acgetchell/delaunay/pull/202) - [`e99f0d3`](https://github.com/acgetchell/delaunay/commit/e99f0d3f17cf45e85c51274799b8baee3b28e8e5) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.26 to 2.67.30. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/509565405a8a987e73cf742e26b26dcc72c4b01a...288875dd3d64326724fa6d9593062d9f8ba0b131) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.67.30 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump the dependencies group with 3 updates [#201](https://github.com/acgetchell/delaunay/pull/201) - [`fa69c80`](https://github.com/acgetchell/delaunay/commit/fa69c800e6b01fa2cb4f9b1468473e09ed9f0108) - - Bumps the dependencies group with 3 updates: [arc-swap](https://github.com/vorner/arc-swap) , [uuid](https://github.com/uuid-rs/uuid) and - [sysinfo](https://github.com/GuillaumeGomez/sysinfo) . - - Updates `arc-swap` from 1.8.1 to 1.8.2 - - - [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md) - - [Commits](https://github.com/vorner/arc-swap/compare/v1.8.1...v1.8.2) - - Updates `uuid` from 1.20.0 to 1.21.0 - - - [Release notes](https://github.com/uuid-rs/uuid/releases) - - [Commits](https://github.com/uuid-rs/uuid/compare/v1.20.0...v1.21.0) - - Updates `sysinfo` from 0.38.1 to 0.38.2 - - - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) - - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.38.1...v0.38.2) - ---- - - updated-dependencies: - -- dependency-name: arc-swap - dependency-version: 1.8.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: uuid - dependency-version: 1.21.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - -- dependency-name: sysinfo - dependency-version: 0.38.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - -### Removed - -- Replace cspell with typos for spell checking [`4b5e1a1`](https://github.com/acgetchell/delaunay/commit/4b5e1a1641037f137663612c74bb39cd187f90e9) - - Replaces the cspell tool with typos for spell checking across the - project. This change involves removing cspell configurations and - dependencies, and integrating typos, including its configuration file. - -## [0.7.0] - 2026-01-13 - -### ⚠️ Breaking Changes - -- Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) - -### Merged Pull Requests - -- Refactors topology guarantee and manifold validation [#171](https://github.com/acgetchell/delaunay/pull/171) -- Bump astral-sh/setup-uv from 7.1.6 to 7.2.0 [#170](https://github.com/acgetchell/delaunay/pull/170) -- Bump taiki-e/install-action from 2.65.13 to 2.66.1 [#169](https://github.com/acgetchell/delaunay/pull/169) -- Feature/manifolds [#168](https://github.com/acgetchell/delaunay/pull/168) -- Refactors Gram determinant calculation with LDLT [#167](https://github.com/acgetchell/delaunay/pull/167) -- Bump clap from 4.5.53 to 4.5.54 in the dependencies group [#166](https://github.com/acgetchell/delaunay/pull/166) -- Bump taiki-e/install-action from 2.65.7 to 2.65.13 [#165](https://github.com/acgetchell/delaunay/pull/165) -- Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) - -### Added - -- [**breaking**] Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) - [`3748ebb`](https://github.com/acgetchell/delaunay/commit/3748ebb24ded08154875b2be371128c77d43eed3) - - - Introduce canonical `EdgeKey` and read-only topology traversal helpers on `Triangulation` - - Add opt-in `AdjacencyIndex` builder for faster repeated adjacency queries - - Add integration tests for topology traversal and adjacency index invariants - - Refresh repo tooling/CI configs and supporting scripts/tests - -#### Changed: Exposes public topology traversal API - - Makes topology traversal APIs public for external use. - - Exposes `edges()`, `incident_edges()`, and `cell_neighbors()` on the - `DelaunayTriangulation` struct as convenience wrappers. Updates - documentation, examples, and benchmarks to use new API. - - This allows external users to traverse the triangulation's topology - without needing to access internal implementation details. - -#### Changed: Expose topology query APIs on DelaunayTriangulation - - Exposes cell and vertex query APIs on `DelaunayTriangulation` for zero-allocation topology traversal. - - Also includes internal refactoring to improve vertex incidence - validation and ensure more robust handling of invalid key references. - Now TDS validation detects isolated vertices. - -### Changed - -- Updates CHANGELOG.md for unreleased changes [`271353f`](https://github.com/acgetchell/delaunay/commit/271353f1b1af82fb45eb619520d62cd7474e4541) - - Updates the changelog to reflect recent changes, including adding - a new public topology traversal API, refreshing repository - tooling/CI configurations, and clarifying TDS validation and API - documentation. - -- Refactors Gram determinant calculation with LDLT [#167](https://github.com/acgetchell/delaunay/pull/167) - [`561a259`](https://github.com/acgetchell/delaunay/commit/561a259d58401d2baa61cd6313dd0ada01179f4a) - - Refactors the Gram determinant calculation to use LDLT factorization from the `la-stack` crate for improved efficiency and numerical stability by exploiting - symmetry. - - Also, updates the `la-stack` dependency version. - -#### Fixed: Improves robustness of incremental insertion - - Addresses rare topological invalidations during incremental - insertion by: - -- Adding connectedness validation to conflict region checks. - -- Adding codimension-2 boundary manifoldness validation - ("no boundary of boundary") to triangulation's `is_valid` - method. - -- Ensuring that strict Level 3 validation is enabled during - batch construction in debug builds. - Refs: feat/la-stack-ldlt-factorization - -#### Changed: Rename SimplexCounts to FVector for clarity - - Renames the `SimplexCounts` struct to `FVector` to better reflect - its mathematical meaning as the f-vector in topology, representing - the counts of simplices of different dimensions. - - This change improves code readability and aligns the naming - convention with standard topological terminology. - (Internal refactoring, no API change.) - -#### Changed: Improves simplex generation algorithm - - Improves the algorithm for generating simplex combinations in - the Euler characteristic calculation. This change enhances - efficiency by using a lexicographic approach to generate - combinations, reducing unnecessary computations. - -- Feature/manifolds [#168](https://github.com/acgetchell/delaunay/pull/168) - [`10abbe1`](https://github.com/acgetchell/delaunay/commit/10abbe1899a381d1b0d4855727dfef7797952549) - -- Refactors topology guarantee and manifold validation [#171](https://github.com/acgetchell/delaunay/pull/171) - [`dfdba5a`](https://github.com/acgetchell/delaunay/commit/dfdba5a745d6a41b4fa92d66b71c0c3d3dc87e54) - - Refactors manifold validation mode to topology guarantee for - clarity. Updates Level 3 validation configuration, improves error - reporting, and adds comprehensive manifold validation tests. - Also improves robustness of incremental insertion. - -#### Changed: Updates topology guarantee defaults and validation - - Updates the default topology guarantee to `Pseudomanifold` for new - triangulations and deserialized triangulations. Also, clarifies - validation policy and its relationship to topology guarantees in - documentation. Introduces a test-only function to repair degenerate - cells by removing them and clearing dangling references. - -#### Fixed: Corrects triangulation perturbation logic - - Fixes a bug in the vertex insertion perturbation logic that - caused non-equivalent results when translating the input - point set by using a translation-invariant anchor for - perturbation scaling. - - Also, preserves the caller-provided vertex UUID across - perturbation retries to maintain vertex identity. - - Updates documentation on topology guarantees to clarify - manifoldness invariants. - -#### Changed: Improves PL-manifold validation with vertex-link check - - Replaces ridge-link validation with vertex-link validation for - PL-manifold topology guarantee. This change provides a more - robust and canonical check for PL-manifoldness, ensuring that - the link of every vertex is a sphere or ball of the appropriate - dimension. - -### Maintenance - -- Bump clap from 4.5.53 to 4.5.54 in the dependencies group [#166](https://github.com/acgetchell/delaunay/pull/166) - [`ebd0d32`](https://github.com/acgetchell/delaunay/commit/ebd0d32e3552b2e94af021995df8c9c1431ccc1b) - - Bumps the dependencies group with 1 update: [clap](https://github.com/clap-rs/clap). - - Updates `clap` from 4.5.53 to 4.5.54 - - - [Release notes](https://github.com/clap-rs/clap/releases) - - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.53...clap_complete-v4.5.54) - ---- - - updated-dependencies: - -- dependency-name: clap - dependency-version: 4.5.54 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - -- Bump taiki-e/install-action from 2.65.7 to 2.65.13 [#165](https://github.com/acgetchell/delaunay/pull/165) - [`6b5f723`](https://github.com/acgetchell/delaunay/commit/6b5f723cf9f71599bedef098b3f226f4786ce539) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.65.7 to 2.65.13. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/4c6723ec9c638cccae824b8957c5085b695c8085...0e76c5c569f13f7eb21e8e5b26fe710062b57b62) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.65.13 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - -- Bump astral-sh/setup-uv from 7.1.6 to 7.2.0 [#170](https://github.com/acgetchell/delaunay/pull/170) - [`b50bb8c`](https://github.com/acgetchell/delaunay/commit/b50bb8c4157496c99e9879b5c7214815ddbca633) - - Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.6 to 7.2.0. - - - [Release notes](https://github.com/astral-sh/setup-uv/releases) - - [Commits](https://github.com/astral-sh/setup-uv/compare/681c641aba71e4a1c380be3ab5e12ad51f415867...61cb8a9741eeb8a550a1b8544337180c0fc8476b) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.2.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - -- Bump taiki-e/install-action from 2.65.13 to 2.66.1 [#169](https://github.com/acgetchell/delaunay/pull/169) - [`44d3add`](https://github.com/acgetchell/delaunay/commit/44d3add45bdac8daff9cff6b686929959ccf84a3) - - Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.65.13 to 2.66.1. - - - [Release notes](https://github.com/taiki-e/install-action/releases) - - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - - [Commits](https://github.com/taiki-e/install-action/compare/0e76c5c569f13f7eb21e8e5b26fe710062b57b62...3522286d40783523f9c7880e33f785905b4c20d0) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.66.1 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - ## Archives Older releases are archived by minor series: +- [0.7.x](docs/archive/changelog/0.7.md) - [0.6.x](docs/archive/changelog/0.6.md) - [0.5.x](docs/archive/changelog/0.5.md) - [0.4.x](docs/archive/changelog/0.4.md) - [0.3.x](docs/archive/changelog/0.3.md) - [0.2.x](docs/archive/changelog/0.2.md) -[Unreleased]: https://github.com/acgetchell/delaunay/compare/v0.7.8...HEAD -[0.7.8]: https://github.com/acgetchell/delaunay/compare/v0.7.7...v0.7.8 -[0.7.7]: https://github.com/acgetchell/delaunay/compare/v0.7.6...v0.7.7 -[0.7.6]: https://github.com/acgetchell/delaunay/compare/v0.7.5...v0.7.6 -[0.7.5]: https://github.com/acgetchell/delaunay/compare/v0.7.4...v0.7.5 -[0.7.4]: https://github.com/acgetchell/delaunay/compare/v0.7.3...v0.7.4 -[0.7.3]: https://github.com/acgetchell/delaunay/compare/v0.7.2...v0.7.3 -[0.7.2]: https://github.com/acgetchell/delaunay/compare/v0.7.1...v0.7.2 -[0.7.1]: https://github.com/acgetchell/delaunay/compare/v0.7.0...v0.7.1 -[0.7.0]: https://github.com/acgetchell/delaunay/compare/v0.6.2...v0.7.0 +[0.8.0]: https://github.com/acgetchell/delaunay/compare/v0.7.8...v0.8.0 diff --git a/CITATION.cff b/CITATION.cff index bca16748..beb95053 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,9 +2,9 @@ cff-version: 1.2.0 message: "If you use this software, please cite it as below." type: software title: "delaunay: A d-dimensional Delaunay triangulation library" -version: 0.7.8 +version: 0.8.0 doi: 10.5281/zenodo.16931097 -date-released: 2026-05-21 +date-released: 2026-07-27 url: "https://github.com/acgetchell/delaunay" repository-code: "https://github.com/acgetchell/delaunay" authors: diff --git a/Cargo.lock b/Cargo.lock index 64e04d88..39664243 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,7 +307,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "delaunay" -version = "0.7.8" +version = "0.8.0" dependencies = [ "allocation-counter", "approx", diff --git a/Cargo.toml b/Cargo.toml index d4bd7e2d..3b594bb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "delaunay" -version = "0.7.8" +version = "0.8.0" edition = "2024" rust-version = "1.97.1" autobins = false diff --git a/README.md b/README.md index 2f9a2afc..1d172f4b 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Choose the path that matches your use case: Add the crate to your project: ```bash -cargo add delaunay@0.7.8 +cargo add delaunay@0.8.0 ``` Use `cargo add delaunay` instead if you want Cargo to select the newest published release. diff --git a/benches/PERFORMANCE_RESULTS.md b/benches/PERFORMANCE_RESULTS.md index 0954697d..2bea96e0 100644 --- a/benches/PERFORMANCE_RESULTS.md +++ b/benches/PERFORMANCE_RESULTS.md @@ -3,49 +3,49 @@ This file contains performance benchmarks and analysis for the delaunay library. The results are automatically generated and updated by the benchmark infrastructure. -- **Last Updated**: 2026-05-21 21:04:39 UTC +- **Last Updated**: 2026-07-27 17:07:32 UTC - **Generated By**: benchmark_utils.py -- **Git Commit**: 3456ca96abeeee5efb2ef413c3eb91d57f3921b4 +- **Git Commit**: 1f15b9352456aca9eade44d116cd8d15d3d1ac20 - **Hardware**: Apple M4 Max (16 cores) - **Memory**: 64.0 GB - **OS**: macOS -- **Rust**: rustc 1.95.0 (59807616e 2026-04-14) +- **Rust**: rustc 1.97.1 (8bab26f4f 2026-07-14) ## Triangulation Data Structure Performance ### Current Criterion Run Information -- **Date: 2026-05-21 21:01:27 UTC** -- **Git commit: 3456ca96abeeee5efb2ef413c3eb91d57f3921b4** +- **Date: unavailable** +- **Git commit: 1f15b9352456aca9eade44d116cd8d15d3d1ac20** - **Source: current `target/criterion` construction results** ### 2D Triangulation Performance | Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated | |--------------|--------|-------------|-------------------|---------------------| -| `tds_new_2d/tds_new/4000` | 4000 | 1154.959 ms | 3.463 Kelem/s | 7,974 | -| `tds_new_2d/tds_new_adversarial/4000` | 4000 | 1318.191 ms | 3.034 Kelem/s | 7,971 | +| `tds_new_2d/tds_new/4000` | 4000 | 1268.172 ms | 3.154 Kelem/s | N/A | +| `tds_new_2d/tds_new_adversarial/4000` | 4000 | 1352.241 ms | 2.958 Kelem/s | N/A | ### 3D Triangulation Performance | Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated | |--------------|--------|-------------|-------------------|---------------------| -| `tds_new_3d/tds_new/750` | 750 | 884.208 ms | 0.848 Kelem/s | 4,663 | -| `tds_new_3d/tds_new_adversarial/750` | 750 | 1123.063 ms | 0.668 Kelem/s | 4,726 | +| `tds_new_3d/tds_new/750` | 750 | 772.417 ms | 0.971 Kelem/s | N/A | +| `tds_new_3d/tds_new_adversarial/750` | 750 | 911.729 ms | 0.823 Kelem/s | N/A | ### 4D Triangulation Performance | Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated | |--------------|--------|-------------|-------------------|---------------------| -| `tds_new_4d/tds_new/75` | 75 | 901.804 ms | 0.083 Kelem/s | 1,105 | -| `tds_new_4d/tds_new_adversarial/75` | 75 | 953.070 ms | 0.079 Kelem/s | 1,129 | +| `tds_new_4d/tds_new/75` | 75 | 629.035 ms | 0.119 Kelem/s | N/A | +| `tds_new_4d/tds_new_adversarial/75` | 75 | 664.791 ms | 0.113 Kelem/s | N/A | ### 5D Triangulation Performance | Benchmark ID | Vertices | Time (mean) | Throughput (mean) | Simplices Generated | |--------------|--------|-------------|-------------------|---------------------| -| `tds_new_5d/tds_new/25` | 25 | 997.657 ms | 0.025 Kelem/s | 421 | -| `tds_new_5d/tds_new_adversarial/25` | 25 | 871.978 ms | 0.029 Kelem/s | 410 | +| `tds_new_5d/tds_new/25` | 25 | 732.645 ms | 0.034 Kelem/s | N/A | +| `tds_new_5d/tds_new_adversarial/25` | 25 | 628.691 ms | 0.040 Kelem/s | N/A | ## Performance Results Summary @@ -57,18 +57,18 @@ boundary traversal, and explicit bistellar flip roundtrips. #### Construction -Public API: `DelaunayTriangulation::builder(...).construction_options(...).build()` +Public API: `DelaunayTriangulation::new_with_options` | Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | |--------------|-----------|-------|---------|------|--------| -| `tds_new_2d/tds_new/4000` | 2D | 4000 | well-conditioned | 1.155 s | 1.154 s - 1.156 s | -| `tds_new_2d/tds_new_adversarial/4000` | 2D | 4000 | adversarial | 1.318 s | 1.314 s - 1.325 s | -| `tds_new_3d/tds_new/750` | 3D | 750 | well-conditioned | 884.208 ms | 882.600 ms - 886.255 ms | -| `tds_new_3d/tds_new_adversarial/750` | 3D | 750 | adversarial | 1.123 s | 1.121 s - 1.125 s | -| `tds_new_4d/tds_new/75` | 4D | 75 | well-conditioned | 901.804 ms | 889.885 ms - 916.534 ms | -| `tds_new_4d/tds_new_adversarial/75` | 4D | 75 | adversarial | 953.070 ms | 948.482 ms - 957.962 ms | -| `tds_new_5d/tds_new/25` | 5D | 25 | well-conditioned | 997.657 ms | 982.027 ms - 1.025 s | -| `tds_new_5d/tds_new_adversarial/25` | 5D | 25 | adversarial | 871.978 ms | 868.052 ms - 877.029 ms | +| `tds_new_2d/tds_new/4000` | 2D | 4000 | well-conditioned | 1.268 s | 1.263 s - 1.275 s | +| `tds_new_2d/tds_new_adversarial/4000` | 2D | 4000 | adversarial | 1.352 s | 1.348 s - 1.357 s | +| `tds_new_3d/tds_new/750` | 3D | 750 | well-conditioned | 772.417 ms | 771.435 ms - 773.388 ms | +| `tds_new_3d/tds_new_adversarial/750` | 3D | 750 | adversarial | 911.729 ms | 910.397 ms - 912.878 ms | +| `tds_new_4d/tds_new/75` | 4D | 75 | well-conditioned | 629.035 ms | 626.526 ms - 631.668 ms | +| `tds_new_4d/tds_new_adversarial/75` | 4D | 75 | adversarial | 664.791 ms | 662.769 ms - 666.761 ms | +| `tds_new_5d/tds_new/25` | 5D | 25 | well-conditioned | 732.645 ms | 724.367 ms - 742.284 ms | +| `tds_new_5d/tds_new_adversarial/25` | 5D | 25 | adversarial | 628.691 ms | 623.966 ms - 633.918 ms | #### Boundary facets @@ -76,29 +76,29 @@ Public API: `DelaunayTriangulation::boundary_facets` | Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | |--------------|-----------|-------|---------|------|--------| -| `boundary_facets/boundary_facets_2d/4000` | 2D | 4000 | well-conditioned | 1.694 ms | 1.690 ms - 1.698 ms | -| `boundary_facets/boundary_facets_2d_adversarial/4000` | 2D | 4000 | adversarial | 1.694 ms | 1.690 ms - 1.698 ms | -| `boundary_facets/boundary_facets_3d/750` | 3D | 750 | well-conditioned | 1.492 ms | 1.489 ms - 1.496 ms | -| `boundary_facets/boundary_facets_3d_adversarial/750` | 3D | 750 | adversarial | 1.511 ms | 1.505 ms - 1.518 ms | -| `boundary_facets/boundary_facets_4d/75` | 4D | 75 | well-conditioned | 498.7 µs | 493.5 µs - 504.7 µs | -| `boundary_facets/boundary_facets_4d_adversarial/75` | 4D | 75 | adversarial | 503.2 µs | 499.1 µs - 507.4 µs | -| `boundary_facets/boundary_facets_5d/25` | 5D | 25 | well-conditioned | 241.6 µs | 239.1 µs - 244.0 µs | -| `boundary_facets/boundary_facets_5d_adversarial/25` | 5D | 25 | adversarial | 234.2 µs | 230.7 µs - 238.1 µs | +| `boundary_facets/boundary_facets_2d/4000` | 2D | 4000 | well-conditioned | 1.764 ms | 1.756 ms - 1.774 ms | +| `boundary_facets/boundary_facets_2d_adversarial/4000` | 2D | 4000 | adversarial | 1.780 ms | 1.767 ms - 1.792 ms | +| `boundary_facets/boundary_facets_3d/750` | 3D | 750 | well-conditioned | 1.591 ms | 1.583 ms - 1.600 ms | +| `boundary_facets/boundary_facets_3d_adversarial/750` | 3D | 750 | adversarial | 1.614 ms | 1.608 ms - 1.621 ms | +| `boundary_facets/boundary_facets_4d/75` | 4D | 75 | well-conditioned | 564.7 µs | 560.9 µs - 568.7 µs | +| `boundary_facets/boundary_facets_4d_adversarial/75` | 4D | 75 | adversarial | 573.9 µs | 570.1 µs - 578.3 µs | +| `boundary_facets/boundary_facets_5d/25` | 5D | 25 | well-conditioned | 315.2 µs | 312.0 µs - 318.5 µs | +| `boundary_facets/boundary_facets_5d_adversarial/25` | 5D | 25 | adversarial | 297.8 µs | 295.5 µs - 300.1 µs | #### Convex hull -Public API: `ConvexHull::try_from_triangulation` +Public API: `ConvexHull::from_triangulation` | Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | |--------------|-----------|-------|---------|------|--------| -| `convex_hull/from_triangulation_2d/4000` | 2D | 4000 | well-conditioned | 1.700 ms | 1.698 ms - 1.703 ms | -| `convex_hull/from_triangulation_2d_adversarial/4000` | 2D | 4000 | adversarial | 1.694 ms | 1.690 ms - 1.698 ms | -| `convex_hull/from_triangulation_3d/750` | 3D | 750 | well-conditioned | 1.489 ms | 1.485 ms - 1.494 ms | -| `convex_hull/from_triangulation_3d_adversarial/750` | 3D | 750 | adversarial | 1.512 ms | 1.508 ms - 1.517 ms | -| `convex_hull/from_triangulation_4d/75` | 4D | 75 | well-conditioned | 505.6 µs | 501.9 µs - 509.6 µs | -| `convex_hull/from_triangulation_4d_adversarial/75` | 4D | 75 | adversarial | 518.8 µs | 514.0 µs - 523.4 µs | -| `convex_hull/from_triangulation_5d/25` | 5D | 25 | well-conditioned | 242.6 µs | 239.1 µs - 246.7 µs | -| `convex_hull/from_triangulation_5d_adversarial/25` | 5D | 25 | adversarial | 233.8 µs | 231.8 µs - 236.0 µs | +| `convex_hull/from_triangulation_2d/4000` | 2D | 4000 | well-conditioned | 1.764 ms | 1.754 ms - 1.775 ms | +| `convex_hull/from_triangulation_2d_adversarial/4000` | 2D | 4000 | adversarial | 1.822 ms | 1.811 ms - 1.832 ms | +| `convex_hull/from_triangulation_3d/750` | 3D | 750 | well-conditioned | 1.597 ms | 1.588 ms - 1.607 ms | +| `convex_hull/from_triangulation_3d_adversarial/750` | 3D | 750 | adversarial | 1.629 ms | 1.614 ms - 1.649 ms | +| `convex_hull/from_triangulation_4d/75` | 4D | 75 | well-conditioned | 560.9 µs | 559.5 µs - 562.3 µs | +| `convex_hull/from_triangulation_4d_adversarial/75` | 4D | 75 | adversarial | 582.6 µs | 577.8 µs - 589.0 µs | +| `convex_hull/from_triangulation_5d/25` | 5D | 25 | well-conditioned | 320.2 µs | 317.4 µs - 323.1 µs | +| `convex_hull/from_triangulation_5d_adversarial/25` | 5D | 25 | adversarial | 303.0 µs | 300.2 µs - 305.6 µs | #### Validation @@ -106,76 +106,46 @@ Public API: `DelaunayTriangulation::validate` | Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | |--------------|-----------|-------|---------|------|--------| -| `validation/validate_3d/750` | 3D | 750 | well-conditioned | 34.983 ms | 34.853 ms - 35.141 ms | -| `validation/validate_3d_adversarial/750` | 3D | 750 | adversarial | 45.030 ms | 44.832 ms - 45.262 ms | -| `validation/validate_4d/75` | 4D | 75 | well-conditioned | 70.964 ms | 70.685 ms - 71.272 ms | -| `validation/validate_4d_adversarial/75` | 4D | 75 | adversarial | 68.111 ms | 67.652 ms - 68.595 ms | -| `validation/validate_5d/25` | 5D | 25 | well-conditioned | 62.154 ms | 62.044 ms - 62.266 ms | -| `validation/validate_5d_adversarial/25` | 5D | 25 | adversarial | 58.031 ms | 57.786 ms - 58.297 ms | - -#### Incremental insert - -Public API: `DelaunayTriangulation::insert_vertex` - -| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | -|--------------|-----------|-------|---------|------|--------| -| `incremental_insert/insert_2d/10` | 2D | 10 | well-conditioned | 4.551 ms | 4.537 ms - 4.569 ms | -| `incremental_insert/insert_2d_adversarial/10` | 2D | 10 | adversarial | 7.049 ms | 6.915 ms - 7.241 ms | -| `incremental_insert/insert_3d/10` | 3D | 10 | well-conditioned | 6.189 ms | 6.151 ms - 6.233 ms | -| `incremental_insert/insert_3d_adversarial/10` | 3D | 10 | adversarial | 45.273 ms | 45.073 ms - 45.459 ms | -| `incremental_insert/insert_4d/6` | 4D | 6 | well-conditioned | 47.436 ms | 46.955 ms - 47.968 ms | -| `incremental_insert/insert_4d_adversarial/6` | 4D | 6 | adversarial | 145.440 ms | 144.901 ms - 146.033 ms | -| `incremental_insert/insert_5d/4` | 5D | 4 | well-conditioned | 619.248 ms | 615.715 ms - 622.850 ms | -| `incremental_insert/insert_5d_adversarial/4` | 5D | 4 | adversarial | 635.775 ms | 634.427 ms - 637.273 ms | - -#### Bistellar flips - -Public API: `BistellarFlips` - -| Benchmark ID | Dimension | Input | Variant | Mean | 95% CI | -|--------------|-----------|-------|---------|------|--------| -| `bistellar_flips_4d/k1_roundtrip` | 4D | roundtrip | well-conditioned | 189.6 µs | 187.8 µs - 191.1 µs | -| `bistellar_flips_4d/k2_roundtrip` | 4D | roundtrip | well-conditioned | 186.0 µs | 184.4 µs - 187.9 µs | -| `bistellar_flips_4d/k3_roundtrip` | 4D | roundtrip | well-conditioned | 186.5 µs | 185.0 µs - 187.8 µs | +| `validation/validate_3d/750` | 3D | 750 | well-conditioned | 8.723 s | 8.706 s - 8.741 s | ### Circumsphere Predicate Performance This focused predicate suite tracks `la-stack`-backed circumsphere and insphere query performance independently from full triangulation workflows. -#### Version 0.7.8 Results (2026-05-21) +#### Version 0.8.0 Results (2026-07-27) #### Single Query Performance (2D) | Test Case | insphere | insphere_distance | insphere_lifted | Winner | |-----------|----------|------------------|-----------------|---------| -| Basic 2D | 18 ns | 23 ns | 8 ns | **insphere_lifted** | -| Boundary vertex | 1 ns | 24 ns | 209 ns | **insphere** | -| Far vertex | 17 ns | 24 ns | 8 ns | **insphere_lifted** | +| Basic 2D | 20 ns | 21 ns | 12 ns | **insphere_lifted** | +| Boundary vertex | 1 ns | 20 ns | 93 ns | **insphere** | +| Far vertex | 20 ns | 20 ns | 12 ns | **insphere_lifted** | #### Single Query Performance (3D) | Test Case | insphere | insphere_distance | insphere_lifted | Winner | |-----------|----------|------------------|-----------------|---------| -| Basic 3D | 2.1 µs | 26 ns | 18 ns | **insphere_lifted** | -| Boundary vertex | 1 ns | 26 ns | 436 ns | **insphere** | -| Far vertex | 2.1 µs | 26 ns | 18 ns | **insphere_lifted** | +| Basic 3D | 1.5 µs | 60 ns | 20 ns | **insphere_lifted** | +| Boundary vertex | 1 ns | 43 ns | 167 ns | **insphere** | +| Far vertex | 1.1 µs | 43 ns | 19 ns | **insphere_lifted** | #### Single Query Performance (4D) | Test Case | insphere | insphere_distance | insphere_lifted | Winner | |-----------|----------|------------------|-----------------|---------| -| Basic 4D | 5.3 µs | 56 ns | 2.9 µs | **insphere_distance** | -| Boundary vertex | 2 ns | 54 ns | 1.4 µs | **insphere** | -| Far vertex | 3.3 µs | 54 ns | 1.8 µs | **insphere_distance** | +| Basic 4D | 4.4 µs | 74 ns | 2.4 µs | **insphere_distance** | +| Boundary vertex | 1 ns | 69 ns | 859 ns | **insphere** | +| Far vertex | 1.7 µs | 69 ns | 1.0 µs | **insphere_distance** | #### Single Query Performance (5D) | Test Case | insphere | insphere_distance | insphere_lifted | Winner | |-----------|----------|------------------|-----------------|---------| -| Basic 5D | 8.4 µs | 83 ns | 4.9 µs | **insphere_distance** | -| Boundary vertex | 2 ns | 81 ns | 2.3 µs | **insphere** | -| Far vertex | 5.2 µs | 81 ns | 2.9 µs | **insphere_distance** | +| Basic 5D | 7.2 µs | 115 ns | 4.3 µs | **insphere_distance** | +| Boundary vertex | 1 ns | 115 ns | 1.4 µs | **insphere** | +| Far vertex | 2.8 µs | 114 ns | 1.7 µs | **insphere_distance** | ## Implementation Notes diff --git a/benches/README.md b/benches/README.md index 2f5446d0..3e5abd81 100644 --- a/benches/README.md +++ b/benches/README.md @@ -250,11 +250,10 @@ just bench-compare last `just bench-latest` runs Delaunay's curated release-signal set: `ci_performance_suite`, `circumsphere_containment`, `cold_path_predicates`, -`topology_guarantee_construction`, and `locate`. This set covers public -construction and validation workflows, circumsphere/insphere query families, -hot and cold predicate paths, topology guarantee construction, and point -location without pulling in broad profiling or allocation-only runs. Use -`just bench-compare ` to render +and `locate`. This set covers public construction and validation workflows, +circumsphere/insphere query families, hot and cold predicate paths, and point +location without pulling in broad profiling, allocation-only runs, or the +manual topology policy suite. Use `just bench-compare ` to render `target/bench-reports/performance.md` from existing Criterion `new` output and a saved baseline such as `last` or `v0.7.8`. If the baseline and current checkouts are easy to confuse, prefer `just perf-local`. Use diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md new file mode 100644 index 00000000..268937ea --- /dev/null +++ b/docs/PERFORMANCE.md @@ -0,0 +1,475 @@ +# Benchmark Performance + +**delaunay** v0.8.0 · `1f15b9352` (HEAD) · 2026-07-27 23:33:25 UTC +**Statistic**: median +**Suite**: release-signal +**Scope**: release-signal + +## Environment + +- **Cargo profile**: `perf` +- **Raw Criterion data**: `target/criterion/` +- **OS**: macOS +- **CPU**: Apple M4 Max (16 cores, 16 threads) +- **Memory**: 64.0 GB +- **Rust**: rustc 1.97.1 (8bab26f4f 2026-07-14) +- **Target**: aarch64-apple-darwin + +## Benchmark Results + +Comparison against baseline **v0.7.8**: + +Negative change = faster. Speedup > 1.00x = improvement. + +### 2d_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 2d_insphere | 17.5 ns | 20.1 ns | +14.9% | 0.87x | + +### 2d_insphere_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 2d_insphere_distance | 27.0 ns | 20.7 ns | **-23.3%** | 1.30x | + +### 2d_insphere_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 2d_insphere_lifted | 8.2 ns | 11.7 ns | +42.5% | 0.70x | + +### 3d_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 3d_insphere | 2.17 µs | 1.47 µs | **-32.2%** | 1.48x | + +### 3d_insphere_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 3d_insphere_distance | 26.1 ns | 35.2 ns | +34.8% | 0.74x | + +### 3d_insphere_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 3d_insphere_lifted | 18.7 ns | 19.4 ns | +3.9% | 0.96x | + +### 4d_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 4d_insphere | 5.23 µs | 4.38 µs | **-16.2%** | 1.19x | + +### 4d_insphere_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 4d_insphere_distance | 54.9 ns | 87.4 ns | +59.1% | 0.63x | + +### 4d_insphere_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 4d_insphere_lifted | 2.88 µs | 2.33 µs | **-19.0%** | 1.23x | + +### 5d_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 5d_insphere | 8.44 µs | 7.14 µs | **-15.4%** | 1.18x | + +### 5d_insphere_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 5d_insphere_distance | 82.2 ns | 102.6 ns | +24.8% | 0.80x | + +### 5d_insphere_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| 5d_insphere_lifted | 4.91 µs | 4.30 µs | **-12.4%** | 1.14x | + +### bistellar_flips_4d + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| k1_roundtrip | 180.50 µs | 592.80 ms | +328318.3% | 0.00x | +| k2_roundtrip | 180.61 µs | 631.28 ms | +349430.8% | 0.00x | +| k3_roundtrip | 181.34 µs | 588.72 ms | +324551.4% | 0.00x | + +### boundary_facets + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| boundary_facets_2d/4000 | 1.70 ms | 1.76 ms | +3.4% | 0.97x | +| boundary_facets_2d_adversarial/4000 | 1.70 ms | 1.76 ms | +3.2% | 0.97x | +| boundary_facets_3d/750 | 1.48 ms | 1.58 ms | +6.5% | 0.94x | +| boundary_facets_3d_adversarial/750 | 1.54 ms | 1.62 ms | +5.1% | 0.95x | +| boundary_facets_4d/75 | 483.70 µs | 568.61 µs | +17.6% | 0.85x | +| boundary_facets_4d_adversarial/75 | 508.26 µs | 580.58 µs | +14.2% | 0.88x | +| boundary_facets_5d/25 | 245.84 µs | 315.14 µs | +28.2% | 0.78x | +| boundary_facets_5d_adversarial/25 | 235.00 µs | 293.67 µs | +25.0% | 0.80x | + +### convex_hull + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| from_triangulation_2d/4000 | 1.70 ms | 1.81 ms | +6.5% | 0.94x | +| from_triangulation_2d_adversarial/4000 | 1.72 ms | 1.77 ms | +2.5% | 0.98x | +| from_triangulation_3d/750 | 1.48 ms | 1.59 ms | +7.0% | 0.93x | +| from_triangulation_3d_adversarial/750 | 1.51 ms | 1.61 ms | +6.2% | 0.94x | +| from_triangulation_4d/75 | 479.42 µs | 569.31 µs | +18.8% | 0.84x | +| from_triangulation_4d_adversarial/75 | 500.87 µs | 589.94 µs | +17.8% | 0.85x | +| from_triangulation_5d/25 | 243.74 µs | 318.63 µs | +30.7% | 0.76x | +| from_triangulation_5d_adversarial/25 | 238.16 µs | 293.31 µs | +23.2% | 0.81x | + +### convex_hull_queries + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| find_nearest_visible_facet_3d/750 | 25.85 µs | 26.68 µs | +3.2% | 0.97x | +| find_nearest_visible_facet_3d_adversarial/750 | 540.65 µs | 325.11 µs | **-39.9%** | 1.66x | +| find_visible_facets_3d/750 | 24.23 µs | 23.42 µs | **-3.4%** | 1.03x | +| find_visible_facets_3d_adversarial/750 | 535.71 µs | 321.04 µs | **-40.1%** | 1.67x | +| is_point_outside_3d/750 | 24.38 µs | 23.60 µs | **-3.2%** | 1.03x | +| is_point_outside_3d_adversarial/750 | 533.14 µs | 328.41 µs | **-38.4%** | 1.62x | + +### edge_cases_2d_boundary_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_boundary_point_distance | 22.3 ns | 20.8 ns | **-6.5%** | 1.07x | + +### edge_cases_2d_boundary_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_boundary_point_insphere | 1.3 ns | 1.0 ns | **-20.5%** | 1.26x | + +### edge_cases_2d_boundary_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_boundary_point_lifted | 194.3 ns | 91.7 ns | **-52.8%** | 2.12x | + +### edge_cases_2d_far_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_far_point_distance | 22.4 ns | 20.7 ns | **-7.9%** | 1.09x | + +### edge_cases_2d_far_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_far_point_insphere | 17.4 ns | 19.6 ns | +12.7% | 0.89x | + +### edge_cases_2d_far_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_far_point_lifted | 8.0 ns | 11.7 ns | +46.2% | 0.68x | + +### edge_cases_2d_near_boundary_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_near_boundary_distance | 22.5 ns | 20.7 ns | **-8.3%** | 1.09x | + +### edge_cases_2d_near_boundary_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_near_boundary_insphere | 17.5 ns | 21.4 ns | +22.2% | 0.82x | + +### edge_cases_2d_near_boundary_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_2d_near_boundary_lifted | 8.2 ns | 13.7 ns | +66.0% | 0.60x | + +### edge_cases_3d_boundary_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_boundary_point_distance | 25.9 ns | 35.3 ns | +36.2% | 0.73x | + +### edge_cases_3d_boundary_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_boundary_point_insphere | 1.3 ns | 1.3 ns | **-1.8%** | 1.02x | + +### edge_cases_3d_boundary_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_boundary_point_lifted | 427.0 ns | 167.5 ns | **-60.8%** | 2.55x | + +### edge_cases_3d_far_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_far_point_distance | 25.7 ns | 35.6 ns | +38.7% | 0.72x | + +### edge_cases_3d_far_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_far_point_insphere | 2.11 µs | 1.13 µs | **-46.6%** | 1.87x | + +### edge_cases_3d_far_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_far_point_lifted | 18.0 ns | 19.7 ns | +9.5% | 0.91x | + +### edge_cases_3d_near_boundary_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_near_boundary_distance | 25.9 ns | 34.8 ns | +34.5% | 0.74x | + +### edge_cases_3d_near_boundary_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_near_boundary_insphere | 3.55 µs | 3.16 µs | **-11.1%** | 1.12x | + +### edge_cases_3d_near_boundary_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_3d_near_boundary_lifted | 18.0 ns | 24.1 ns | +33.7% | 0.75x | + +### edge_cases_4d_boundary_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_boundary_point_distance | 54.6 ns | 70.4 ns | +28.9% | 0.78x | + +### edge_cases_4d_boundary_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_boundary_point_insphere | 1.5 ns | 1.2 ns | **-25.1%** | 1.34x | + +### edge_cases_4d_boundary_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_boundary_point_lifted | 1.49 µs | 881.4 ns | **-40.9%** | 1.69x | + +### edge_cases_4d_far_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_far_point_distance | 54.8 ns | 70.8 ns | +29.2% | 0.77x | + +### edge_cases_4d_far_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_far_point_insphere | 3.38 µs | 1.76 µs | **-47.9%** | 1.92x | + +### edge_cases_4d_far_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_far_point_lifted | 1.87 µs | 981.2 ns | **-47.7%** | 1.91x | + +### edge_cases_4d_near_boundary_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_near_boundary_distance | 54.9 ns | 70.3 ns | +28.1% | 0.78x | + +### edge_cases_4d_near_boundary_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_near_boundary_insphere | 6.09 µs | 5.46 µs | **-10.3%** | 1.11x | + +### edge_cases_4d_near_boundary_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_4d_near_boundary_lifted | 3.07 µs | 2.72 µs | **-11.6%** | 1.13x | + +### edge_cases_5d_boundary_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_boundary_point_distance | 82.1 ns | 102.0 ns | +24.2% | 0.81x | + +### edge_cases_5d_boundary_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_boundary_point_insphere | 2.5 ns | 1.4 ns | **-43.3%** | 1.76x | + +### edge_cases_5d_boundary_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_boundary_point_lifted | 2.33 µs | 1.41 µs | **-39.4%** | 1.65x | + +### edge_cases_5d_far_point_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_far_point_distance | 82.2 ns | 101.8 ns | +23.8% | 0.81x | + +### edge_cases_5d_far_point_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_far_point_insphere | 5.19 µs | 2.72 µs | **-47.5%** | 1.91x | + +### edge_cases_5d_far_point_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_far_point_lifted | 2.94 µs | 1.63 µs | **-44.6%** | 1.81x | + +### edge_cases_5d_near_boundary_distance + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_near_boundary_distance | 82.5 ns | 101.8 ns | +23.4% | 0.81x | + +### edge_cases_5d_near_boundary_insphere + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_near_boundary_insphere | 9.91 µs | 8.71 µs | **-12.1%** | 1.14x | + +### edge_cases_5d_near_boundary_lifted + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| edge_cases_5d_near_boundary_lifted | 5.07 µs | 4.69 µs | **-7.4%** | 1.08x | + +### incremental_insert + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| insert_2d/10 | 4.54 ms | 5.54 ms | +22.0% | 0.82x | +| insert_2d_adversarial/10 | 6.94 ms | 6.74 ms | **-3.0%** | 1.03x | +| insert_3d/10 | 6.11 ms | 5.44 ms | **-11.0%** | 1.12x | +| insert_3d_adversarial/10 | 45.11 ms | 39.17 ms | **-13.2%** | 1.15x | +| insert_4d/6 | 46.84 ms | 28.78 ms | **-38.6%** | 1.63x | +| insert_4d_adversarial/6 | 148.27 ms | 118.53 ms | **-20.1%** | 1.25x | +| insert_5d/4 | 620.19 ms | 452.37 ms | **-27.1%** | 1.37x | +| insert_5d_adversarial/4 | 610.70 ms | 442.25 ms | **-27.6%** | 1.38x | + +### predicates_hot + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| insphere_2d/10000 | 121.85 µs | 205.73 µs | +68.8% | 0.59x | +| insphere_3d/10000 | 32.50 ms | 25.40 ms | **-21.9%** | 1.28x | +| insphere_4d/10000 | 54.22 ms | 47.01 ms | **-13.3%** | 1.15x | +| insphere_5d/10000 | 87.09 ms | 75.06 ms | **-13.8%** | 1.16x | +| insphere_lifted_2d/10000 | 68.61 µs | 113.38 µs | +65.2% | 0.61x | +| insphere_lifted_3d/10000 | 156.42 µs | 193.24 µs | +23.5% | 0.81x | +| insphere_lifted_4d/10000 | 30.81 ms | 26.21 ms | **-14.9%** | 1.18x | +| insphere_lifted_5d/10000 | 51.78 ms | 44.30 ms | **-14.5%** | 1.17x | + +### predicates_near_boundary + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| insphere_2d/1000 | 11.77 µs | 19.93 µs | +69.3% | 0.59x | +| insphere_3d/1000 | 3.34 ms | 2.57 ms | **-23.2%** | 1.30x | +| insphere_4d/1000 | 5.58 ms | 4.75 ms | **-14.9%** | 1.17x | +| insphere_lifted_2d/1000 | 6.89 µs | 11.37 µs | +65.1% | 0.61x | +| insphere_lifted_3d/1000 | 15.92 µs | 19.62 µs | +23.2% | 0.81x | +| insphere_lifted_4d/1000 | 3.06 ms | 2.51 ms | **-18.1%** | 1.22x | + +### random_insphere_1000_queries + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| random_insphere_1000_queries | 6.65 ms | 5.62 ms | **-15.5%** | 1.18x | + +### random_insphere_distance_1000_queries + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| random_insphere_distance_1000_queries | 39.82 µs | 49.46 µs | +24.2% | 0.80x | + +### random_insphere_lifted_1000_queries + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| random_insphere_lifted_1000_queries | 22.92 µs | 27.25 µs | +18.9% | 0.84x | + +### tds_new_2d + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| tds_new/4000 | 1.19 s | 1.27 s | +7.1% | 0.93x | +| tds_new_adversarial/4000 | 1.33 s | 1.37 s | +3.4% | 0.97x | + +### tds_new_3d + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| tds_new/750 | 899.38 ms | 776.60 ms | **-13.7%** | 1.16x | +| tds_new_adversarial/750 | 1.15 s | 921.80 ms | **-19.9%** | 1.25x | + +### tds_new_4d + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| tds_new/75 | 886.29 ms | 641.04 ms | **-27.7%** | 1.38x | +| tds_new_adversarial/75 | 959.67 ms | 676.12 ms | **-29.5%** | 1.42x | + +### tds_new_5d + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| tds_new/25 | 986.17 ms | 724.38 ms | **-26.5%** | 1.36x | +| tds_new_adversarial/25 | 874.73 ms | 616.45 ms | **-29.5%** | 1.42x | + +### validation + +| Benchmark | v0.7.8 | Latest | Change | Speedup | +|-----------|-------:|-------:|-------:|--------:| +| validate_3d/750 | 35.73 ms | 8.64 s | +24088.1% | 0.00x | +| validate_3d_adversarial/750 | 46.44 ms | 12.89 s | +27647.3% | 0.00x | +| validate_4d/75 | 72.32 ms | 23.75 s | +32746.4% | 0.00x | +| validate_4d_adversarial/75 | 68.22 ms | 32.97 s | +48232.3% | 0.00x | +| validate_5d/25 | 62.27 ms | 33.31 s | +53396.3% | 0.00x | +| validate_5d_adversarial/25 | 57.29 ms | 41.63 s | +72559.1% | 0.00x | + +## How to Update + +Local performance reports are generated in isolated temporary worktrees: + +```bash +# Local development: compare the current tree with the latest release +just perf-local + +# Release PR: update docs/PERFORMANCE.md and archive the previous report +just perf-release + +# GitHub Release benchmark assets +just perf-github-assets + +# Explicit repair +just perf-release +``` + +`just perf-local` writes `target/bench-reports/performance.md`. +`just perf-github-assets` writes `target/bench-reports/github-assets-performance.md`. + +Release-comparison commands are release evidence, not routine pre-`just ci` checks. +Older curated release-to-release reports are archived in `docs/archive/performance/`. + +See `benches/README.md` for the full Delaunay benchmark workflow. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 3690e1d2..fa5bc442 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -99,10 +99,10 @@ just docs-version-check ``` The automated check covers package metadata, lockfiles, citation version, -release-pinned README links, active documentation dependency snippets, and -current-tag arguments in benchmark workflow examples. Historical prose, -archived reports, baseline arguments, and tool versions intentionally remain -independent of the current package version. +release-pinned README links, active documentation dependency and `cargo add` +snippets, and current-tag arguments in benchmark workflow examples. Historical +prose, archived reports, baseline arguments, and tool versions intentionally +remain independent of the current package version. 3. Generate the release changelog @@ -184,22 +184,46 @@ just ci just publish-check ``` -6. Stage and commit release artifacts +6. Review, stage, and commit the release branch + +Release workflows can update tracked files and create new archive files, and a +critical release fix may legitimately touch source or tooling outside a fixed +metadata list. Keep the dedicated release branch clean of unrelated work, +review the complete release delta, and then stage all intended changes: ```bash -git add Cargo.toml Cargo.lock CITATION.cff pyproject.toml uv.lock CHANGELOG.md docs/ benches/PERFORMANCE_RESULTS.md +git status --short +git diff HEAD --check +git --no-pager diff HEAD --stat + +# After confirming every changed and untracked path belongs in the release PR: +git add --all +git status --short +git diff --cached --check +git --no-pager diff --cached --stat +git --no-pager diff --cached + +benchmark_bullet="" +if ! git diff --cached --quiet -- benches/PERFORMANCE_RESULTS.md; then + benchmark_bullet=$'\n- Refresh release benchmark summary' +fi git commit -m "chore(release): release $TAG - Bump version to $TAG - Update citation and utility package metadata - Update changelog with latest changes -- Update documentation for release -- Refresh release benchmark summary" +- Update documentation for release${benchmark_bullet}" ``` -If no checked-in benchmark summary changed, omit `benches/PERFORMANCE_RESULTS.md` -from the staged files and omit the benchmark bullet. +If the initial status includes unrelated work, stop and separate it before +running `git add --all`; do not stage a mixed worktree merely because it is on a +release branch. + +The commit template adds its benchmark bullet only when +`benches/PERFORMANCE_RESULTS.md` is present in the staged diff. If no checked-in +benchmark summary changed, ensure that file is absent from the staged diff; the +file and its benchmark bullet are then both omitted. 7. Push the branch and open a PR diff --git a/docs/archive/changelog/0.3.md b/docs/archive/changelog/0.3.md index 41be1ba1..c9588775 100644 --- a/docs/archive/changelog/0.3.md +++ b/docs/archive/changelog/0.3.md @@ -37,7 +37,6 @@ Updates the changelog template to improve presentation, and ensure consistent date formatting and readability. Removes the commit message template and updates contributing guidelines to reflect conventional commits usage. - - Refactors changelog generation for clarity Simplifies the changelog generation script by ensuring the "Changes" header is printed only once and streamlining the commit processing logic. @@ -62,13 +61,10 @@ - Update documentation, scripts, benchmarks [#39](https://github.com/acgetchell/delaunay/pull/39) [`9d934f7`](https://github.com/acgetchell/delaunay/commit/9d934f7e1da74a14badd1889905eac759cc97651) - - Rename project from d-delaunay to delaunay [#41](https://github.com/acgetchell/delaunay/pull/41) [`d9daf45`](https://github.com/acgetchell/delaunay/commit/d9daf45eb39cf96e1d92ec94f213e7f7fc78dd31) - - Rename delaunay_core to core [#42](https://github.com/acgetchell/delaunay/pull/42) [`ab9cc99`](https://github.com/acgetchell/delaunay/commit/ab9cc99dea653217e1e2ff99ea71a2b101f15ad9) - - Improves triangulation performance and validation [#43](https://github.com/acgetchell/delaunay/pull/43) [`635aee3`](https://github.com/acgetchell/delaunay/commit/635aee35b00b39d9433b6acce75627ec1bff516b) @@ -87,7 +83,6 @@ - Refactor/triangulation data structure [#36](https://github.com/acgetchell/delaunay/pull/36) [`8c7d05f`](https://github.com/acgetchell/delaunay/commit/8c7d05fc2c44a0a980f11ea218407920d082880d) - - Refactor/triangulation data structure 2 [#37](https://github.com/acgetchell/delaunay/pull/37) [`a2acfec`](https://github.com/acgetchell/delaunay/commit/a2acfec53c7a3c6210cd44519d8810c137cf89ee) @@ -197,10 +192,8 @@ - Fix/bowyer watson [#6](https://github.com/acgetchell/delaunay/pull/6) [`bd2a079`](https://github.com/acgetchell/delaunay/commit/bd2a0798d7bc8be981159a453c5a9ebdd8b0352a) - - Fix/core data types [#13](https://github.com/acgetchell/delaunay/pull/13) [`2826ccf`](https://github.com/acgetchell/delaunay/commit/2826ccf1b14677f4a2bddd2ef26b6aaae2c75e1c) - - Fix deprecated functions [`408d8bd`](https://github.com/acgetchell/delaunay/commit/408d8bd84aadef8bfd81a9256b220a43bf690842) ### Maintenance @@ -213,42 +206,8 @@ - [Release notes](https://github.com/crossbeam-rs/crossbeam/releases) - [Changelog](https://github.com/crossbeam-rs/crossbeam/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.13...crossbeam-channel-0.5.15) - ---- - - updated-dependencies: - -- dependency-name: crossbeam-channel - dependency-version: 0.5.15 - dependency-type: indirect - ... - - Bump the dependencies group with 3 updates [#18](https://github.com/acgetchell/delaunay/pull/18) [`8e2b698`](https://github.com/acgetchell/delaunay/commit/8e2b698d682e26e2f561c676039ec049bc51df9b) - ---- - - updated-dependencies: - -- dependency-name: ordered-float - dependency-version: 5.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - dependency-group: dependencies - -- dependency-name: peroxide - dependency-version: 0.39.7 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - -- dependency-name: thiserror - dependency-version: 2.0.12 - dependency-type: direct:production - update-type: version-update:semver-major - dependency-group: dependencies - ... - - Bump rand from 0.8.5 to 0.9.1 in the dependencies group [#22](https://github.com/acgetchell/delaunay/pull/22) [`cb5938c`](https://github.com/acgetchell/delaunay/commit/cb5938ce038ed3f86d0915f461414198c6434238) @@ -259,18 +218,6 @@ - [Release notes](https://github.com/rust-random/rand/releases) - [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-random/rand/compare/0.8.5...rand_core-0.9.1) - ---- - - updated-dependencies: - -- dependency-name: rand - dependency-version: 0.9.1 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - - Bump peroxide in the dependencies group [#23](https://github.com/acgetchell/delaunay/pull/23) [`7e66937`](https://github.com/acgetchell/delaunay/commit/7e66937fa69ee66e410fb25ef3a5afb9432cae0e) @@ -281,18 +228,6 @@ - [Release notes](https://github.com/Axect/Peroxide/releases) - [Changelog](https://github.com/Axect/Peroxide/blob/master/RELEASES.md) - [Commits](https://github.com/Axect/Peroxide/compare/v0.39.8...v0.39.10) - ---- - - updated-dependencies: - -- dependency-name: peroxide - dependency-version: 0.39.10 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - Bump codacy/codacy-analysis-cli-action from 1.1.0 to 4.4.7 [#29](https://github.com/acgetchell/delaunay/pull/29) [`a1bc4a6`](https://github.com/acgetchell/delaunay/commit/a1bc4a6cdb12036eff891bb437b7215c1a994fba) @@ -300,22 +235,11 @@ - [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases) - [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/d840f886c4bd4edc059706d09c6a1586111c540b...562ee3e92b8e92df8b67e0a5ff8aa8e261919c08) - ---- - - updated-dependencies: - -- dependency-name: codacy/codacy-analysis-cli-action - dependency-version: 4.4.7 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump the dependencies group with 3 updates [#28](https://github.com/acgetchell/delaunay/pull/28) [`da292c2`](https://github.com/acgetchell/delaunay/commit/da292c210793264b95f9c2118935f61205e0bddd) - Bumps the dependencies group with 3 updates: [rand](https://github.com/rust-random/rand) , [serde_json](https://github.com/serde-rs/json) and - [criterion](https://github.com/bheisler/criterion.rs) . + Bumps the dependencies group with 3 updates: [rand](https://github.com/rust-random/rand), [serde_json](https://github.com/serde-rs/json) and + [criterion](https://github.com/bheisler/criterion.rs). Updates `rand` from 0.9.1 to 0.9.2 @@ -324,52 +248,14 @@ - [Commits](https://github.com/rust-random/rand/compare/rand_core-0.9.1...rand_core-0.9.2) Updates `serde_json` from 1.0.140 to 1.0.141 - - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.140...v1.0.141) Updates `criterion` from 0.5.1 to 0.6.0 - - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.5.1...0.6.0) - ---- - - updated-dependencies: - -- dependency-name: rand - dependency-version: 0.9.2 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: serde_json - dependency-version: 1.0.141 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: criterion - dependency-version: 0.6.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - - Bump peroxide in the dependencies group [#31](https://github.com/acgetchell/delaunay/pull/31) [`7c9f037`](https://github.com/acgetchell/delaunay/commit/7c9f037eee34acb10de2c0df3149300d0cdc0afc) - ---- - - updated-dependencies: - -- dependency-name: peroxide - dependency-version: 0.39.11 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - Bump the dependencies group with 2 updates [#33](https://github.com/acgetchell/delaunay/pull/33) [`dcfb7f5`](https://github.com/acgetchell/delaunay/commit/dcfb7f548994157c7cab4c200872ce2e6699fbd2) @@ -382,27 +268,9 @@ - [Commits](https://github.com/Axect/Peroxide/compare/v0.39.11...v0.40.0) Updates `criterion` from 0.6.0 to 0.7.0 - - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.6.0...0.7.0) ---- - - updated-dependencies: - -- dependency-name: peroxide - dependency-version: 0.40.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - -- dependency-name: criterion - dependency-version: 0.7.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - ### Removed - Removes CodeRabbit badge from README [ci skip] [`c2da1ce`](https://github.com/acgetchell/delaunay/commit/c2da1ce43123b62680f2df3b7ca655cf3611b19f) diff --git a/docs/archive/changelog/0.4.md b/docs/archive/changelog/0.4.md index e17aab1a..98566b4c 100644 --- a/docs/archive/changelog/0.4.md +++ b/docs/archive/changelog/0.4.md @@ -22,10 +22,8 @@ This helps to keep the output clean, especially in automated benchmark runs. Also increases sampling size for 5D benchmarks to the minimum criterion sampling size to avoid errors. Additionally, fixes a typo in `cspell.json` and `CHANGELOG.md`. - - Feature/migrate uuids to slotmap [#77](https://github.com/acgetchell/delaunay/pull/77) [`34ae023`](https://github.com/acgetchell/delaunay/commit/34ae023663edc245139afb20339c27aed3295e1b) - - Optimizes internal collections with key-based access [#83](https://github.com/acgetchell/delaunay/pull/83) [`b9a9491`](https://github.com/acgetchell/delaunay/commit/b9a9491a5e86def13697753d4389c511a555ba82) @@ -65,17 +63,6 @@ - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v4...v5) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: '5' - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump codecov/codecov-action from 5.5.0 to 5.5.1 [#79](https://github.com/acgetchell/delaunay/pull/79) [`c3b4339`](https://github.com/acgetchell/delaunay/commit/c3b433921f45ee85b6361b71c758e7949f4b9e5e) @@ -84,17 +71,6 @@ - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/fdcc8476540edceab3de004e990f80d881c6cc00...5a1091511ad55cbe89839c7260b706298ca349f7) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 5.5.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump astral-sh/setup-uv from 6.6.1 to 6.7.0 [#80](https://github.com/acgetchell/delaunay/pull/80) [`709bd4d`](https://github.com/acgetchell/delaunay/commit/709bd4d88797cc86db6985af0c522cbc427a32bd) @@ -102,17 +78,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/557e51de59eb14aaaba2ed9621916900a91d50c6...b75a909f75acd358c2196fb9a5f1299a9a8868a4) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 6.7.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump actions-rust-lang/setup-rust-toolchain [#82](https://github.com/acgetchell/delaunay/pull/82) [`3329d36`](https://github.com/acgetchell/delaunay/commit/3329d3656864f4e2ea2c00730383dd8bf8f23010) @@ -121,17 +86,6 @@ - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/ac90e63697ac2784f4ecfe2964e1a285c304003a...2fcdc490d667999e01ddbbf0f2823181beef6b39) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.15.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump the dependencies group with 2 updates [#81](https://github.com/acgetchell/delaunay/pull/81) [`d259a73`](https://github.com/acgetchell/delaunay/commit/d259a7304e5e395af07d819e32f189b06b5e3541) @@ -143,27 +97,9 @@ - [Commits](https://github.com/serde-rs/serde/compare/v1.0.219...v1.0.223) Updates `serde_json` from 1.0.143 to 1.0.145 - - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.143...v1.0.145) ---- - - updated-dependencies: - -- dependency-name: serde - dependency-version: 1.0.223 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: serde_json - dependency-version: 1.0.145 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - ## [0.4.3] - 2025-09-12 ### Merged Pull Requests @@ -270,16 +206,6 @@ - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/8f6ec407a34d5ec2b33d7d8f7f50279493b5efb4...fdcc8476540edceab3de004e990f80d881c6cc00) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: fdcc8476540edceab3de004e990f80d881c6cc00 - dependency-type: direct:production - ... - - Bump actions/github-script from 7.0.1 to 8.0.0 [#70](https://github.com/acgetchell/delaunay/pull/70) [`18ed4eb`](https://github.com/acgetchell/delaunay/commit/18ed4ebdf819b71135b68857edb8457021e44f81) @@ -288,16 +214,6 @@ - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/60a0d83039c74a4aee543508d2ffcb1c3799cdea...ed597411d8f924073f98dfc5c65a23a2325f34cd) ---- - - updated-dependencies: - -- dependency-name: actions/github-script - dependency-version: 8.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - ## [0.4.2] - 2025-09-04 ### Merged Pull Requests @@ -311,10 +227,8 @@ - Test/benchmarking [#59](https://github.com/acgetchell/delaunay/pull/59) [`fda43d7`](https://github.com/acgetchell/delaunay/commit/fda43d76af0cf35061d2e70b32f1cfb24d4696b1) - - Docs/release v0.4.2 [#60](https://github.com/acgetchell/delaunay/pull/60) [`f10aba3`](https://github.com/acgetchell/delaunay/commit/f10aba34cb9e3fe9418aa549f392aea98eb0d13e) - - Refactor/benchmarks [#65](https://github.com/acgetchell/delaunay/pull/65) [`d2e2f86`](https://github.com/acgetchell/delaunay/commit/d2e2f860bd685bbbe8303589fe0687ebedc71229) @@ -339,13 +253,10 @@ - Refactors coordinate traits for improved geometry [#54](https://github.com/acgetchell/delaunay/pull/54) [`c1fe7ee`](https://github.com/acgetchell/delaunay/commit/c1fe7eebfb63cf815740e3b7a82161bcaa251f0f) - - Docs/update documentation citations benchmarks [#55](https://github.com/acgetchell/delaunay/pull/55) [`5fb31b1`](https://github.com/acgetchell/delaunay/commit/5fb31b129128e260057d04833b0cf6a97e5fca72) - - Release/0.4.1 fixed [#57](https://github.com/acgetchell/delaunay/pull/57) [`d1589c0`](https://github.com/acgetchell/delaunay/commit/d1589c0bf1fb0d7448b8a1f2ac302eaf01ea6e55) - - Update release date for v0.4.1 in CHANGELOG [`13b4df2`](https://github.com/acgetchell/delaunay/commit/13b4df257d102b8ab3608da85434c46db978ddd8) ## [0.4.0] - 2025-08-23 @@ -371,16 +282,6 @@ - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: '5' - dependency-type: direct:production - update-type: version-update:semver-major - ... - [0.4.4]: https://github.com/acgetchell/delaunay/compare/v0.4.3...v0.4.4 [0.4.3]: https://github.com/acgetchell/delaunay/compare/v0.4.2...v0.4.3 [0.4.2]: https://github.com/acgetchell/delaunay/compare/v0.4.1...v0.4.2 diff --git a/docs/archive/changelog/0.5.md b/docs/archive/changelog/0.5.md index 6fcfafbc..754af364 100644 --- a/docs/archive/changelog/0.5.md +++ b/docs/archive/changelog/0.5.md @@ -21,46 +21,37 @@ - Replace peroxide with nalgebra for matrix ops; introduce Matrix alias (na::DMatrix<f64>), update determinant/inverse calls - - Add matrix::adaptive_tolerance() that excludes an all-ones last column for ∞-norm scaling; apply to orientation/insphere (incl. lifted) and add fast path when test point equals a simplex vertex - - Update predicates, robust_predicates, util, and debug tools to use the new matrix utilities - - Derive thiserror::Error for core/geometry error types; remove manual Error impls and simplify error handling - - Remove peroxide from Cargo.toml; update Cargo.lock - Docs: expand numerical robustness guide (adaptive tolerance details and sign conventions) and wrap long lines to satisfy markdownlint (MD013) - - Tests: add proptest regression corpus and update affected tests ### Changed - Test/improve coverage [#119](https://github.com/acgetchell/delaunay/pull/119) [`936fc8c`](https://github.com/acgetchell/delaunay/commit/936fc8ce49cd712e35f9a0026166c8e293ba4d9f) - - Increase tarpaulin timeout for 5D integration tests [`8755071`](https://github.com/acgetchell/delaunay/commit/87550712a8a5595b76beb85c92e40f99d850dbf3) Increases the tarpaulin timeout to 240 seconds. This is done to accommodate the longer execution times of the 5D integration tests, preventing premature termination of the code coverage analysis. - - Updates dependencies and reduces test samples [`318990a`](https://github.com/acgetchell/delaunay/commit/318990a72d38bdb8e4a83589a45ef7b99b768510) Updates `derive_builder` and `pastey` dependencies to their latest versions. Reduces the sample size in one integration test to improve coverage run times. (Internal change) - - Skips 5D tests in CI, adds attributes to tests [`ed4b714`](https://github.com/acgetchell/delaunay/commit/ed4b71438a7f5a9b7928a4be030e2304cffec70b) Changes the 5D tests to be skipped during continuous integration due to their long runtime. Adds attributes to the integration tests via macro to allow for skipping. - - Refactor/jaccard [#123](https://github.com/acgetchell/delaunay/pull/123) [`9eaa225`](https://github.com/acgetchell/delaunay/commit/9eaa22539e605761a0694e1b7c66be0231708f1d) @@ -83,19 +74,16 @@ - Fixes failing doctest at triangulation_data_structure.rs:1784 2. **Fix proptest quality metric failures** - - Changed cell comparison from key-order to UUID-based matching - Translation/scaling operations can reorder cells in Delaunay triangulation - Tests now match cells by their vertex UUIDs instead of assuming same order - Fixes prop_normalized_volume and prop_radius_ratio tests in 4D/5D 3. **Fix convex hull integration test** - - Updated test_convex_hull_cache_during_construction with proper hull vertices - Previous vertices were all interior, causing "No boundary facets" error Additional improvements: - - Improve rollback functionality for missed inserts - RobustBowyerWatson now enforces Delaunay property post-insertion - Improved duplicate coordinate detection in insertion algorithms @@ -127,7 +115,6 @@ - Users always use `gh release create "$TAG" --notes-from-tag` Implementation (scripts/changelog_utils.py): - - _get_changelog_content(): Returns tuple (message, is_truncated) - Checks byte size against 125,000 limit - Returns reference message for large changelogs @@ -138,7 +125,6 @@ - Notes CHANGELOG.md reference for large changelogs Testing (scripts/tests/test_changelog_tag_size_limit.py): - - 7 comprehensive tests using real v0.5.4 data (152KB) - Tests cover: limit detection, tag creation, success messages, full workflow - Validates both normal and large changelog handling @@ -154,17 +140,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41...1e862dfacbd1d6d858c55d9b792c756523627244) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.4 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump actions/checkout from 5.0.0 to 6.0.0 [#129](https://github.com/acgetchell/delaunay/pull/129) [`747b6ef`](https://github.com/acgetchell/delaunay/commit/747b6efd5c16d335340b02dec4821a1019273588) @@ -172,17 +147,6 @@ - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v5...v6) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: 6.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump taiki-e/install-action from 2.62.54 to 2.62.56 [#130](https://github.com/acgetchell/delaunay/pull/130) [`37ccaec`](https://github.com/acgetchell/delaunay/commit/37ccaecab39e7951ee9fbc3da7f7dd1556bdbf95) @@ -192,16 +156,6 @@ - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/62da238c048aa0f865cc5a322082957d34e7fc1a...f79fe7514db78f0a7bdba3cb6dd9c1baa7d046d9) ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.62.56 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - ### Performance - Add stack-allocated SmallBuffer types for D+1 operations [#126](https://github.com/acgetchell/delaunay/pull/126) @@ -219,24 +173,20 @@ - CellToVertexUuidsMap: HashMap using CellVertexUuidBuffer values Updated functions: - - Tds::find_neighbors_by_key() → returns NeighborBuffer<Option<CellKey>> - Cell::vertex_uuids() → returns CellVertexUuidBuffer - CellVertexKeysMap → uses CellVertexBuffer values - Serialization converts SmallVec to Vec for serde compatibility Performance benefits: - - Zero heap allocations for D+1 collections when D≤7 - Better cache locality with 128-byte stack allocation - Maintains same API surface (both implement Deref<[T]>) Test improvements: - - Stabilized 4/5 Delaunay condition property tests (2D-5D empty circumsphere) - Documented insertion-order dependency issue in prop_insertion_order_invariance_2d (requires separate algorithmic investigation) - - Removed stale proptest regression file - Fixed zero_allocation_iterator_demo to compare as slices @@ -289,11 +239,9 @@ - Mark changes_section_index as used (-1) after insertion to prevent the same index from being reused for duplicate insertions - - Add missing pending_expanded_commits.clear() in _finalize_pending_commits 2. Expanded PR commits duplicating entries from Fixed Issues section - - Track expanded commit SHAs in self.expanded_commit_shas set - Skip commit lines whose SHAs were already expanded from PRs - Store both full and short SHA formats to catch all duplicates @@ -316,7 +264,6 @@ - Previous approach (adding 2 levels) created h3→h5 jumps that violated MD001 2. Protect cron expressions from markdown interpretation - - Add _protect_cron_expressions() to wrap cron patterns in backticks - Detects quoted strings with asterisks and digits (e.g., '0 2 * * 0') - Prevents markdown from treating * as emphasis markers @@ -334,23 +281,20 @@ - Document behavior difference between new() (permissive) and add() (strict) - Matches expected behavior for batch initialization from potentially unfiltered data -#### Property Test Improvements - + **Property Test Improvements** - Filter degenerate configurations in convex hull proptests (collinear/coplanar points with no boundary facets) - Use approx crate for floating-point comparisons in serialization tests - Add BoundaryAnalysis trait import where needed - Fix debug-only variable compilation with #[cfg(debug_assertions)] -#### Serialization Test Fixes - + **Serialization Test Fixes** - Address JSON floating-point precision limitations (not a bug) - Use relative_eq! from approx crate instead of exact equality - JSON typically preserves 15-17 significant digits for f64 - Minor coordinate differences after roundtrip are expected and acceptable -#### New Property Tests - + **New Property Tests** - Add comprehensive proptest suites for Bowyer-Watson, convex hull, cells, facets, geometry utilities, quality metrics, and serialization - Include proptest regression files to track minimal failing cases @@ -369,20 +313,14 @@ - Add rollback after preventive facet filtering to handle edge cases where all boundary facets are unexpectedly removed - - Add rollback when cell creation yields zero cells despite valid facets, preventing inconsistent triangulation state - - Implement Point Hash + Eq for efficient duplicate detection in Tds::new() using HashSet instead of O(n²) sequential scan - - Add Point import and move HashSet to top-level imports - - Fix degenerate simplex generator in proptest_quality to create full-dimensional thin simplices using safe_usize_to_scalar - - Add proptest regression file for insertion_algorithm edge cases - - Improve serialization test coverage for vertex preservation The rollback logic ensures failed insertions don't corrupt the @@ -404,24 +342,19 @@ - Fixed filter_boundary_facets_by_valid_facet_sharing to discount bad cell contributions before checking facet sharing limits - - Bad cells are about to be deleted, but were being counted as if they would remain, causing every interior facet to be flagged as over-sharing - - Added unit test test_preventive_filter_does_not_reject_valid_interior_facets to prevent regression of this critical bug - - Captured bad_cell before moving info to avoid borrow issues -#### UUID Duplicate Detection Fix - + **UUID Duplicate Detection Fix** - Reordered Tds::new() to check UUID collisions before coordinate deduplication - Previously duplicate UUIDs were missed when coordinates were also duplicated - Added Vertex::new_with_uuid() test helper (marked #[doc(hidden)]) - Added 4 integration tests for UUID collision detection scenarios -#### Construction State Accuracy Fix - + **Construction State Accuracy Fix** - Recalculate construction_state after deduplication loop in Tds::new() - Now reflects actual unique vertex count instead of raw input length - Added 2 integration tests verifying correct state calculation @@ -441,20 +374,17 @@ "preventive filtering" message - Avoids unnecessary vertex insertion and rollback operations -#### Improved Error Messages - + **Improved Error Messages** - Changed post-filtering error to "No boundary facets available after filtering" - More accurate since empty result can come from filtering, deduplication, or empty input -#### Performance Optimization - + **Performance Optimization** - Replace std::HashSet with FastHashSet in deduplicate_boundary_facet_info - Pre-allocate both collections with boundary_infos.len() capacity - Improves deduplication performance and consistency with codebase -#### Documentation Updates - + **Documentation Updates** - Clarify saturating_add/sub_for_bbox only support floats (not integers) - CoordinateScalar is only implemented for f32/f64 - Update test comments to reflect early exit behavior @@ -473,21 +403,18 @@ - Eliminates Vec allocation per facet (N allocations saved) - Consistent with hashing used throughout codebase -#### Facet Filter Optimization - + **Facet Filter Optimization** - Replace std::HashMap with FastHashMap in filter_boundary_facets_by_valid_facet_sharing - Pre-allocate with facet_map.len() capacity to avoid rehashing - Reduces hashing overhead in N·D inner loop - Improves consistency with other hot-path containers -#### Documentation Clarification - + **Documentation Clarification** - Clarify saturating_add/sub_for_bbox perform standard FP arithmetic - Add note explaining "saturating" naming is for bbox semantic consistency - Not actual integer saturation since CoordinateScalar only supports floats -#### Test Alignment - + **Test Alignment** - Fix test_create_cells_from_boundary_facets to assert error on empty input - Remove unwrap_or(0) pattern in favor of explicit error assertion - Consistent with new API contract where empty handles error immediately @@ -498,18 +425,13 @@ - List AI tools used in project development (ChatGPT, Claude, CodeRabbit, GitHub Copilot, KiloCode, WARP) in README.md - - Add detailed citations and human oversight note in REFERENCES.md - - Clarify all AI output was reviewed/edited by maintainer Clarify floating-point bbox helper documentation: - - Simplify doc comments for saturating_add/sub_for_bbox functions - - Emphasize "saturating" naming is for semantic consistency, not actual integer saturation behavior - - Update test comment to reflect deduplication via canonical vertex sets #### Changed: Surface duplicate boundary facets as errors instead of silent filtering @@ -521,34 +443,27 @@ - deduplicate_boundary_facet_info: Returns Result<SmallBuffer, InsertionError> instead of Vec (errors on duplicates, uses SmallBuffer for performance) - - filter_boundary_facets_by_valid_facet_sharing: Returns Result<SmallBuffer> instead of Vec (propagates errors from facet map building) - - Add InsertionError::DuplicateBoundaryFacets variant with duplicate_count and total_count fields **Rationale** The cavity boundary should form a topological sphere with no duplicate facets. Duplicates indicate: - - Incorrect neighbor traversal logic - - Non-manifold mesh connectivity - - Data structure corruption By returning errors instead of silently filtering, we surface these bugs immediately rather than allowing corrupted triangulations. -#### Performance Improvements - + **Performance Optimization** - Use SmallBuffer (stack-allocated, falls back to heap) for typical D+1 facets - Faster than Vec for small collections (common case in D dimensions) - Maintains O(n) duplicate detection with FastHashSet -#### Implementation Details - + **Implementation Details** - Propagate DuplicateBoundaryFacets errors through insert_vertex_cavity_based and create_cells_from_facet_handles - Update tests to expect errors on duplicates instead of silent filtering @@ -565,8 +480,7 @@ - saturating_sub_for_bbox → bbox_sub - saturating_add_for_bbox → bbox_add -#### Updated Documentation - + **Updated Documentation** - Clarify these are plain float operations, NOT saturating arithmetic - Explain float overflow behavior: naturally produces ±infinity - Document that this is the desired behavior for bounding box expansion @@ -596,7 +510,6 @@ - Feature/geometry quality metrics [#107](https://github.com/acgetchell/delaunay/pull/107) [`c707b09`](https://github.com/acgetchell/delaunay/commit/c707b09e6ab78a07bbce873f0c39cf8119dfb076) - - Refactor/phase 4 [#109](https://github.com/acgetchell/delaunay/pull/109) [`4ecc21f`](https://github.com/acgetchell/delaunay/commit/4ecc21fbe65c1292165594171c6d137093120076) @@ -614,7 +527,6 @@ - Remove outdated test TODO comments from convex_hull.rs Documentation updates: - - Update docs/README.md to reference existing files (property_testing_summary.md, topology.md) instead of non-existent optimization guides - Update docs/OPTIMIZATION_ROADMAP.md to reference archived Phase 2/3 documentation in docs/archive/ instead of removed files - Update docs/code_organization.md project structure tree to reflect current files: @@ -634,17 +546,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/3259c6206f993105e3a61b142c2d97bf4b9ef83d...2ddd2b9cb38ad8efd50337e8ab201519a34c9f24) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump actions/download-artifact from 5.0.0 to 6.0.0 [#113](https://github.com/acgetchell/delaunay/pull/113) [`9756b59`](https://github.com/acgetchell/delaunay/commit/9756b594b26715b478d2eebdf78aebe016bb48d7) @@ -652,17 +553,6 @@ - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/634f93cb2916e3fdff6788551b99b062d0335ce0...018cc2cf5baa6db3ef3c5f8a56943fffe632ef53) - ---- - - updated-dependencies: - -- dependency-name: actions/download-artifact - dependency-version: 6.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump actions/upload-artifact from 4 to 5 [#111](https://github.com/acgetchell/delaunay/pull/111) [`3ffdf6b`](https://github.com/acgetchell/delaunay/commit/3ffdf6b10f37776a40be3c3b047cdac9e44709b6) @@ -670,17 +560,6 @@ - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) - ---- - - updated-dependencies: - -- dependency-name: actions/upload-artifact - dependency-version: '5' - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump astral-sh/setup-uv from 7.1.1 to 7.1.2 [#112](https://github.com/acgetchell/delaunay/pull/112) [`febd5f5`](https://github.com/acgetchell/delaunay/commit/febd5f55278f73dfd9e69c7b4a71e86058da2815) @@ -688,17 +567,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/2ddd2b9cb38ad8efd50337e8ab201519a34c9f24...85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.2 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Update CHANGELOG, add storage comparison tooling [`49f5eb5`](https://github.com/acgetchell/delaunay/commit/49f5eb5d90bb0a5eb26166986347b73038100de1) - Generate comprehensive CHANGELOG.md with AI-categorized Phase 4 entries @@ -724,7 +592,6 @@ - Update/utilities and roadmap [#100](https://github.com/acgetchell/delaunay/pull/100) [`353a46e`](https://github.com/acgetchell/delaunay/commit/353a46e385baa936e5e94f0b3a1b5e7b58a3350e) - - Replaces fxhash with rustc-hash for performance [#101](https://github.com/acgetchell/delaunay/pull/101) [`3c56251`](https://github.com/acgetchell/delaunay/commit/3c5625137f7cdd5385d056453860f20083882247) @@ -740,7 +607,6 @@ rustc-hash provides improved performance characteristics for the delaunay triangulation algorithm, leading to faster overall execution. - - Refactor/complete phase 3 [#103](https://github.com/acgetchell/delaunay/pull/103) [`2db8acd`](https://github.com/acgetchell/delaunay/commit/2db8acd18e373f4847de73526e387c7f14b5a3e5) @@ -754,17 +620,6 @@ - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/2fcdc490d667999e01ddbbf0f2823181beef6b39...02be93da58aa71fb456aa9c43b301149248829d8) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.15.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump the dependencies group with 2 updates [#93](https://github.com/acgetchell/delaunay/pull/93) [`b0a7051`](https://github.com/acgetchell/delaunay/commit/b0a70518c4594dc97ed2f93316d13c227c4cb861) @@ -776,27 +631,8 @@ - [Commits](https://github.com/serde-rs/serde/compare/v1.0.227...v1.0.228) Updates `thiserror` from 2.0.16 to 2.0.17 - - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/2.0.16...2.0.17) - ---- - - updated-dependencies: - -- dependency-name: serde - dependency-version: 1.0.228 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: thiserror - dependency-version: 2.0.17 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - Bump ordered-float in the dependencies group [#94](https://github.com/acgetchell/delaunay/pull/94) [`1a213f7`](https://github.com/acgetchell/delaunay/commit/1a213f7cd262f3dfc319b72c9bde9836db7119cc) @@ -806,18 +642,6 @@ - [Release notes](https://github.com/reem/rust-ordered-float/releases) - [Commits](https://github.com/reem/rust-ordered-float/compare/v5.0.0...v5.1.0) - ---- - - updated-dependencies: - -- dependency-name: ordered-float - dependency-version: 5.1.0 - dependency-type: direct:production - update-type: version-update:semver-minor - dependency-group: dependencies - ... - - Bump actions-rust-lang/setup-rust-toolchain [#95](https://github.com/acgetchell/delaunay/pull/95) [`34db79a`](https://github.com/acgetchell/delaunay/commit/34db79a89fefc3e062afb1cb47e9da9d80db4f89) @@ -826,17 +650,6 @@ - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/02be93da58aa71fb456aa9c43b301149248829d8...1780873c7b576612439a134613cc4cc74ce5538c) - ---- - - updated-dependencies: - -- dependency-name: actions-rust-lang/setup-rust-toolchain - dependency-version: 1.15.2 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump astral-sh/setup-uv from 6.7.0 to 6.8.0 [#96](https://github.com/acgetchell/delaunay/pull/96) [`ef8c98d`](https://github.com/acgetchell/delaunay/commit/ef8c98df6fd2399790c5f64e2cbcbdfc19e8bbd9) @@ -844,17 +657,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/b75a909f75acd358c2196fb9a5f1299a9a8868a4...d0cc045d04ccac9d8b7881df0226f9e82c39688e) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 6.8.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump astral-sh/setup-uv from 7.0.0 to 7.1.0 [#102](https://github.com/acgetchell/delaunay/pull/102) [`8a09e60`](https://github.com/acgetchell/delaunay/commit/8a09e6020ec0dcf55a2cc146d8ddb05a48aee1a2) @@ -863,16 +665,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/eb1897b8dc4b5d5bfe39a428a8f2304605e0983c...3259c6206f993105e3a61b142c2d97bf4b9ef83d) ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - ## [0.5.0] - 2025-09-27 ### Merged Pull Requests @@ -884,13 +676,10 @@ ### Changed - Update documentation for v0.4.4 (skip ci) [`696f740`](https://github.com/acgetchell/delaunay/commit/696f74056e07ad2d3a8db4269f281029df089b33) - - Test/improve coverage [#89](https://github.com/acgetchell/delaunay/pull/89) [`b8a2024`](https://github.com/acgetchell/delaunay/commit/b8a2024fa9921141b1a453bb8911fbc2dbf02b5f) - - Refactor/phase 3 [#90](https://github.com/acgetchell/delaunay/pull/90) [`2a9b655`](https://github.com/acgetchell/delaunay/commit/2a9b655f73432e3cce52f9c9db58e46d525bc9d3) - - Updates docs, adds Claude config ignore, cspell [`7a1e51f`](https://github.com/acgetchell/delaunay/commit/7a1e51f5af069c35ff840103da691b3d38a4536f) Updates documentation with progress on Phase 1/2 optimizations, @@ -908,8 +697,8 @@ - Bump the dependencies group with 4 updates [#88](https://github.com/acgetchell/delaunay/pull/88) [`68caee6`](https://github.com/acgetchell/delaunay/commit/68caee6276094e9cb106a7edc43e5ce2a62c9aef) - Bumps the dependencies group with 4 updates: [anyhow](https://github.com/dtolnay/anyhow) , [clap](https://github.com/clap-rs/clap) , - [nalgebra](https://github.com/dimforge/nalgebra) and [serde](https://github.com/serde-rs/serde) . + Bumps the dependencies group with 4 updates: [anyhow](https://github.com/dtolnay/anyhow), [clap](https://github.com/clap-rs/clap), + [nalgebra](https://github.com/dimforge/nalgebra) and [serde](https://github.com/serde-rs/serde). Updates `anyhow` from 1.0.99 to 1.0.100 @@ -917,50 +706,18 @@ - [Commits](https://github.com/dtolnay/anyhow/compare/1.0.99...1.0.100) Updates `clap` from 4.5.47 to 4.5.48 - - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.47...clap_complete-v4.5.48) Updates `nalgebra` from 0.34.0 to 0.34.1 - - [Changelog](https://github.com/dimforge/nalgebra/blob/main/CHANGELOG.md) - [Commits](https://github.com/dimforge/nalgebra/commits/v0.34.1) Updates `serde` from 1.0.223 to 1.0.226 - - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](https://github.com/serde-rs/serde/compare/v1.0.223...v1.0.226) ---- - - updated-dependencies: - -- dependency-name: anyhow - dependency-version: 1.0.100 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: clap - dependency-version: 4.5.48 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: nalgebra - dependency-version: 0.34.1 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - -- dependency-name: serde - dependency-version: 1.0.226 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - [0.5.4]: https://github.com/acgetchell/delaunay/compare/v0.5.3...v0.5.4 [0.5.3]: https://github.com/acgetchell/delaunay/compare/v0.5.2...v0.5.3 [0.5.2]: https://github.com/acgetchell/delaunay/compare/v0.5.1...v0.5.2 diff --git a/docs/archive/changelog/0.6.md b/docs/archive/changelog/0.6.md index 0f31463c..bd71a1bd 100644 --- a/docs/archive/changelog/0.6.md +++ b/docs/archive/changelog/0.6.md @@ -25,17 +25,6 @@ - [Release notes](https://github.com/taiki-e/install-action/releases) - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/d850aa816998e5cf15f67a78c7b933f2a5033f8a...b9c5db3aef04caffaf95a1d03931de10fb2a140f) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.65.1 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump taiki-e/install-action from 2.65.1 to 2.65.7 [#161](https://github.com/acgetchell/delaunay/pull/161) [`b12b253`](https://github.com/acgetchell/delaunay/commit/b12b2537c3107a1d97c97d88d7a7285b26d6b9f1) @@ -44,17 +33,6 @@ - [Release notes](https://github.com/taiki-e/install-action/releases) - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/b9c5db3aef04caffaf95a1d03931de10fb2a140f...4c6723ec9c638cccae824b8957c5085b695c8085) - ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.65.7 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump serde_json in the dependencies group [#160](https://github.com/acgetchell/delaunay/pull/160) [`cf3368c`](https://github.com/acgetchell/delaunay/commit/cf3368cf54c2ff68a7acfa34e3e51a2806a35f96) @@ -64,18 +42,6 @@ - [Release notes](https://github.com/serde-rs/json/releases) - [Commits](https://github.com/serde-rs/json/compare/v1.0.147...v1.0.148) - ---- - - updated-dependencies: - -- dependency-name: serde_json - dependency-version: 1.0.148 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - Release v0.6.2 [#162](https://github.com/acgetchell/delaunay/pull/162) [`66df9a6`](https://github.com/acgetchell/delaunay/commit/66df9a65fc87a527a80df40451ef984149e4e525) @@ -138,7 +104,6 @@ - `insert_transactional` signature changed to match new return type New Features: - - Add `InsertionOutcome` enum with `Inserted` and `Skipped` variants - `Inserted` variant includes optional `hint` for next insertion optimization - `insert_with_statistics` provides detailed outcomes for both successful and skipped insertions @@ -158,10 +123,8 @@ - Make docs/validation.md the canonical reference for the 4-level validation hierarchy (including focused structural invariant helpers and Issue #120 caveats for Level 4). - - Shorten crate-level docs in src/lib.rs to avoid duplicating validation details while keeping an overview + link to the guide. - - Update benches/PERFORMANCE_RESULTS.md with refreshed benchmark data and metadata. ### Fixed @@ -169,7 +132,6 @@ - Slurm_storage_comparison.sh [`1f6fb35`](https://github.com/acgetchell/delaunay/commit/1f6fb352dbd397b5e04ca3d415d9cc3b52c9c076) Fixed an issue where running the script did not submit correctly via sbatch and instead ran interactively - - Increase BENCH_SAMPLE_SIZE to meet Criterion minimum requirement [`006cd97`](https://github.com/acgetchell/delaunay/commit/006cd97a3b38c2870850c4e734ef9c466493717d) @@ -179,7 +141,6 @@ The memory stress testing workflow was failing with "assertion failed: n >= 10" because Criterion's statistical analysis requires a minimum of 10 samples. This change ensures the CI configuration meets that requirement while keeping benchmarks fast for CI environments. - - Correctly generate and upload Codacy SARIF reports [`3645ab4`](https://github.com/acgetchell/delaunay/commit/3645ab493ffda3d56fb38a3232af3fb02705a5e3) Fixes the Codacy workflow to correctly generate and upload SARIF reports. @@ -195,7 +156,6 @@ Root cause: Environment variables were not properly inherited by the Rust benchmark binary, causing tests to run at production scale (100k points) instead of CI-friendly development scale. - - Bump actions/setup-node from 6.0.0 to 6.1.0 [#141](https://github.com/acgetchell/delaunay/pull/141) [`828c850`](https://github.com/acgetchell/delaunay/commit/828c850915c183ca8e8352b8bdba8452890cf6c7) @@ -203,17 +163,6 @@ - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/2028fbc5c25fe9cf00d9f06a71cc4710d4507903...395ad3262231945c25e8478fd5baf05154b1d79f) - ---- - - updated-dependencies: - -- dependency-name: actions/setup-node - dependency-version: 6.1.0 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - - Bump actions/checkout from 6.0.0 to 6.0.1 [#142](https://github.com/acgetchell/delaunay/pull/142) [`e6775ca`](https://github.com/acgetchell/delaunay/commit/e6775caab00c5343bbeb72354b88567fd5e68daf) @@ -221,17 +170,6 @@ - [Release notes](https://github.com/actions/checkout/releases) - [Commits](https://github.com/actions/checkout/compare/v6...v6.0.1) - ---- - - updated-dependencies: - -- dependency-name: actions/checkout - dependency-version: 6.0.1 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump astral-sh/setup-uv from 7.1.4 to 7.1.5 [#143](https://github.com/acgetchell/delaunay/pull/143) [`f82e673`](https://github.com/acgetchell/delaunay/commit/f82e673332b254898024a39d685b02630ffaa8e6) @@ -239,17 +177,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/1e862dfacbd1d6d858c55d9b792c756523627244...ed21f2f24f8dd64503750218de024bcf64c7250a) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.5 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump actions/download-artifact from 6.0.0 to 7.0.0 [#148](https://github.com/acgetchell/delaunay/pull/148) [`2b79dc4`](https://github.com/acgetchell/delaunay/commit/2b79dc482d8baa03d316235bf862e3b9761ad93d) @@ -257,17 +184,6 @@ - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/018cc2cf5baa6db3ef3c5f8a56943fffe632ef53...37930b1c2abaa49bbe596cd826c3c89aef350131) - ---- - - updated-dependencies: - -- dependency-name: actions/download-artifact - dependency-version: 7.0.0 - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump actions/cache from 4 to 5 [#153](https://github.com/acgetchell/delaunay/pull/153) [`9ad6f99`](https://github.com/acgetchell/delaunay/commit/9ad6f99d8a6eab55f3413f8ad60ccd78e4cd628b) @@ -275,17 +191,6 @@ - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v4...v5) - ---- - - updated-dependencies: - -- dependency-name: actions/cache - dependency-version: '5' - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump codecov/codecov-action from 5.5.1 to 5.5.2 [#149](https://github.com/acgetchell/delaunay/pull/149) [`a72754b`](https://github.com/acgetchell/delaunay/commit/a72754b2ae0110448783fe50dfc69e687d09ccc7) @@ -294,17 +199,6 @@ - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/5a1091511ad55cbe89839c7260b706298ca349f7...671740ac38dd9b0130fbe1cec585b89eea48d3de) - ---- - - updated-dependencies: - -- dependency-name: codecov/codecov-action - dependency-version: 5.5.2 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump actions/upload-artifact from 5 to 6 [#150](https://github.com/acgetchell/delaunay/pull/150) [`fd20d59`](https://github.com/acgetchell/delaunay/commit/fd20d59586efe5164edfa3f10e57144418c585b5) @@ -312,17 +206,6 @@ - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) - ---- - - updated-dependencies: - -- dependency-name: actions/upload-artifact - dependency-version: '6' - dependency-type: direct:production - update-type: version-update:semver-major - ... - - Bump astral-sh/setup-uv from 7.1.5 to 7.1.6 [#151](https://github.com/acgetchell/delaunay/pull/151) [`d8d3aac`](https://github.com/acgetchell/delaunay/commit/d8d3aacc0be6dfd4264eabea202a9125a465dfbe) @@ -330,17 +213,6 @@ - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/ed21f2f24f8dd64503750218de024bcf64c7250a...681c641aba71e4a1c380be3ab5e12ad51f415867) - ---- - - updated-dependencies: - -- dependency-name: astral-sh/setup-uv - dependency-version: 7.1.6 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - - Bump taiki-e/install-action from 2.62.63 to 2.63.3 [#152](https://github.com/acgetchell/delaunay/pull/152) [`f4754f5`](https://github.com/acgetchell/delaunay/commit/f4754f508aa75398bc136178d5f930f497bd3549) @@ -350,16 +222,6 @@ - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/50708e9ba8d7b6587a2cb575ddaa9a62e927bc06...d850aa816998e5cf15f67a78c7b933f2a5033f8a) ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.63.3 - dependency-type: direct:production - update-type: version-update:semver-minor - ... - ### Performance - Make DenseSlotMap default storage backend [#146](https://github.com/acgetchell/delaunay/pull/146) @@ -466,20 +328,17 @@ - Add login shell support (-l flag) for proper environment initialization Module System Support: - - Add robust module system initialization with fallback detection - Conditionally load rust/1.91.0 and python/3.11 modules with graceful warnings - Support both /etc/profile.d/modules.sh and Lmod initialization paths - Gracefully handle missing module command by using existing PATH Build Optimization: - - Use node-local scratch for CARGO_TARGET_DIR under SLURM to improve I/O performance - Make cargo update conditional via CARGO_UPDATE_IN_JOB environment variable - - Add tolerance for cargo clean failures due to NFS .nfs* lock files + - Add tolerance for cargo clean failures due to NFS `.nfs*` lock files Error Handling and Monitoring: - - Track phase completion status (ok/timeout/failed) for both SlotMap and DenseSlotMap - Generate overall job status (COMPLETED vs COMPLETED_WITH_ISSUES) in summary - Add graceful handling for missing Criterion output directories @@ -493,18 +352,6 @@ - [Changelog](https://github.com/orlp/slotmap/blob/master/RELEASES.md) - [Commits](https://github.com/orlp/slotmap/compare/v1.1.0...v1.1.1) - ---- - - updated-dependencies: - -- dependency-name: slotmap - dependency-version: 1.1.1 - dependency-type: direct:production - update-type: version-update:semver-patch - dependency-group: dependencies - ... - - Bump taiki-e/install-action from 2.62.56 to 2.62.60 [#134](https://github.com/acgetchell/delaunay/pull/134) [`739038f`](https://github.com/acgetchell/delaunay/commit/739038f388e0e42b1cf0f6e4a120f1169716be94) @@ -514,16 +361,6 @@ - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/taiki-e/install-action/compare/f79fe7514db78f0a7bdba3cb6dd9c1baa7d046d9...3575e532701a5fc614b0c842e4119af4cc5fd16d) ---- - - updated-dependencies: - -- dependency-name: taiki-e/install-action - dependency-version: 2.62.60 - dependency-type: direct:production - update-type: version-update:semver-patch - ... - [0.6.2]: https://github.com/acgetchell/delaunay/compare/v0.6.1...v0.6.2 [0.6.1]: https://github.com/acgetchell/delaunay/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/acgetchell/delaunay/compare/v0.5.4...v0.6.0 diff --git a/docs/archive/changelog/0.7.md b/docs/archive/changelog/0.7.md new file mode 100644 index 00000000..efd168c2 --- /dev/null +++ b/docs/archive/changelog/0.7.md @@ -0,0 +1,2894 @@ +# Changelog - 0.7.x + +## [0.7.8] - 2026-05-21 + +### ⚠️ Breaking Changes + +- Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) +- Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) +- Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) +- Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) +- Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) +- Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) [#404](https://github.com/acgetchell/delaunay/pull/404) +- Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) +- Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) + +### Merged Pull Requests + +- Roll back failed topology repair [#418](https://github.com/acgetchell/delaunay/pull/418) +- Validate compact 3D toroidal quotients [#417](https://github.com/acgetchell/delaunay/pull/417) +- Enforce 10-second default test budget [#415](https://github.com/acgetchell/delaunay/pull/415) +- Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) +- Isolate strict insphere consistency control [#383](https://github.com/acgetchell/delaunay/pull/383) [#411](https://github.com/acgetchell/delaunay/pull/411) +- Use typed errors in public examples [#365](https://github.com/acgetchell/delaunay/pull/365) [#410](https://github.com/acgetchell/delaunay/pull/410) +- Prefer builder-based fallible examples [#214](https://github.com/acgetchell/delaunay/pull/214) [#409](https://github.com/acgetchell/delaunay/pull/409) +- Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) +- Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) +- Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) [#404](https://github.com/acgetchell/delaunay/pull/404) +- Localize remove_vertex repair [#401](https://github.com/acgetchell/delaunay/pull/401) +- Bump idna in the uv group across 1 directory [#400](https://github.com/acgetchell/delaunay/pull/400) +- Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) +- Bump codecov/codecov-action from 6.0.0 to 6.0.1 [#398](https://github.com/acgetchell/delaunay/pull/398) +- Bump sysinfo in the dependencies group across 1 directory [#397](https://github.com/acgetchell/delaunay/pull/397) +- Bump taiki-e/install-action from 2.77.5 to 2.79.1 [#396](https://github.com/acgetchell/delaunay/pull/396) +- Surface squash-body commit entries [#395](https://github.com/acgetchell/delaunay/pull/395) +- Replace Node markdown tooling with rumdl [#394](https://github.com/acgetchell/delaunay/pull/394) +- Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) +- Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) +- Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) +- Refactor/387 tds mutation boundaries [#390](https://github.com/acgetchell/delaunay/pull/390) +- Refresh release docs and benchmark guidance [#389](https://github.com/acgetchell/delaunay/pull/389) + +### Added + +- [**breaking**] Support periodic flip parity for external cells [#391](https://github.com/acgetchell/delaunay/pull/391) + [`5fb2d4a`](https://github.com/acgetchell/delaunay/commit/5fb2d4a22927231ba3396950cf2bbbc481f69285) + + - Preserve periodic vertex offsets when bistellar flips build replacement cells. + - Align external-facet parity checks across periodic cell frames instead of rejecting periodic external cells. + - Surface replacement periodic-offset shape and frame conflicts with typed flip-context errors. +- [**breaking**] Split strict and best-effort insertion statistics [#405](https://github.com/acgetchell/delaunay/pull/405) + [`71336b5`](https://github.com/acgetchell/delaunay/commit/71336b52ffad7ad6923ea0268928a700e37c43e3) + + - Make insert_with_statistics return typed insertion errors for skipped + duplicate or retry-exhausted vertices so callers using ? cannot silently + ignore skipped inputs. + - Add insert_best_effort_with_statistics for diagnostic and bulk-ingestion + workflows that intentionally preserve skipped insertions as outcomes with + telemetry. + - Derive the default validation policy from the active topology guarantee so + PLManifold starts in ExplicitOnly mode while Pseudomanifold keeps + OnSuspicion. + - Document skipped-input observability across construction, workflows, and + robustness guidance. + +### Changed + +- Refactor/387 tds mutation boundaries [#390](https://github.com/acgetchell/delaunay/pull/390) + [`da30293`](https://github.com/acgetchell/delaunay/commit/da3029302e8484d26d2a88d1291050c332e6b822) +- [**breaking**] Replace public core module with focused facades [#392](https://github.com/acgetchell/delaunay/pull/392) + [`655ff4c`](https://github.com/acgetchell/delaunay/commit/655ff4c944ac918c1a88ab70b26908bd1ebd329f) + + - Make `crate::core` private and expose low-level APIs through curated + `tds`, `collections`, `algorithms`, and `query` modules. + - Add focused prelude/docs coverage for the new public import paths. + - Update downstream-style tests and doctests to stop relying on + `delaunay::core`. +- [**breaking**] Rename public cell APIs to simplex nomenclature [#393](https://github.com/acgetchell/delaunay/pull/393) + [`48935d5`](https://github.com/acgetchell/delaunay/commit/48935d5c1ecbeef1b9b833b1de0d1cbcc2e72938) + + - Replace cell-oriented public types, methods, error variants, maps, and diagnostics with simplex terminology across TDS, triangulation, construction, repair, + flips, examples, benches, docs, and tests. + - Preserve typed construction and insertion error context for cavity filling, explicit construction summaries, focused preludes, and Delaunay repair + diagnostics under the simplex API. + - Remove redundant integration tests whose coverage is now exercised by unit, property, and public API tests. + - Move Codacy SARIF filtering into a tested support script and simplify Cargo package metadata. +- [**breaking**] Flatten triangulation modules into focused APIs [#399](https://github.com/acgetchell/delaunay/pull/399) + [`774fd1b`](https://github.com/acgetchell/delaunay/commit/774fd1b92756a070d945061eff203fbc80563dbe) + + - Move Delaunay-facing APIs from the old triangulation facade to crate-root + modules and focused preludes such as construction, insertion, flips, + repair, validation, and delaunayize. + - Split generic Triangulation behavior into construction, insertion, query, + orientation, repair, and validation modules with colocated tests and errors. + - Keep the broad prelude for exploratory use while making focused preludes + orthogonal and workflow-specific. + - Refresh docs, examples, benchmarks, and API export tests for the new module + layout and 7,500-vertex 3D debug-scale default. +- [**breaking**] Reconcile topology validation policy [#385](https://github.com/acgetchell/delaunay/pull/385) + [#404](https://github.com/acgetchell/delaunay/pull/404) [`e5a74a1`](https://github.com/acgetchell/delaunay/commit/e5a74a10586b162fad56d7f227ab194997f7a87c) + + - Add explicit caller-owned validation mode for PL-manifold topology guarantees. + - Reject incoherent topology guarantee and validation policy pairings through typed fallible setters. + - Keep compatibility setters non-committal when a requested pairing is invalid. + - Derive builder validation policy from the selected topology guarantee and document the compatibility matrix. +- [**breaking**] Box Delaunay repair flip errors [#407](https://github.com/acgetchell/delaunay/pull/407) + [`1789ceb`](https://github.com/acgetchell/delaunay/commit/1789cebd4f56b4dc09e014482d8d90176fdaeffc) + + - Box `DelaunayRepairError::Flip` sources while preserving typed `FlipError` + inspection through `From<FlipError>` and `Error::source`. + - Update repair and construction mappings for the named boxed variant. + - Cover clone and source behavior for wrapped linear-algebra errors. +- Isolate strict insphere consistency control [#383](https://github.com/acgetchell/delaunay/pull/383) [#411](https://github.com/acgetchell/delaunay/pull/411) + [`222e572`](https://github.com/acgetchell/delaunay/commit/222e572b4364007cdbf6d1fa6428ea7e670cfb56) + + - Document the strict insphere consistency environment knob as a process-wide + once-per-process snapshot. + - Add a thread-local test override guard so strict diagnostic paths can be + exercised without mutating global environment state. + - Mark the production review checklist item complete. +- [**breaking**] Run slow correctness cases through slow-tests [#412](https://github.com/acgetchell/delaunay/pull/412) + [`1498153`](https://github.com/acgetchell/delaunay/commit/149815313530335a98f6951c63924e4774d509c1) + + - Define the slow-test bucket around deterministic correctness tests that exceed the default-suite budget. + - Move runnable high-dimensional properties out of ignored tests and into either the default suite or the slow-tests feature. + - Give just test-slow a release-mode nextest profile with a longer watchdog for intentional multi-minute regressions. + - Add a repository Semgrep guard against reintroducing slow ignored tests. + +#### Changed: Enforce explicit test buckets + +- Sort correctness tests into default and slow-tests buckets instead of relying on ignored tests. +- Move benchmark-style boundary and UUID iterator measurements into a Criterion benchmark target. +- Replace ignored flaky or known-failure cases with active assertions or slow-tests gating. +- Add a Semgrep guard against reintroducing ignored tests and align docs and helper recipes with the new taxonomy. +- Enforce 10-second default test budget [#415](https://github.com/acgetchell/delaunay/pull/415) + [`ba15de8`](https://github.com/acgetchell/delaunay/commit/ba15de8e97ab3dace8a2f5e0443f473930d1d344) + + - Gate default-suite cases at or above the 10-second budget behind + slow-tests and remove obsolete high-dimensional periodic validation from + routine runs. + - Move allocation hot-path contracts into a Criterion benchmark over + calibrated 2D-5D fixtures, leaving allocation_api as wiring smoke coverage. + - Document the toroidal validation limits and add the bench-allocations + workflow. + +### Documentation + +- Refresh release docs and benchmark guidance [#389](https://github.com/acgetchell/delaunay/pull/389) + [`526583c`](https://github.com/acgetchell/delaunay/commit/526583c627d32d9336910bce1913b7f458ca413c) + + - Update the README pitch, feature list, references, and docs.rs-facing guidance + around exact predicates, SoS, PL-manifold validation, and bistellar repair. + - Refresh roadmap, release, limitation, robustness, orientation, invariant, + diagnostics, property-testing, workflow, and validation docs for the v0.7.8 + cleanup path and v0.8.0 paper-facing work. + - Align contributor and script docs around non-mutating `just` checks before + mutating fixes. + - Update generated benchmark-summary guidance to surface `just bench-perf-summary`, + current Criterion metadata, and large-scale characterization defaults. +- Prefer builder-based fallible examples [#214](https://github.com/acgetchell/delaunay/pull/214) [#409](https://github.com/acgetchell/delaunay/pull/409) + [`238dc12`](https://github.com/acgetchell/delaunay/commit/238dc124f6fb930cbeee31ea07c16d017f1822bd) + + - Present `DelaunayTriangulationBuilder` as the primary construction path while retaining `DelaunayTriangulation::new` as a legacy convenience constructor. + - Replace doctest `unwrap()` patterns with typed `?` propagation and explicit optional guards across construction, validation, repair, geometry, and topology + examples. + - Re-export `DelaunayTriangulationBuilder` from `prelude::delaunayize` so single-prelude delaunayize examples can use the builder directly. +- Use typed errors in public examples [#365](https://github.com/acgetchell/delaunay/pull/365) [#410](https://github.com/acgetchell/delaunay/pull/410) + [`15633e2`](https://github.com/acgetchell/delaunay/commit/15633e2c03d2b2b9af1532676f0ce2c1292a538c) + + - Replace public doctest unwraps and expects with typed Result examples across core and geometry APIs. + - Use concrete crate errors or small local thiserror enums in guides instead of boxed dynamic errors. + - Clarify toroidal builder wording and point the README at the workflow docs for periodic construction. + +### Fixed + +- Surface squash-body commit entries [#395](https://github.com/acgetchell/delaunay/pull/395) + [`44dc3ed`](https://github.com/acgetchell/delaunay/commit/44dc3ede1012ed4b1f3a560b3c724e2e21d5169e) + + - Mirror conventional pseudo-commit headings from squash merge bodies into their matching changelog sections while preserving the primary PR entry. + - Regenerate active and archived changelogs so historical squash-body fixes, docs, maintenance, and performance notes appear under the right headings. + - Resolve production-review hygiene by clarifying Cargo feature gates, relabeling TDS UUID-map invariants, and recording UUID panic paths as test-only. +- Validate compact 3D toroidal quotients [#417](https://github.com/acgetchell/delaunay/pull/417) + [`3456ca9`](https://github.com/acgetchell/delaunay/commit/3456ca96abeeee5efb2ef413c3eb91d57f3921b4) + + - Validate periodic image-point quotients through final Levels 1-3 topology and Level 4 Delaunay checks before returning them. + - Preserve lifted periodic vertex identity in Euler and manifold validation so 3D quotient links and ridges are checked in the correct lattice frame. + - Select periodic quotient candidates by circumcenter ownership instead of barycenter ownership. + - Add a typed UnsupportedPeriodicDimension guardrail so 4D/5D periodic quotient construction fails fast pending scalable follow-up work in #416. + - Refresh toroidal periodic docs to state the 2D/compact 3D release boundary and high-dimensional guardrails. +- Roll back failed topology repair [#418](https://github.com/acgetchell/delaunay/pull/418) + [`8a9cbf3`](https://github.com/acgetchell/delaunay/commit/8a9cbf3510ebc16b884951791f2de20412cf6c36) + + - Restore the incoming triangulation when topology repair fails before fallback rebuild can recover. + - Add a regression for partial topology-repair mutation that exhausts its iteration budget. + - Update the v0.7.8 release metadata, roadmap, benchmark summary, changelog, and citation data. + - Tighten the doctest `.expect(` release guard to the current zero-count baseline. + +### Maintenance + +- Replace Node markdown tooling with rumdl [#394](https://github.com/acgetchell/delaunay/pull/394) + [`5654d14`](https://github.com/acgetchell/delaunay/commit/5654d14bc04dba538d776800495846d0a6ea94da) + + - Switch Markdown checks and Codacy configuration from markdownlint/npx to rumdl. + - Add dprint/pretty_yaml YAML formatting and wire yaml-check/yaml-fix through dprint plus yamllint. + - Format generated changelog archives with rumdl after git-cliff postprocessing. + - Add Semgrep guards for check-before-fix docs and pinned, allowlisted GitHub Actions. +- Bump codecov/codecov-action from 6.0.0 to 6.0.1 [#398](https://github.com/acgetchell/delaunay/pull/398) + [`325aa94`](https://github.com/acgetchell/delaunay/commit/325aa941ba9adaca7973c1f2a3f623c88b9a5d27) + + Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 6.0.1. + + - [Release notes](https://github.com/codecov/codecov-action/releases) + - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/codecov/codecov-action/compare/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354) +- Bump sysinfo in the dependencies group across 1 directory [#397](https://github.com/acgetchell/delaunay/pull/397) + [`8800150`](https://github.com/acgetchell/delaunay/commit/88001505822ed949c5075f9000a7f2e114bcf089) + + Bumps the dependencies group with 1 update in the / directory: [sysinfo](https://github.com/GuillaumeGomez/sysinfo). + + Updates `sysinfo` from 0.39.1 to 0.39.2 + + - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) + - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.39.1...v0.39.2) +- Bump taiki-e/install-action from 2.77.5 to 2.79.1 [#396](https://github.com/acgetchell/delaunay/pull/396) + [`d89961c`](https://github.com/acgetchell/delaunay/commit/d89961cfdc4af5c354c78f4e5fe008f1f273c6e2) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.77.5 to 2.79.1. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/fa0dd4cd0a40696e6f9766370614a5ce482e6aa8...b550161ef8a7bc4f2a671c0b03a18ac9ccedea1e) +- Bump idna in the uv group across 1 directory [#400](https://github.com/acgetchell/delaunay/pull/400) + [`dadb724`](https://github.com/acgetchell/delaunay/commit/dadb7248243e2b320095c647d8314fd952c116e0) + + Bumps the uv group with 1 update in the / directory: [idna](https://github.com/kjd/idna). + + Updates `idna` from 3.13 to 3.15 + + - [Release notes](https://github.com/kjd/idna/releases) + - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md) + - [Commits](https://github.com/kjd/idna/compare/v3.13...v3.15) +- Run Windows tests with cargo-nextest [`bc5d48f`](https://github.com/acgetchell/delaunay/commit/bc5d48f61012d49224d783f6c49f88024948959c) + + - Install and verify the pinned cargo-nextest version across the CI build matrix. + - Run Windows library and release integration tests through nextest while keeping doctests on cargo test. + - Document the Windows nextest alignment in the tooling notes. + +### Performance + +- Localize remove_vertex repair [#401](https://github.com/acgetchell/delaunay/pull/401) + [`382f9e1`](https://github.com/acgetchell/delaunay/commit/382f9e13cff0f4a325361c056ea1d59be18003c5) + + - Avoid global simplex scans and incident-simplex rebuilds on successful + vertex removal by using the affected vertex star and scoped repair. + - Promote and validate orientation over the touched removal scope, with the + full global orientation path retained as a fallback. + - Add a Criterion remove_vertex benchmark covering successful removals and + invalid-remnant rollback across 2D through 5D. + +#### Performance: Stress remove_vertex cases + +- Add adversarial remove_vertex benchmark fixtures for near-boundary, + cospherical, near-degenerate, and large-coordinate point sets. +- Include the selected fixture kind in Criterion case names so benchmark + output shows which geometry each run exercises. +- Name the vertex-removal orientation normalization budget. + +#### Changed: Cover vertex-removal helper invariants + + Add focused regression coverage for vertex-removal helper behavior: + +- affected-vertex collection and missing-simplex error preservation +- local validation-scope deduplication and live-simplex filtering +- incident-simplex repair, isolated-vertex reporting, and postcondition failure +- fan-boundary filtering for facets that already contain the apex + +#### Fixed: Bound local facet repair removals + +- Preserve local repair removal budgets before mutating the TDS. +- Reuse scoped neighbor repair after vertex-removal facet cleanup. +- Install and verify cargo-nextest for faster CI test recipes. +- Build examples once before running their compiled binaries. + +## [0.7.7] - 2026-05-15 + +### ⚠️ Breaking Changes + +- Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) +- Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) +- Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) +- Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) +- Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) +- Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) + +### Merged Pull Requests + +- Stabilize large-scale profiling and construction [#377](https://github.com/acgetchell/delaunay/pull/377) +- Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) +- Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) +- Bump urllib3 in the uv group across 1 directory [#374](https://github.com/acgetchell/delaunay/pull/374) +- Bump actions-rust-lang/setup-rust-toolchain [#373](https://github.com/acgetchell/delaunay/pull/373) +- Bump sysinfo in the dependencies group [#372](https://github.com/acgetchell/delaunay/pull/372) +- Bump taiki-e/install-action from 2.76.0 to 2.77.5 [#371](https://github.com/acgetchell/delaunay/pull/371) +- Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) +- Cover fallback rebuild and flip roundtrips [#368](https://github.com/acgetchell/delaunay/pull/368) +- Harden SARIF tooling [#367](https://github.com/acgetchell/delaunay/pull/367) +- Repair insertion neighbors locally [#335](https://github.com/acgetchell/delaunay/pull/335) [#366](https://github.com/acgetchell/delaunay/pull/366) +- Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) +- Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) +- Bump python-multipart in the uv group across 1 directory [#361](https://github.com/acgetchell/delaunay/pull/361) +- Bump taiki-e/install-action from 2.75.26 to 2.76.0 [#360](https://github.com/acgetchell/delaunay/pull/360) +- Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) +- Enable repo Semgrep rules for issue #338 [#354](https://github.com/acgetchell/delaunay/pull/354) +- Type repair diagnostics and harden invariants [#332](https://github.com/acgetchell/delaunay/pull/332) [#352](https://github.com/acgetchell/delaunay/pull/352) +- Harden Python benchmark parsing [#351](https://github.com/acgetchell/delaunay/pull/351) +- Expand profiling benchmarks around public API workflows [#349](https://github.com/acgetchell/delaunay/pull/349) +- Bump taiki-e/install-action from 2.75.18 to 2.75.22 [#348](https://github.com/acgetchell/delaunay/pull/348) + +### Changed + +- Type repair diagnostics and harden invariants [#332](https://github.com/acgetchell/delaunay/pull/332) [#352](https://github.com/acgetchell/delaunay/pull/352) + [`a244053`](https://github.com/acgetchell/delaunay/commit/a2440531ae7ee1407e7436379a82fe092f02e7dd) + + - Replace stringified flip-repair skip samples with typed diagnostic context. + - Make vertex removal transactional across post-removal repair and orientation canonicalization. + - Deprecate DelaunayTriangulation::as_triangulation_mut ahead of removal in v0.8.0. + - Use scale-aware degeneracy checks for low-dimensional simplex and facet measures. + - Add regression and property coverage for rollback behavior, typed diagnostics, and scaled valid measures. + - Tolerate throughput formatting precision in benchmark baseline round-trip tests. +- [**breaking**] Harden Delaunay invariants and tooling [#362](https://github.com/acgetchell/delaunay/pull/362) + [`0c1f477`](https://github.com/acgetchell/delaunay/commit/0c1f477658ffbad2198cb55b76089dadfdba0a6d) + + - Enforce checked Delaunay construction and reconstruction so explicit connectivity, deserialization, and TDS wrapping cannot produce invalid + DelaunayTriangulation values. + - Replace stringly insertion and construction failures with typed, matchable errors, and route topology/TDS failures without production panics. + - Tighten public API names, trait bounds, prelude exports, docs, and doctests around mutation, reconstruction, construction statistics, and feature-gated + behavior. + - Standardize on DenseSlotMap storage, remove SlotMap backend comparison tooling, and align CI, docs.rs, changelog, benchmark, Semgrep, and release workflows. + - Harden benchmark comparison parsing so individual regressions and malformed baseline sections fail explicitly. +- Cover fallback rebuild and flip roundtrips [#368](https://github.com/acgetchell/delaunay/pull/368) + [`aa0de2c`](https://github.com/acgetchell/delaunay/commit/aa0de2cf8892b8caecfc3e8a3b04e3f4eefa23b5) + + - Add dimension-generic flip roundtrip properties for public k=1 and internal k=2/k=3 paths. + - Exercise fallback rebuilds after supported Delaunay repair failures and duplicate-simplex topology failures. + - Cover circumradius agreement between direct and precomputed-center paths. + - Exclude debug-only circumsphere logging branches from LCOV. +- [**breaking**] Harden typed validation and exact predicate APIs [#375](https://github.com/acgetchell/delaunay/pull/375) + [`e187cf0`](https://github.com/acgetchell/delaunay/commit/e187cf06761308b96a98f524c32bd3cf712250f8) + + - Replace stringly validation and repair contexts with typed summaries and failure categories across insertion, flips, TDS, builder, and Delaunay validation + paths. + - Tighten kernel, coordinate, and data trait contracts so exact predicates are dimension-scoped and payload bounds apply only where needed. + - Split explicit-construction validation into orthogonal typed errors and preserve structured source details through fallback and repair paths. + - Narrow focused prelude exports, add repository style rules, and document the 10,000-vertex 3D acceptance envelope. +- [**breaking**] Harden correctness and performance invariants [#376](https://github.com/acgetchell/delaunay/pull/376) + [`4c6d55e`](https://github.com/acgetchell/delaunay/commit/4c6d55e12ff60155c97e117aefabc5ff80d2f47f) + + - Replace scalar-unit duplicate detection with scale-aware tolerances and keep the spatial index usable across rollback-safe insertion and removal paths. + - Route matrix dispatch, predicate degeneracy, non-finite geometry, and robust insphere overflow through typed errors and exact relative-coordinate + predicates. + - Preserve TDS identity across transactional rollback, run required pseudomanifold validation during insertion, and remove raw cell-storage mutation. + - Use DoS-resistant hashing for coordinate-derived buckets and gate insertion timing telemetry to callers that consume it. + - Normalize root and archived changelog markdown through shared post-processing. + - Simplify validation telemetry, predicate helpers, cache invalidation, and prelude coverage without changing the correctness/performance contracts. + +### Fixed + +- Harden Python benchmark parsing [#351](https://github.com/acgetchell/delaunay/pull/351) + [`fea5898`](https://github.com/acgetchell/delaunay/commit/fea58987a2fb84e47603be9f0d1960aaa7e0f5f0) + + - Reject non-finite and unordered Criterion timing estimates before using them in summaries, baselines, or backend comparisons. + - Preserve full Criterion benchmark IDs and normalize timing units when comparing storage backend results. + - Reuse the shared baseline parser while preserving malformed-section skip behavior and supporting scientific notation. + - Fall back from unusable lscpu output to /proc CPU core detection on Linux. + - Add regression and round-trip tests for parser behavior, benchmark IDs, unit normalization, and Linux CPU fallback. + - Document Python parser/file-format round-trip test expectations. + +#### Fixed: Harden Criterion estimate parsing and validation + + Consolidates estimate validation into a single public helper, + `is_valid_criterion_estimate`, now used by `PerformanceSummaryGenerator` + and `StorageBackendComparator`. Adds explicit type checks to + `PerformanceSummaryGenerator` to reject structurally malformed JSON + data, improving parsing robustness. + +- [**breaking**] Preserve topology and public error invariants [#363](https://github.com/acgetchell/delaunay/pull/363) + [`83d9619`](https://github.com/acgetchell/delaunay/commit/83d96197cc5f7b2b2242904b7bab76ac9e058e6c) + + - Make duplicate-cell removal and bistellar flip mutation fail before committing invalid TDS state. + - Preserve typed topology, validation, and insertion errors through retry and flip-wiring paths. + - Enforce typed error handling in public examples, benchmarks, and public API integration tests. + - Rebuild and validate TDS topology after duplicate-cell removal so neighbor and incident-cell links stay consistent. + - Preserve flip validation, wiring, and repair failure kinds instead of flattening them into coarse mutation errors. + - Propagate construction failures from examples and route benchmark diagnostics through feature-gated tracing. + - Clarify public API docs for collection aliases and facet error paths. + +#### Fixed: Make duplicate-cell removal transactional + +- Validate duplicate-cell removals on a cloned TDS and commit only after neighbor rebuilding, incident-cell assignment, and full validation succeed. +- Preserve typed construction and mutation errors in examples and doctests, including prelude coverage for TdsMutationError. +- Share feature-gated tracing abort helpers across benchmarks and keep setup error handling out of measured closures. +- Remove committed debug printing from collection tests. + +### Maintenance + +- Bump taiki-e/install-action from 2.75.18 to 2.75.22 [#348](https://github.com/acgetchell/delaunay/pull/348) + [`31ec720`](https://github.com/acgetchell/delaunay/commit/31ec720a8638103b9acd7ea58c35b2baa5f571b9) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.18 to 2.75.22. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/055f5df8c3f65ea01cd41e9dc855becd88953486...cf525cb33f51aca27cd6fa02034117ab963ff9f1) +- Enable repo Semgrep rules for issue #338 [#354](https://github.com/acgetchell/delaunay/pull/354) + [`9d51d30`](https://github.com/acgetchell/delaunay/commit/9d51d3038ae3f3316102ecaf39429bdfb73ff1cc) + + - Enable project-owned Semgrep rules in local checks, CodeRabbit, and Codacy/OpenGrep scanning. + - Harden Semgrep execution with strict mode, a higher timeout, and fixture coverage for hot-path hash collection rules. + - Replace flagged diagnostics and silent numeric fallbacks with explicit tracing, expectations, and typed Hilbert quantization errors. + - Centralize Delaunay triangulation cache invalidation through the existing repair-cache helper. + +#### Maintenance: Enable repository Semgrep rules + +- Rename the Semgrep config to semgrep.yaml and wire it into local checks, CodeRabbit, and Codacy/OpenGrep. +- Add strict Semgrep execution plus fixture coverage for hot-path hash collections and targeted panic bypasses. +- Make Hilbert errors non-exhaustive and document quantization-scale conversion failures on APIs that can return them. +- Replace fragile VertexBuilder expect paths with infallible Vertex point constructors. + +#### Maintenance: Expand repository Semgrep rules + +- Add project-specific Semgrep checks for Rust dynamic errors, lint suppression reasons, Python subprocess mocks, and typed script helpers. +- Add focused Semgrep fixtures for hot-path hash collections, Rust project rules, and Python test conventions. +- Wire the expanded Semgrep fixture suite into `just check`. +- Replace stale Clippy `allow` suppressions with documented `expect` attributes and remove dynamic error trait-object usage from tests. + +#### Maintenance: Refresh quality tooling and diagnostics + +- Pin GitHub workflow tool versions and update action SHAs for cache, artifact upload, install-action, and SARIF upload. +- Exclude Semgrep fixtures from Codacy analysis so intentional rule-test violations do not surface as production issues. +- Add a cargo-machete backed just unused-deps recipe for checking unused direct dependencies. +- Gate convex hull test diagnostics behind diagnostics tracing instead of unconditional stdout output. +- Add Hilbert ordering and zero-dimensional sort coverage for Codecov patch gaps. + +#### Fixed: Harden Hilbert ordering errors and prelude checks [#338](https://github.com/acgetchell/delaunay/pull/338) + +- Return typed Hilbert errors for non-finite quantization inputs and failed u32 coordinate conversions instead of silently collapsing values. +- Preserve item order when Hilbert sort key construction fails, and add regression coverage for the new error paths. +- Add the focused ordering prelude and update doctests, examples, benchmarks, and integration tests to use orthogonal prelude imports. +- Add a Semgrep rule and fixture coverage for examples and benchmarks that bypass focused preludes. +- Verify pinned shfmt binaries in CI with explicit SHA256 values instead of downloading a missing upstream checksum file. +- [**breaking**] Quiet Codacy code scanning noise [#356](https://github.com/acgetchell/delaunay/pull/356) + [`5d8a9ff`](https://github.com/acgetchell/delaunay/commit/5d8a9ff3bfd260636a8fa4209cb00801c134aaa5) + + - Skip empty Codacy SARIF runs before uploading results to GitHub Code Scanning. + - Limit Codacy code scanning uploads to repository-owned OpenGrep analysis. + - Migrate triangulation doctests to focused prelude imports for #355. + - Add Semgrep coverage to keep triangulation doctest imports on focused preludes. + - Clarify vertex point-constructor docs and avoid UUID-bearing facet assertion output. + +#### Added: Add focused preludes for doctest imports + +- Add minimal, task-focused preludes for triangulation, TDS, geometry, queries, generators, ordering, collections, and topology workflows. +- Update doctests, examples, integration tests, and benchmarks to use focused preludes instead of deep internal imports. +- Expand the Semgrep doctest import rule to cover all Rust source files and hidden doctest imports. +- Harden Codacy SARIF handling so empty analyses skip upload cleanly instead of creating noisy code-scanning results. +- Document the new prelude structure and update guides to use public prelude imports. + +#### Fixed: Gate public diagnostic exports behind diagnostics + +- Replace profile-based public diagnostic exports with the documented diagnostics feature. +- Keep debug-only helper definitions and diagnostic call sites aligned with feature-gated API visibility. +- Allow hidden doctest prelude imports in the Semgrep prelude-import rule. + +#### Changed: Rename diagnostics feature flag + +- Use the diagnostics feature flag for opt-in diagnostic helpers and verbose test diagnostics. +- Add prelude::diagnostics for debug verification helpers while keeping focused preludes narrow and orthogonal. +- Move diagnostic helper exports out of unrelated focused preludes and update cfg gates, tests, docs, and just recipes. +- Document that focused preludes should favor precise taxonomy over backwards compatibility for unrelated re-exports. +- Bump taiki-e/install-action from 2.75.26 to 2.76.0 [#360](https://github.com/acgetchell/delaunay/pull/360) + [`5b764e0`](https://github.com/acgetchell/delaunay/commit/5b764e0ab8c63223e63835b475d4829081db5e94) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.26 to 2.76.0. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/b651345a718c8f44efa2460560b3dbf29cbd7ee1...711e1c3275189d76dcc4d34ddea63bf96ac49090) +- Bump python-multipart in the uv group across 1 directory [#361](https://github.com/acgetchell/delaunay/pull/361) + [`af6e210`](https://github.com/acgetchell/delaunay/commit/af6e210cba687606c24c8c2a2ba519470d787abe) + + Bumps the uv group with 1 update in the / directory: [python-multipart](https://github.com/Kludex/python-multipart). + + Updates `python-multipart` from 0.0.26 to 0.0.27 + + - [Release notes](https://github.com/Kludex/python-multipart/releases) + - [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md) + - [Commits](https://github.com/Kludex/python-multipart/compare/0.0.26...0.0.27) +- Harden SARIF tooling [#367](https://github.com/acgetchell/delaunay/pull/367) + [`e5b20cd`](https://github.com/acgetchell/delaunay/commit/e5b20cd78fd58ba1bc77c20e5076dc778304b917) + + - Add a repository-rule Semgrep SARIF workflow for direct Code Scanning uploads. + - Harden Clippy SARIF generation with pipefail, cargo lint coverage, and guarded uploads. + - Discover Semgrep rule fixtures dynamically so new fixtures are tested automatically. + - Document the tooling parity updates ported from causal-triangulations. +- Bump taiki-e/install-action from 2.76.0 to 2.77.5 [#371](https://github.com/acgetchell/delaunay/pull/371) + [`b7fa94c`](https://github.com/acgetchell/delaunay/commit/b7fa94cb7611c12c2277b16ac9c215e177e95f41) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.76.0 to 2.77.5. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/711e1c3275189d76dcc4d34ddea63bf96ac49090...fa0dd4cd0a40696e6f9766370614a5ce482e6aa8) +- Bump urllib3 in the uv group across 1 directory [#374](https://github.com/acgetchell/delaunay/pull/374) + [`6b9716a`](https://github.com/acgetchell/delaunay/commit/6b9716ac2ccd01e979fe10b72303694e362af579) + + Bumps the uv group with 1 update in the / directory: [urllib3](https://github.com/urllib3/urllib3). + + Updates `urllib3` from 2.6.3 to 2.7.0 + + - [Release notes](https://github.com/urllib3/urllib3/releases) + - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) + - [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0) +- Bump actions-rust-lang/setup-rust-toolchain [#373](https://github.com/acgetchell/delaunay/pull/373) + [`3a9dabc`](https://github.com/acgetchell/delaunay/commit/3a9dabc1b84f804a86a0ae13ab16b7efc0a06d38) + + Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.16.0 to 1.16.1. + + - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) + - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) + - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/2b1f5e9b395427c92ee4e3331786ca3c37afe2d7...46268bd060767258de96ed93c1251119784f2ab6) +- Bump sysinfo in the dependencies group [#372](https://github.com/acgetchell/delaunay/pull/372) + [`efc2bb7`](https://github.com/acgetchell/delaunay/commit/efc2bb700e51039407794db7e0b9b47591187e02) + + Bumps the dependencies group with 1 update: [sysinfo](https://github.com/GuillaumeGomez/sysinfo). + + Updates `sysinfo` from 0.39.0 to 0.39.1 + + - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) + - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.39.0...v0.39.1) + +### Performance + +- Expand profiling benchmarks around public API workflows [#349](https://github.com/acgetchell/delaunay/pull/349) + [`0acbf65`](https://github.com/acgetchell/delaunay/commit/0acbf651b57c287aecc10bd51eea55fdbcbe2442) + + - Run profiling comparisons with the checked-out crate toolchain by default + - Add local `just profile` support for comparing code refs and compiler versions + - Expand `ci_performance_suite` beyond construction to cover hulls, boundary traversal, validation, and bistellar flips + - Emit a versioned API benchmark manifest so benchmark logs show which public workflows were measured +- Repair insertion neighbors locally [#335](https://github.com/acgetchell/delaunay/pull/335) [#366](https://github.com/acgetchell/delaunay/pull/366) + [`f09d698`](https://github.com/acgetchell/delaunay/commit/f09d69802fd9ebc554b7df8745db1e6b9ca2126a) + + - Replace post-insertion global neighbor rebuilds with seeded local repair + over new cells, removed-cell frontiers, and facet-issue survivors. + - Preserve facet-compatible existing neighbor pointers while repairing + empty, dangling, or stale local slots. + - Add a release-mode escape hatch for forcing global neighbor rebuilds + during A/B isolation. + - Expose the low-level local repair helper through the insertion prelude + and preserve typed neighbor-repair error sources. +- [**breaking**] Cadence batch repair for large construction [#369](https://github.com/acgetchell/delaunay/pull/369) + [`a984b3a`](https://github.com/acgetchell/delaunay/commit/a984b3aa0c57a967b0ae6f33b88042af49ac52cb) + + - Add a batch repair policy option to ConstructionOptions so bulk insertion can repair local Delaunay fronts every N insertions. + - Carry pending local repair seeds through batch construction and finalization so cadenced repairs cover the accumulated frontier. + - Report construction telemetry for locate walks, conflict regions, global exterior scans, skipped-vertex budgets, and initial-simplex A/B runs in the + large-scale debug harness. + +#### Performance: Keep bulk repair seeding local + +- Return live insertion-created cells as repair seeds so batch construction can + accumulate local frontiers without scanning vertex stars globally. +- Move repair seed frontier helpers into triangulation locality utilities and + defer broad repair fallback to final construction repair. +- Extend construction telemetry and large-scale debug output with seed + accumulation timing. + +#### Performance: Keep exterior repair seeding local + +- Preserve the terminal locate cell so exterior insertion can seed nearby repair work without scanning the full triangulation. +- Skip global conflict-region scans during exterior hull extension and defer broad Delaunay cleanup to cadenced and final repair. +- Move local repair seed bookkeeping helpers into triangulation locality utilities. + +#### Performance: Localize construction repair cadence + +- Keep exterior repair seeding local when conflict buffers are empty, avoiding global conflict-region scans during insertion. +- Gate topology-validation telemetry on actual validation work and add typed validation cadences for large-scale diagnostics. +- Preserve typed Delaunay repair failures with construction repair phases and keep mutation repair gates independent of insertion cadence. +- Add focused triangulation construction, repair, and validation preludes across docs, examples, benches, and tests. + +#### Performance: Trigger batch repair on seed backlog [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Add an adaptive seed-backlog trigger for batch local Delaunay repair. +- Track local repair frontier sizes and cadence versus backlog triggers. +- Expose the 3D large-scale repair interval in the debug just recipe. +- Clarify batch repair policy docs and cover trigger/telemetry behavior with focused tests. + +#### Performance: Fast-path retry validation [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Use the flip-based Delaunay verifier when accepting shuffled construction + retries instead of the brute-force property scan. +- Add construction phase telemetry for preprocessing, insertion, finalization, + and final validation timing. +- Default the large-scale debug repair interval to 2 for the 3K repair sweep. + +#### Performance: Default batch repair to EveryN(2) [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Default batch construction repair to EveryN(2) while keeping direct incremental repair at EveryInsertion. +- Preserve final repair and validation as the acceptance gate for valid Delaunay output. +- Surface construction skip and slow-insertion diagnostics through the construction prelude. +- Align repair-policy docs with the batch default and the current 500/3000-point proxy results. + +#### Fixed: Tolerate degenerate Delaunay retessellation [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Compare quality metrics only for cells shared across independently + transformed triangulations, rejecting cases with no comparable cells. +- Narrow locality repair helper visibility where the current module graph + allows it while preserving core insertion repair access. +- Clarify that non-substantive PRs may be declined unless justified by + cleanup or tooling needs. + +#### Fixed: Distinguish insertion telemetry [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Count only full insertion validation runs in topology validation telemetry while preserving required link checks. +- Exclude caller-provided conflict buffers from discovered conflict-region telemetry. +- Keep large-scale debug validation cadence tied to inserted vertices and tighten triangulation proptest acceptance. +- Add explicit unsafe-code forbids to remaining bench, example, and test crates. + +#### Performance: Tune batch construction repair [#341](https://github.com/acgetchell/delaunay/pull/341) + +- Default batch construction to the real-vertex max-volume initial simplex and + every-insertion Delaunay repair cadence. +- Add focused construction diagnostics telemetry for repair phase timing, + queued work, seed frontiers, and construction phase costs. +- Keep local repair postcondition replay tied to observed repair work so skipped + flip candidates cannot suppress required validation. +- Update large-scale debug docs and recipes to reflect the new defaults. +- Stabilize large-scale profiling and construction [#377](https://github.com/acgetchell/delaunay/pull/377) + [`77ba50b`](https://github.com/acgetchell/delaunay/commit/77ba50b23c6f22fbeaa6acf240bb144bbb1458f7) + + - Calibrate the 2D-5D debug-large-scale acceptance runs around maintainer + hardware and document generated simplex counts. + - Fold large-scale profiling into profiling_suite with construction, memory, + validation, and traversal workloads. + - Compare performance regressions against same-machine main-ref baselines. + - Harden insertion topology preflight and exact insphere paths used by repair + and high-dimensional construction. + +## [0.7.6] - 2026-04-25 + +### ⚠️ Breaking Changes + +- Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) + [#318](https://github.com/acgetchell/delaunay/pull/318) + +### Merged Pull Requests + +- Preserve fallback rebuild cell data [#305](https://github.com/acgetchell/delaunay/pull/305) [#346](https://github.com/acgetchell/delaunay/pull/346) +- Switch coverage reporting to cargo-llvm-cov [#345](https://github.com/acgetchell/delaunay/pull/345) +- Clarify research scope and changelog hygiene [#344](https://github.com/acgetchell/delaunay/pull/344) +- Instrument large-scale 4D debugging and widen local repair seeds [#339](https://github.com/acgetchell/delaunay/pull/339) +- Orient Delaunay repair replacement cells [#307](https://github.com/acgetchell/delaunay/pull/307) [#336](https://github.com/acgetchell/delaunay/pull/336) +- Use dedicated perf profile for consistent benchmark measurement [#334](https://github.com/acgetchell/delaunay/pull/334) +- Periodic-aware Delaunay verification (Level 4) for toroidal tria… [#333](https://github.com/acgetchell/delaunay/pull/333) +- Adopt Rust 1.95.0 MSRV [#330](https://github.com/acgetchell/delaunay/pull/330) +- Bump actions-rust-lang/setup-rust-toolchain [#328](https://github.com/acgetchell/delaunay/pull/328) +- Bump actions/setup-node from 6.3.0 to 6.4.0 [#327](https://github.com/acgetchell/delaunay/pull/327) +- Bump taiki-e/install-action from 2.75.9 to 2.75.18 [#326](https://github.com/acgetchell/delaunay/pull/326) +- Bump astral-sh/setup-uv from 8.0.0 to 8.1.0 [#325](https://github.com/acgetchell/delaunay/pull/325) +- Bump pytest in the uv group across 1 directory [#322](https://github.com/acgetchell/delaunay/pull/322) +- Bump taiki-e/install-action from 2.73.0 to 2.75.9 [#321](https://github.com/acgetchell/delaunay/pull/321) +- Bump actions/github-script from 8.0.0 to 9.0.0 [#320](https://github.com/acgetchell/delaunay/pull/320) +- Unify flip-repair and retry constants across build profiles [#306](https://github.com/acgetchell/delaunay/pull/306) + [#319](https://github.com/acgetchell/delaunay/pull/319) +- Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) + [#318](https://github.com/acgetchell/delaunay/pull/318) +- Rename tds file and move delaunay/builder into triangulation/ [#317](https://github.com/acgetchell/delaunay/pull/317) +- Allow explicit cell construction with non-sphere Euler characteristic [#314](https://github.com/acgetchell/delaunay/pull/314) + +### Added + +- Allow explicit cell construction with non-sphere Euler characteristic [#314](https://github.com/acgetchell/delaunay/pull/314) + [`c81bb1a`](https://github.com/acgetchell/delaunay/commit/c81bb1a69f50a8c777890c0ac95b07cb99033d83) + + Add `.global_topology()` builder setter so callers can declare the + intended topology (e.g. Toroidal) for explicit cell construction. + `validate_topology_core()` uses this metadata to override the heuristic + classification: closed toroidal meshes expect χ = 0 instead of the + sphere default χ = 1+(-1)^D. + + - Add `ToroidalConstructionMode::Explicit` variant for explicit builds + - Add `TopologyClassification::ClosedToroid(D)` with χ(T^d) = 0 + - Add `global_topology` field and setter to `DelaunayTriangulationBuilder` + - Thread `GlobalTopology` through `build_explicit()`, set before validation + - Override Euler classification in `validate_topology_core()` when + `global_topology` is `Toroidal` and heuristic yields `ClosedSphere` + - Add T² (3×3 grid) and T³ (3×3×3 Freudenthal) integration tests + validating χ = 0 via explicit construction +- Instrument large-scale 4D debugging and widen local repair seeds [#339](https://github.com/acgetchell/delaunay/pull/339) + [`3af976e`](https://github.com/acgetchell/delaunay/commit/3af976ec2f7c33d49803b24ab8f1a7da598fea0b) + + - Thread cavity-touched cells through insertion as `repair_seed_cells` + so post-insertion local Delaunay repair widens its frontier beyond + the inserted vertex star; cells shrunk out of the conflict region + during cavity reduction now participate in the next repair pass. + - Accumulate ridge-fan extras across every fan in a conflict region + before returning `RidgeFan`, letting one cavity-reduction step + shrink all detected fans at once instead of peeling them iteration + by iteration. + - Add release-visible diagnostic hooks routed through `tracing::debug!`: + `DELAUNAY_BULK_PROGRESS_EVERY` for periodic batch-construction + progress, `DELAUNAY_DEBUG_RETRYABLE_SKIP` for retryable + conflict-region skip traces, `DELAUNAY_DEBUG_CAVITY_REDUCTION_ONCE` + for the first cavity-reduction chain, `DELAUNAY_DEBUG_RIDGE_FAN_ONCE` + for the first detected ridge fan, and + `DELAUNAY_REPAIR_DEBUG_POSTCONDITION_FACET` / + `DELAUNAY_REPAIR_DEBUG_RIDGE_MIN_MULTIPLICITY` for repair + postcondition debugging. + - Thread `last_applied_flip` through repair postcondition verification + so unresolved k=2 facet and ridge snapshots can relate the violating + local star to the immediately preceding flip. + - Replace `ConflictError::InternalInconsistency { context: String }` + with a typed `InternalInconsistencySite` enum carrying structured + indices and counts, so callers can `matches!` on specific sites + instead of parsing prose. + - Generalize the large-scale incremental prefix bisect over `const D`, + add a 4D counterpart targeting the seeded 500-point repro + (`0xD225_B8A0_7E27_4AE6`), and expose it via + `just debug-large-scale-4d-incremental-bisect`. + - Switch the large-scale debug just recipes to `--release` and + document the 2026-04-23 re-verification: historical 35-point 3D and + 100-point 4D correctness repros from #306/#307 now pass, while a + 500-point 4D seed still fails all shuffled retries with + `Ridge fan detected: 4 facets share ridge with 3 vertices`. + - Default the large-scale debug harness tracing filter to `debug` when + any of the new release-visible env vars are present so library-side + `tracing::debug!` events surface without extra `RUST_LOG` wiring. + - Broaden `test_perturbation_retry_and_exhaustion_4d` and + `test_perturbation_retry_seeded_branch_4d` to iterate over 50 seeds + so the retry-path assertions stay robust to insertion-path + improvements that make individual well-conditioned seeds less likely + to trigger retries. + +#### Fixed: Close the 4D bulk repair retry collapse + +- Raise the D≥4 per-insertion repair budget, add a rate-limited escalation pass, and widen local post-repair validation so the 500-point #204 repro converges + without skipped vertices. +- Preserve removed-cell snapshots and predecessor context in flip diagnostics, drop stale repair seeds after cavity reduction, and re-export locate conflict + diagnostics from the prelude. +- Replace committed `eprintln!` diagnostics in production, tests, and benches with `tracing`, using `diagnostics` and `bench-logging` gates and keeping logs + out of Criterion hot loops. +- Document the #204 investigation, refresh the 4D known-issues and TODO notes, and record the repository logging policy plus release-visible debug environment + variables. + +#### Changed: Harden flip diagnostics and refine large-scale debug workflows + + Refactor flip snapshotting and cavity-reduction bookkeeping to ensure + diagnostic reliability and accurate repair-seed collection. Update + documentation and justfile recipes to reflect fixed historical repros + and transition to monitoring active scalability investigations for 3D, + 4D, and 5D datasets. + +- Move removed-cell vertex capturing into fallible internal helpers +- Implement lazy evaluation for cavity-reduction diagnostic logs +- Harden vertex deduplication with fallible epsilon validation +- Update 4D known issues to reflect 100-point and 500-point fixes +- Simplify the large-scale debug harness CLI and documentation + +### Changed + +- Rename tds file and move delaunay/builder into triangulation/ [#317](https://github.com/acgetchell/delaunay/pull/317) + [`25faa5b`](https://github.com/acgetchell/delaunay/commit/25faa5b4b2fe54b20e609cd390fe3edb221da29b) + + - Rename src/core/triangulation_data_structure.rs → src/core/tds.rs + - Move src/core/delaunay_triangulation.rs → src/triangulation/delaunay.rs + - Move src/core/builder.rs → src/triangulation/builder.rs + - Widen pub(in crate::core) → pub(crate) for cross-module access + - Preserve public API via re-exports in core {} + - Add GlobalTopology::is_euclidean() for API symmetry with is_toroidal() + - Add doctests for topology_guarantee, global_topology, topology_kind, + set_global_topology accessors + - Hoist in-function test imports to module-level per project convention + - Shorten fully-qualified paths (CellValidationError, ConflictError, etc.) + - Bump la-stack 0.3.0 → 0.4.0 (integer-only Bareiss, stack-backed exact + arithmetic, custom f64→BigRational via IEEE 754 bit decomposition) + - Update README, code_organization.md, debug_env_vars.md, rust.md, + numerical_robustness_guide.md, COVERAGE.md, and other active docs + - Archive docs left unchanged (historical state) +- [**breaking**] Remove ScalarAccumulative and ScalarSummable traits [#316](https://github.com/acgetchell/delaunay/pull/316) + [#318](https://github.com/acgetchell/delaunay/pull/318) [`c612188`](https://github.com/acgetchell/delaunay/commit/c61218858a169108da51067e9b65f6a26baede16) + + - Absorb AddAssign, SubAssign, and Sum bounds into CoordinateScalar + - Remove ScalarAccumulative and ScalarSummable traits and their blanket impls + - Replace all ScalarAccumulative bounds with CoordinateScalar across 20 files + - Simplify operator usage (e.g. coords[axis] += … instead of manual add-assign) +- Update dependencies and synchronize changelog (internal) [`7a1066b`](https://github.com/acgetchell/delaunay/commit/7a1066b4da9229a5148994f8a80f3521df62ec6c) + + Perform a general dependency update, including a patch bump for `uuid`. + Synchronize `CHANGELOG.md` with recent maintenance tasks, documentation + updates, and merged pull requests. Add `.kilo/` to the ignored user + configuration patterns. +- Use dedicated perf profile for consistent benchmark measurement [#334](https://github.com/acgetchell/delaunay/pull/334) + [`f527c0c`](https://github.com/acgetchell/delaunay/commit/f527c0cf37b76f09222800afcfc138e623957678) + + Introduce a `perf` Cargo profile that inherits from `release` but + restores ThinLTO and single codegen units. This ensures local, CI, and + release benchmarks are generated with identical optimization settings. + + Update all benchmark harnesses, `just` recipes, and documentation to + standardize on `--profile perf` for performance measurements, while + retaining the default release profile for fast validation in `just ci`. + A new `bench-smoke` target provides quick harness validation without + the overhead of high-sample measurements. + + Also deniest warnings via the manifest lint policy to ensure consistent + repository-wide enforcement. + +#### Changed: Standardize benchmark profiles and enhance SARIF analysis + + Standardize benchmark workflows to use the `perf` profile by default + across local scripts and CI for consistent optimization settings. Add a + dedicated CodeQL analysis workflow and refactor SARIF reporting for + cargo-audit, Clippy, and Codacy to improve GitHub Code Scanning + integration. Update manifest lints to comply with RFC 3389 priority + requirements and fix the minimum sample size for benchmark smoke tests. + +#### Changed: Track sampling metadata and standardize benchmark profiles + + Enhance performance regression testing by embedding sampling configuration + (Criterion settings and Cargo profile) into baseline files. This enables + automatic detection of configuration mismatches during comparisons. + Standardize benchmarking scripts on the trusted perf profile and update + developer guidelines for naming conventions and local imports. + +#### Changed: Enable debug line tables for perf profile and refine validation + + Include `debug = "line-tables-only"` in the perf Cargo profile to + enable source-level profiling. Update the benchmark comparison logic + to ensure that legacy baselines with missing or "Unknown" metadata + trigger configuration mismatch warnings. + +#### Changed: Expand benchmark metadata validation tests + + Update the benchmark utility tests to verify that differences or + omissions in Criterion measurement and warm-up time are correctly + reported in configuration mismatch warnings. + +#### Changed: Enable CodeRabbit request changes workflow + + Enable the request_changes_workflow in the CodeRabbit configuration to + allow the AI reviewer to formally request changes on pull requests. This + ensures that identified issues are explicitly addressed during the + review process rather than appearing as informational comments only. + +- Revise SECURITY.md for clarity and completeness [`bd041fa`](https://github.com/acgetchell/delaunay/commit/bd041fa18456abad59a11088ab8a14e7f399adbe) + +### Documentation + +- Sync documentation with post-v0.7.5 changes [skip ci] [`5fa36aa`](https://github.com/acgetchell/delaunay/commit/5fa36aa67cb99bb3a5781e4c2733c2acec3adea8) + + - Add missing files to code_organization.md directory tree + (debug_env_vars.md, TODO.md, conflict_region_verification.rs, + regression_issue_306.rs) + - Add delaunayize_repair example to README.md examples list + - Document new test files in tests/README.md (delaunayize_workflow, + conflict_region_verification, regression_issue_306) + - Update docs/TODO.md: mark completed items (#288, #302, #306/#307), + refresh next-release candidates +- Clarify research scope and changelog hygiene [#344](https://github.com/acgetchell/delaunay/pull/344) + [`f46b7ae`](https://github.com/acgetchell/delaunay/commit/f46b7ae1e64734e441854e9868fae73d5d503c68) + + - Refresh README research positioning with current scope, non-goals, + predicate limits, and documentation links. + - Add current limitations and roadmap docs, and archive stale 4D known + issues and TODO snapshots. + - Update stale module/workflow references across docs and regenerate the + active and archived changelogs. + - Teach changelog post-processing to render squash-body pseudo-headings as + prose, with tests covering the new normalization helpers. + +### Fixed + +- Handle geometric degeneracy gracefully in profiling benchmarks + [`3532624`](https://github.com/acgetchell/delaunay/commit/3532624ed1d669d215b2df2bbcea49236b720d10) + + - Replace .unwrap() on triangulation build with graceful error handling + across all benchmark functions in profiling_suite.rs + - Scaling and memory benchmarks skip iterations that hit degeneracy + - Query latency and algorithmic bottleneck benchmarks skip entries when + setup construction fails + - Fixes CI panic: GeometricDegeneracy during 3D memory profiling with + 10,000 random points (seed 42) +- Unify flip-repair and retry constants across build profiles [#306](https://github.com/acgetchell/delaunay/pull/306) + [#319](https://github.com/acgetchell/delaunay/pull/319) [`14f0d16`](https://github.com/acgetchell/delaunay/commit/14f0d16b7de52d25d64e7d1fb810b82817e5d7b6) + + Several flip-repair and construction-retry constants were split by + cfg(any(test, debug_assertions)), causing release builds to fail on + valid 3D inputs that debug/test builds handled correctly. + + Primary fix: RetryPolicy::default() was Disabled in release but + DebugOnlyShuffled { attempts: 6 } in debug/test. When the initial + Hilbert-ordered insertion hits a co-spherical flip cycle, shuffled + retries find a working vertex ordering. Without retries, the first + failure was fatal. Changed to Shuffled { attempts: 6 } unconditionally. + + Secondary fixes in flips.rs: + + - Unify MAX_REPEAT_SIGNATURE to 128 (was 32 in release) + - Unify default_max_flips 3D multiplier to 8x (was 4x in release) + - Make is_connected() postcondition check unconditional + + Also in delaunay.rs: + - Unify HEURISTIC_REBUILD_ATTEMPTS to 6 (was 2 in release) + - Remove cfg-gated DELAUNAY_SHUFFLE_ATTEMPTS constant + +#### Fixed: Enable construction retries in release builds by default + + Update RetryPolicy::default() to return Shuffled retries in all build + profiles. Previously, retries were disabled in release mode, causing + fatal construction failures on 3D configurations that required + alternative vertex insertion orders to converge. This change ensures + consistent behavior between debug and release builds and includes a + regression test for the reported failure case. + +- Periodic-aware Delaunay verification (Level 4) for toroidal tria… [#333](https://github.com/acgetchell/delaunay/pull/333) + [`7c788aa`](https://github.com/acgetchell/delaunay/commit/7c788aa1a7e3b2a94a53193d8d5894718b6afa07) + +#### Fixed: Periodic-aware Delaunay verification (Level 4) for toroidal triangulations [#315](https://github.com/acgetchell/delaunay/pull/315) + +- Thread GlobalTopologyModelAdapter through all flip-predicate evaluation + functions (k=2 facets, k=3 ridges, and their inverses) so insphere + predicates use lifted coordinates for periodic topologies. +- Add verify_delaunay_for_triangulation() as the preferred topology-aware + Level 4 entry point; is_delaunay_via_flips() now delegates to it. +- Add periodic lifting helpers: vertices_to_points_with_optional_lift, + vertex_point_lifted_into_cell, align_periodic_offset, and supporting + functions for offset lookup, validation, and cross-cell alignment. +- Repair paths continue to use GlobalTopology::DEFAULT (non-periodic), + which is correct since flip repair runs during construction. +- Add integration test reproducing the issue: toroidal_periodic 2D + triangulation now passes dt.validate() (Levels 1–4). +- Add doctest for verify_delaunay_for_triangulation. +- Add unit tests for align_periodic_offset (identity, delta shifts, + higher-dimension, overflow). + +#### Fixed: Use reference frames for periodic inverse predicates in flip repair + + Update Delaunay violation predicates to accept an optional frame cell, + ensuring coordinate lifting remains consistent for inverse k=2 and k=3 + moves. This prevents verification failures in toroidal triangulations + where inverse simplices lack a direct matching cell in the removal + buffer. Additionally, document the intent and invariants of internal + functions across the flip and construction modules to align with + updated developer guidelines. + +- Orient Delaunay repair replacement cells [#307](https://github.com/acgetchell/delaunay/pull/307) [#336](https://github.com/acgetchell/delaunay/pull/336) + [`68deb62`](https://github.com/acgetchell/delaunay/commit/68deb6212a0860cd85776744d29ba7e76f368579) + + - Build flip replacement cell order from oriented cavity-boundary constraints. + - Keep raw bistellar flips topology-oriented while requiring positive replacement geometry for Delaunay repair. + - Canonicalize bulk repair results before continuing construction. + - Add a 4D regression test for the issue #307 bulk construction failure. + - Document branch naming conventions for contributors and agents. + +#### Fixed: Harden flip repair invariants and PR quality gates + +- Reject periodic external cells when replacement-cell parity constraints cannot be preserved. +- Canonicalize after D>=4 bulk repair failures before continuing with later insertions. +- Consolidate fixed-bug regression coverage into tests/regressions.rs and document the pattern. +- Narrow CodeQL/Codacy code scanning noise while keeping curated PR quality feedback via Codacy and CodeRabbit. +- Stage repository-owned Semgrep rules for future cleanup without enabling broad default rule packs. + +#### Changed: Cover flip repair checks and quality tooling + +- Add focused coverage for replacement-cell orientation helper error paths and D>=4 bulk-repair canonicalization branches. +- Strengthen the #307 regression with a longer 4D prefix and explicit geometric-orientation validation. +- Add an opt-in `just semgrep` workflow, pin Semgrep in uv dev dependencies, and refresh Python tool versions. +- Clarify CodeRabbit/Codacy quality-scan documentation and workflow labels. +- Preserve profiling benchmark rustflags behavior under setup-rust-toolchain. +- Preserve fallback rebuild cell data [#305](https://github.com/acgetchell/delaunay/pull/305) [#346](https://github.com/acgetchell/delaunay/pull/346) + [`7e42be8`](https://github.com/acgetchell/delaunay/commit/7e42be8fba9abe571d0137710fbd7ed0151ebc85) + + - Restore cell payloads during delaunayize fallback rebuilds when a rebuilt cell matches exactly one original vertex UUID signature. + - Treat duplicate original cell signatures as ambiguous, even when their payloads are identical. + - Preserve typed snapshot, rebuild, and restore errors for debuggable fallback failure paths. + - Expose delaunayize error payload types through the focused workflow prelude and add normal-type coverage. + - Document fallback cell-data preservation and refresh related test/docs utility updates. + +### Maintenance + +- Bump pytest in the uv group across 1 directory [#322](https://github.com/acgetchell/delaunay/pull/322) + [`c5e3c3b`](https://github.com/acgetchell/delaunay/commit/c5e3c3bb35c94add75dc1550860b77a0a7e01f32) + + Bumps the uv group with 1 update in the / directory: [pytest](https://github.com/pytest-dev/pytest). + + Updates `pytest` from 8.4.2 to 9.0.3 + + - [Release notes](https://github.com/pytest-dev/pytest/releases) + - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) + - [Commits](https://github.com/pytest-dev/pytest/compare/8.4.2...9.0.3) +- Bump actions/github-script from 8.0.0 to 9.0.0 [#320](https://github.com/acgetchell/delaunay/pull/320) + [`80f5984`](https://github.com/acgetchell/delaunay/commit/80f5984dbe45535226a26a47b2f3eb509b0b9f88) + + Bumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0. + + - [Release notes](https://github.com/actions/github-script/releases) + - [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3) +- Bump taiki-e/install-action from 2.73.0 to 2.75.9 [#321](https://github.com/acgetchell/delaunay/pull/321) + [`d9fa322`](https://github.com/acgetchell/delaunay/commit/d9fa322eda20cbb4f9b35f3db954618072905613) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.73.0 to 2.75.9. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/7a562dfa955aa2e4d5b0fd6ebd57ff9715c07b0b...d0f23220b09a75c6db730f13bb37c4f8144b4382) +- Bump actions-rust-lang/setup-rust-toolchain [#328](https://github.com/acgetchell/delaunay/pull/328) + [`b8222f5`](https://github.com/acgetchell/delaunay/commit/b8222f505e7b7980f228d3f75eed3ffcabb43c0e) + + Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.4 to 1.16.0. + + - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) + - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) + - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/150fca883cd4034361b621bd4e6a9d34e5143606...2b1f5e9b395427c92ee4e3331786ca3c37afe2d7) +- Bump astral-sh/setup-uv from 8.0.0 to 8.1.0 [#325](https://github.com/acgetchell/delaunay/pull/325) + [`dc6b5eb`](https://github.com/acgetchell/delaunay/commit/dc6b5ebbfdf4340ad76c96178024c7e076f1ae8d) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/cec208311dfd045dd5311c1add060b2062131d57...08807647e7069bb48b6ef5acd8ec9567f424441b) +- Bump taiki-e/install-action from 2.75.9 to 2.75.18 [#326](https://github.com/acgetchell/delaunay/pull/326) + [`f14b760`](https://github.com/acgetchell/delaunay/commit/f14b7607b76a7914c31556295005c7b7559932f4) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.9 to 2.75.18. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/d0f23220b09a75c6db730f13bb37c4f8144b4382...055f5df8c3f65ea01cd41e9dc855becd88953486) +- Bump actions/setup-node from 6.3.0 to 6.4.0 [#327](https://github.com/acgetchell/delaunay/pull/327) + [`7de0dc1`](https://github.com/acgetchell/delaunay/commit/7de0dc18fddf65d00fa218361e01d727a71aeefa) + + Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.3.0 to 6.4.0. + + - [Release notes](https://github.com/actions/setup-node/releases) + - [Commits](https://github.com/actions/setup-node/compare/53b83947a5a98c8d113130e565377fae1a50d02f...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e) +- Adopt Rust 1.95.0 MSRV [#330](https://github.com/acgetchell/delaunay/pull/330) + [`d0c53d9`](https://github.com/acgetchell/delaunay/commit/d0c53d95e748bac33e079a4256222b7bff7fad53) + + Bump MSRV from 1.94 to 1.95 and adopt stabilized features where + they fit. Coordinates with la-stack 0.4.0 -> 0.4.1, which also + requires 1.95. + + Toolchain and docs: + + - Cargo.toml (rust-version), rust-toolchain.toml (channel) and + clippy.toml (msrv) all set to 1.95. + - AGENTS.md and CONTRIBUTING.md MSRV references refreshed; + AGENTS.md Design Principles section expanded. + - CITATION.cff caught up to 0.7.5. + - la-stack bumped 0.4.0 -> 0.4.1 in Cargo.toml / Cargo.lock. +- Switch coverage reporting to cargo-llvm-cov [#345](https://github.com/acgetchell/delaunay/pull/345) + [`b5fb221`](https://github.com/acgetchell/delaunay/commit/b5fb22134a07b28b40b45ef8484a4f0c79e4d61e) + + - Replace tarpaulin coverage commands with cargo-llvm-cov for local HTML and CI Cobertura reports. + - Update Codecov workflow setup, caching, validation, and coverage documentation for the new toolchain. + - Add GitHub issue templates and clarify private vulnerability reporting guidance. + - Tighten Python lint/typecheck settings and clean up benchmark/changelog utility diagnostics. + - Add changelog post-processing coverage for version-heading reset behavior. + +## [0.7.5] - 2026-04-10 + +### ⚠️ Breaking Changes + +- Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) + +### Merged Pull Requests + +- V0.7.5 cleanup — impl-block split, builder decomposition, p… [#311](https://github.com/acgetchell/delaunay/pull/311) +- Add diagnostic infrastructure for v0.7.6 investigation (#306, #… [#309](https://github.com/acgetchell/delaunay/pull/309) +- Bump taiki-e/install-action from 2.70.2 to 2.73.0 [#308](https://github.com/acgetchell/delaunay/pull/308) +- Add MVP delaunayize-by-flips workflow [#227](https://github.com/acgetchell/delaunay/pull/227) [#303](https://github.com/acgetchell/delaunay/pull/303) +- Add explicit construction from vertices and cells [#293](https://github.com/acgetchell/delaunay/pull/293) + [#301](https://github.com/acgetchell/delaunay/pull/301) +- Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) +- Bump pygments from 2.19.2 to 2.20.0 [#298](https://github.com/acgetchell/delaunay/pull/298) +- Bump astral-sh/setup-uv from 7.6.0 to 8.0.0 [#297](https://github.com/acgetchell/delaunay/pull/297) +- Bump taiki-e/install-action from 2.69.6 to 2.70.2 [#296](https://github.com/acgetchell/delaunay/pull/296) +- Bump codecov/codecov-action from 5.5.3 to 6.0.0 [#295](https://github.com/acgetchell/delaunay/pull/295) +- Bump the dependencies group with 3 updates [#294](https://github.com/acgetchell/delaunay/pull/294) + +### Added + +- Add explicit construction from vertices and cells [#293](https://github.com/acgetchell/delaunay/pull/293) + [#301](https://github.com/acgetchell/delaunay/pull/301) [`458ebae`](https://github.com/acgetchell/delaunay/commit/458ebae0fbbd6c5142f88d24c4ff254f058f9285) + + - Introduce `DelaunayTriangulationBuilder::from_vertices_and_cells` for + combinatorial construction bypassing Delaunay insertion + - Add `build_explicit` path that constructs a TDS directly from given + vertices and cell index lists, with adjacency and orientation repair + - Define `ExplicitConstructionError` enum with `IndexOutOfBounds`, + `InvalidCellArity`, `DuplicateVertexInCell`, `EmptyCells`, and + `IncompatibleTopology` variants + - Wire `ExplicitConstruction` variant into + `DelaunayTriangulationConstructionError` + - Expose `assign_neighbors` as `pub(crate)` in the TDS + - Add comprehensive integration tests for explicit construction across + 2D/3D, round-trip fidelity, error cases, and topology guarantees + +#### Changed: Refine explicit construction validation and error reporting + + Update the triangulation builder to return specific ValidationFailed + errors when structural invariants are violated. Refine the Delaunay + property check in the validation suite to use flip-based verification + for more precise error reporting. Expand the test suite to cover 3D + round-trip fidelity, non-manifold topology errors, and vertex data + consistency during explicit construction. + +- Add MVP delaunayize-by-flips workflow [#227](https://github.com/acgetchell/delaunay/pull/227) [#303](https://github.com/acgetchell/delaunay/pull/303) + [`0370070`](https://github.com/acgetchell/delaunay/commit/037007076e20728f0b23e528c89c783a1f5d2a70) + + Add a public `delaunayize_by_flips` entrypoint that performs bounded + deterministic topology repair followed by flip-based Delaunay repair, + with an optional fallback rebuild from the vertex set. + + New files: + + - src/core/algorithms/pl_manifold_repair.rs: pub(crate) bounded + facet over-sharing repair (iterative worst-quality cell removal) + - src/triangulation/delaunayize.rs: public API with DelaunayizeConfig, + DelaunayizeOutcome, DelaunayizeError, and delaunayize_by_flips() + - tests/delaunayize_workflow.rs: 13 integration tests covering + success paths, fallback behavior, determinism, error variants, + and flip-then-repair round-trip + + Other changes: + - Box DelaunayRepairDiagnostics in NonConvergent variant to keep + DelaunayRepairError small (eliminates downstream boxing) + - Wire modules in src/lib.rs with self-contained prelude at + prelude::triangulation::delaunayize + - Re-export PlManifoldRepairStats, PlManifoldRepairError, and + DelaunayRepairStats from the delaunayize module + - Update docs/api_design.md and docs/code_organization.md + +#### Changed: Allow manifold repair to proceed on over-shared facets + + Refactor `repair_facet_oversharing` to use partial structural pre-checks + rather than full validation, as the latter rejects over-shared facets + before repair can occur. Expand test coverage for budget exhaustion, + cell removal logic, and repair determinism. + +- Add diagnostic infrastructure for v0.7.6 investigation (#306, #… [#309](https://github.com/acgetchell/delaunay/pull/309) + [`b25dff3`](https://github.com/acgetchell/delaunay/commit/b25dff390f27bc8b34ec99fa0c45a6163b6fd723) + +#### Added: Add diagnostic infrastructure for v0.7.6 investigation (#306, #307) + +- Enhance conflict-region verifier with neighbor-reachability analysis +- Add BFS boundary logging to find_conflict_region +- Add orientation tracing and post-insertion audit (DELAUNAY_DEBUG_ORIENTATION) +- Add cell creation provenance logging to fill_cavity +- Re-export diagnostic types (DelaunayRepairDiagnostics, etc.) in prelude +- Create comprehensive debug env var reference (docs/dev/debug_env_vars.md) + +### Changed + +- [**breaking**] Change remove_vertex to accept VertexKey instead of &Vertex [#300](https://github.com/acgetchell/delaunay/pull/300) + [`71cca10`](https://github.com/acgetchell/delaunay/commit/71cca109607c66fb8af62b3e427078458bcef66d) + + - More ergonomic: callers pass a key directly instead of looking up and + borrowing the full Vertex struct + - More efficient: O(1) key dereference replaces UUID-based lookup + - Consistent with set_vertex_data, set_cell_data, and the Edit API which + all use keys + - Aligned with the stated API design in docs/api_design.md + - Simplifies internal callers in flips.rs (remove get+copy+remove + pattern) and builder.rs (eliminate intermediate vertex copies) + - Add stale-key idempotency test for the new VertexKey API +- V0.7.5 cleanup — impl-block split, builder decomposition, p… [#311](https://github.com/acgetchell/delaunay/pull/311) + [`5bf5c81`](https://github.com/acgetchell/delaunay/commit/5bf5c8192b378d320d35f0a074a57f5b7e8170ff) + +#### Changed: V0.7.5 cleanup — impl-block split, builder decomposition, prelude guidance, re-enable 3D proptests + +- Split monolithic DelaunayTriangulation impl block into 6 trait-minimal + blocks per #302 (ScalarAccumulative only where needed) +- Decompose search_closed_2d_selection: extract ClosedSelectionDfs struct + and sort_candidates_by_rarity_and_domain helper, remove clippy suppressions +- Add "Which import do I need?" prelude guidance table to lib.rs +- Re-enable 43 previously-ignored 3D proptests (all <1s in release mode) +- Audit doctests for builder migration (no changes needed; deferred to #214) +- Update internal performance results for v0.7.5 [`76b2ff7`](https://github.com/acgetchell/delaunay/commit/76b2ff7c4409a8bfa8aa6b9f5362a3dfb8b67999) + + Refresh the performance documentation with updated benchmark metrics, + timestamps, and commit references to align with the v0.7.5 release. + +### Documentation + +- Update KNOWN_ISSUES_4D.md with #204 debug run findings [`87d3054`](https://github.com/acgetchell/delaunay/commit/87d3054a3d722029aeedf881f00caeec1bd7e639) + + - 3D: minimal failing prefix is 35 vertices (previously ~130+) + - 3D: flip cycles confirmed NOT predicate-related (ambiguous=0) + - 4D: negative-orientation cell causes 88% vertex skip rate + - Add release-mode reproduction commands + - Update recommendations section + - Filed follow-up issues #306 and #307 + +### Maintenance + +- Bump pygments from 2.19.2 to 2.20.0 [#298](https://github.com/acgetchell/delaunay/pull/298) + [`6228a59`](https://github.com/acgetchell/delaunay/commit/6228a5990cfe38e711cafd2ce851bc3c9494ddc3) + + Bumps [pygments](https://github.com/pygments/pygments) from 2.19.2 to 2.20.0. + + - [Release notes](https://github.com/pygments/pygments/releases) + - [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES) + - [Commits](https://github.com/pygments/pygments/compare/2.19.2...2.20.0) +- Bump the dependencies group with 3 updates [#294](https://github.com/acgetchell/delaunay/pull/294) + [`4b3ccb3`](https://github.com/acgetchell/delaunay/commit/4b3ccb3da6827bd63b3c76219ea32a1cb5029b64) + + Bumps the dependencies group with 3 updates: [rustc-hash](https://github.com/rust-lang/rustc-hash), + [ordered-float](https://github.com/reem/rust-ordered-float) and [uuid](https://github.com/uuid-rs/uuid). + + Updates `rustc-hash` from 2.1.1 to 2.1.2 + + - [Changelog](https://github.com/rust-lang/rustc-hash/blob/master/CHANGELOG.md) + - [Commits](https://github.com/rust-lang/rustc-hash/compare/v2.1.1...v2.1.2) + + Updates `ordered-float` from 5.2.0 to 5.3.0 + - [Release notes](https://github.com/reem/rust-ordered-float/releases) + - [Commits](https://github.com/reem/rust-ordered-float/compare/v5.2.0...v5.3.0) + + Updates `uuid` from 1.22.0 to 1.23.0 + - [Release notes](https://github.com/uuid-rs/uuid/releases) + - [Commits](https://github.com/uuid-rs/uuid/compare/v1.22.0...v1.23.0) +- Bump codecov/codecov-action from 5.5.3 to 6.0.0 [#295](https://github.com/acgetchell/delaunay/pull/295) + [`420a1c5`](https://github.com/acgetchell/delaunay/commit/420a1c50a8e34b6b02ba4b64e460a6d9c6ae30c5) + + Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.3 to 6.0.0. + + - [Release notes](https://github.com/codecov/codecov-action/releases) + - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/codecov/codecov-action/compare/1af58845a975a7985b0beb0cbe6fbbb71a41dbad...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2) +- Bump astral-sh/setup-uv from 7.6.0 to 8.0.0 [#297](https://github.com/acgetchell/delaunay/pull/297) + [`0a0c539`](https://github.com/acgetchell/delaunay/commit/0a0c539c743afc5919b3ab6af55f4cec5d780280) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.6.0 to 8.0.0. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/37802adc94f370d6bfd71619e3f0bf239e1f3b78...cec208311dfd045dd5311c1add060b2062131d57) +- Bump taiki-e/install-action from 2.69.6 to 2.70.2 [#296](https://github.com/acgetchell/delaunay/pull/296) + [`0ab08a7`](https://github.com/acgetchell/delaunay/commit/0ab08a76c46117e633741653bf3e0ab6449671f6) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.69.6 to 2.70.2. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/06203676c62f0d3c765be3f2fcfbebbcb02d09f5...e9e8e031bcd90cdbe8ac6bb1d376f8596e587fbf) +- Bump taiki-e/install-action from 2.70.2 to 2.73.0 [#308](https://github.com/acgetchell/delaunay/pull/308) + [`839877f`](https://github.com/acgetchell/delaunay/commit/839877f6db184e766fc9f4e3515b5fee3e70918f) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.70.2 to 2.73.0. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/e9e8e031bcd90cdbe8ac6bb1d376f8596e587fbf...7a562dfa955aa2e4d5b0fd6ebd57ff9715c07b0b) + +## [0.7.4] - 2026-03-27 + +### ⚠️ Breaking Changes + +- Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) +- Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) + [#290](https://github.com/acgetchell/delaunay/pull/290) + +### Merged Pull Requests + +- Release v0.7.4 [#291](https://github.com/acgetchell/delaunay/pull/291) +- Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) + [#290](https://github.com/acgetchell/delaunay/pull/290) +- Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) +- Add set_vertex_data and set_cell_data methods [#284](https://github.com/acgetchell/delaunay/pull/284) [#285](https://github.com/acgetchell/delaunay/pull/285) + +### Added + +- Add set_vertex_data and set_cell_data methods [#284](https://github.com/acgetchell/delaunay/pull/284) [#285](https://github.com/acgetchell/delaunay/pull/285) + [`b398d54`](https://github.com/acgetchell/delaunay/commit/b398d5467114610053902a141980f3583eb71aec) + + - Add `set_vertex_data` and `set_cell_data` to `Tds` for O(1) mutation + of auxiliary vertex/cell data without affecting geometry or topology + - Add convenience wrappers on `Triangulation` and `DelaunayTriangulation` + that delegate to the TDS methods without invalidating caches + - All doctests use `prelude::triangulation::*` to demonstrate idiomatic + imports including `DelaunayTriangulationBuilder::from_vertices` + - 9 unit tests covering replacement, no-data vertices, invalid keys, + invariant preservation, multi-key mutation, and locate-hint stability + - Add `set_vertex_data` and `set_cell_data` to `Tds` accepting + `Option<U>` / `Option<V>` for setting or clearing auxiliary data + in O(1) without affecting geometry or topology + - Add convenience wrappers on `Triangulation` and `DelaunayTriangulation` + that delegate to the TDS methods without invalidating caches + - All doctests use `prelude::triangulation::*` and demonstrate both + setting and clearing data paths + - 11 unit tests covering Tds basics, Triangulation wrappers, invariant + preservation, multi-key mutation, clearing, and locate-hint stability + +### Changed + +- [**breaking**] Tighten Vertex::data and Cell::data to pub(crate) [#289](https://github.com/acgetchell/delaunay/pull/289) + [`07f1565`](https://github.com/acgetchell/delaunay/commit/07f15658aac65e5cce3ecb3b7172502305173b95) + + - Change `Vertex::data` and `Cell::data` from `pub` to `pub(crate)` + - Add `const fn data() -> Option<&U>` accessor on `Vertex` and + `const fn data() -> Option<&V>` accessor on `Cell` + - Update struct-level doc comments with `data()` / `set_vertex_data` + / `set_cell_data` cross-references + - Update all external-facing doctests and integration tests to use + the new accessor +- [**breaking**] Generalize DelaunayTriangulationBuilder::new() over U [#287](https://github.com/acgetchell/delaunay/pull/287) + [#290](https://github.com/acgetchell/delaunay/pull/290) [`7694a3e`](https://github.com/acgetchell/delaunay/commit/7694a3effba4eefb53238d15323e76452eec56ea) + + - Move `new()` from the `<f64, (), D>` impl to `<f64, U, D>` so it + accepts any vertex data type — U is inferred from the vertex slice + - Deprecate `from_vertices()` (now redundant for f64 vertices) + - Migrate all `from_vertices` call sites to `new` + - Fix type-inference regression in NaN test by annotating VertexBuilder +- Release v0.7.4 [#291](https://github.com/acgetchell/delaunay/pull/291) + [`bee1b04`](https://github.com/acgetchell/delaunay/commit/bee1b0409f19631775cbe5bfd1b0618e54380c46) + + - chose(release): release v0.7.4 + - Bump version to v0.7.4 + - Update changelog with latest changes + - Update documentation for release + - Add performance results for v0.7.4 + +#### Changed: Clarify adaptive_tolerance_insphere delegation in 4D docs + + Update the documentation for provable error bounds to clarify that the + `adaptive_tolerance_insphere` wrapper function remains available but now + delegates entirely to the provable `insphere_from_matrix` path. + +### Fixed + +- Fix keyword validation and add publish-check recipe [`676df6b`](https://github.com/acgetchell/delaunay/commit/676df6b36d1ba78a17388baea685f0b4b082a844) + + - Replace `computational-geometry` keyword with `geometry` (crates.io + enforces a 20-character limit) + - Add `just publish-check` recipe that validates crates.io metadata + (keywords, categories, description) and runs `cargo publish --dry-run` + - Add publish-check to RELEASING.md Step 1.3 so metadata issues are + caught in the release PR, not at publish time + - Remove redundant dry-run from RELEASING.md Step 2.7 + +## [0.7.3] - 2026-03-24 + +### ⚠️ Breaking Changes + +- Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) + [#251](https://github.com/acgetchell/delaunay/pull/251) +- Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) + [#255](https://github.com/acgetchell/delaunay/pull/255) +- Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) +- Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) + [#277](https://github.com/acgetchell/delaunay/pull/277) +- Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) + [#260](https://github.com/acgetchell/delaunay/pull/260) +- Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) [#265](https://github.com/acgetchell/delaunay/pull/265) +- Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) + +### Merged Pull Requests + +- Simplify trait bounds and re-export secondary maps [#282](https://github.com/acgetchell/delaunay/pull/282) +- Bump codecov/codecov-action from 5.5.2 to 5.5.3 [#280](https://github.com/acgetchell/delaunay/pull/280) +- Bump taiki-e/install-action from 2.68.34 to 2.69.6 [#279](https://github.com/acgetchell/delaunay/pull/279) +- Bump arc-swap from 1.8.2 to 1.9.0 in the dependencies group [#278](https://github.com/acgetchell/delaunay/pull/278) +- Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) + [#277](https://github.com/acgetchell/delaunay/pull/277) +- Add progressive scale-invariant perturbation [#209](https://github.com/acgetchell/delaunay/pull/209) [#274](https://github.com/acgetchell/delaunay/pull/274) +- Add ExactPredicates marker trait for flip repair type safety (#… [#273](https://github.com/acgetchell/delaunay/pull/273) +- Identity-based SoS perturbation via canonical vertex ordering (… [#272](https://github.com/acgetchell/delaunay/pull/272) +- Bump astral-sh/setup-uv from 7.3.1 to 7.5.0 [#271](https://github.com/acgetchell/delaunay/pull/271) +- Bump actions-rust-lang/setup-rust-toolchain [#270](https://github.com/acgetchell/delaunay/pull/270) +- Bump taiki-e/install-action from 2.68.25 to 2.68.33 [#269](https://github.com/acgetchell/delaunay/pull/269) +- Bump tracing-subscriber in the dependencies group [#268](https://github.com/acgetchell/delaunay/pull/268) +- Bump actions/download-artifact from 8.0.0 to 8.0.1 [#267](https://github.com/acgetchell/delaunay/pull/267) +- Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) [#265](https://github.com/acgetchell/delaunay/pull/265) +- Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) +- Canonicalize positive orientation after bulk construction repair… [#261](https://github.com/acgetchell/delaunay/pull/261) +- Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) + [#260](https://github.com/acgetchell/delaunay/pull/260) +- Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) + [#255](https://github.com/acgetchell/delaunay/pull/255) +- Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) + [#251](https://github.com/acgetchell/delaunay/pull/251) +- Replace panicking calls with error propagation [#242](https://github.com/acgetchell/delaunay/pull/242) [#250](https://github.com/acgetchell/delaunay/pull/250) +- Replace derive_builder with hand-written VertexBuilder [#212](https://github.com/acgetchell/delaunay/pull/212) + [#249](https://github.com/acgetchell/delaunay/pull/249) +- Archive completed changelog minor series into per-minor files [#248](https://github.com/acgetchell/delaunay/pull/248) +- Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) + +### Added + +- Archive completed changelog minor series into per-minor files [#248](https://github.com/acgetchell/delaunay/pull/248) + [`45e4781`](https://github.com/acgetchell/delaunay/commit/45e47818b93b87aa2c0970d3bf7da0159d299cf1) + + Add archive_changelog.py to split CHANGELOG.md by minor series: + + - Parse version blocks, group by X.Y minor key, write completed + minors to docs/archive/changelog/X.Y.md (0.2–0.6) + - Extract and distribute git-cliff reference-style link definitions + so each output file contains only its own version defs (fixes MD053) + - Keep Unreleased + active minor (0.7) in root CHANGELOG.md with an + Archives link section; root shrinks from ~4,000 to ~1,400 lines + - Pipeline is idempotent: repeated runs produce no diff + + Update tag_release.py to fall back to archive files when a requested + version is no longer in the root changelog (extract_changelog_section + and _github_anchor both search docs/archive/changelog/X.Y.md). + + Register archive-changelog CLI entry point in pyproject.toml and wire + it into the justfile changelog recipe after postprocess-changelog. + + Add 24 tests covering parsing, grouping, link-def distribution, + archive writing, idempotency, and tag_release archive fallback. + + Other changes: + - Sort justfile recipes in lexicographic order + - Update docs/code_organization.md tree (new files, fix NBSP encoding) + - Update AGENTS.md, README.md, RELEASING.md with archive references + - Exclude docs/archive/changelog/** from typos checks +- [**breaking**] Add SoS module for deterministic degeneracy resolution [#233](https://github.com/acgetchell/delaunay/pull/233) + [#251](https://github.com/acgetchell/delaunay/pull/251) [`6ed6f88`](https://github.com/acgetchell/delaunay/commit/6ed6f889b6bd2df7d263d4aae108823ebb71b608) + + - New `src/geometry/sos.rs` with dimension-generic SoS tie-breaking + - `sos_orientation_sign<D>()` for degenerate orientation predicates + - `sos_insphere_sign<D>()` for co-spherical insphere predicates + - Two-stage exact det sign: `det_errbound()` fast filter + Bareiss exact + - 18 unit tests covering 2D–5D degenerate configurations + - No coordinate modification — purely a decision rule + + Part of AdaptiveKernel implementation (B2 of #233). +- [**breaking**] Remove use_robust_on_ambiguous override from flip repair [#228](https://github.com/acgetchell/delaunay/pull/228) + [#255](https://github.com/acgetchell/delaunay/pull/255) [`faf84de`](https://github.com/acgetchell/delaunay/commit/faf84ded97e8343fd36292d38b051be9df39c353) + + Remove the `use_robust_on_ambiguous` flag and `robust_insphere_sign()` + fallback from flip repair. With AdaptiveKernel providing exact+SoS + predicates, the old tolerance-based override was the root cause of + flip-repair non-convergence. + + - Remove override blocks in k2/k3 violation functions + - Remove `both_positive_artifact` workaround + - Simplify repair attempts from 3 to 2 (FIFO then LIFO) + - Remove `used_robust_predicates` from `DelaunayRepairDiagnostics` + - Fix pre-existing clippy `match_same_arms` in matrix.rs/measures.rs +- [**breaking**] Apply SoS to AdaptiveKernel::orientation() and tolerate degener… [#264](https://github.com/acgetchell/delaunay/pull/264) + [`526b39e`](https://github.com/acgetchell/delaunay/commit/526b39e4c1f634208db9014793806e2e94f9c0ed) + +#### Added: Apply SoS to AdaptiveKernel::orientation() and tolerate degenerate cells [#263](https://github.com/acgetchell/delaunay/pull/263) + +- Apply Simulation of Simplicity to AdaptiveKernel::orientation() so + degenerate ties are broken deterministically (returns ±1 for all + distinct-point inputs, 0 only for identical f64 points) +- Tolerate degenerate cells (zero exact determinant) in orientation + normalization after flip-based Delaunay repair: + + - promote_cells_to_positive_orientation: skip instead of error + - cells_require_positive_orientation_promotion: skip instead of error + - canonicalize_global_orientation_sign: scan past degenerate cells + - validate_geometric_cell_orientation: only flag negative orientation +- Add Hilbert-sort preprocessing dedup (Phase 4 in order_vertices_hilbert) + that removes vertices mapping to the same quantized grid cell +- Add per-cell coordinate uniqueness validation (DuplicateCoordinatesInCell + variant, CellCoordinateUniqueness invariant kind) +- Document three-layer duplicate vertex handling strategy in + docs/numerical_robustness_guide.md +- Update convex_hull and quality tests to accept InsufficientVertices + alongside GeometricDegeneracy for extreme-scale dedup inputs +- Add macro-generated dedup integration tests covering 2D–5D + +#### Added: Normalize SoS orientation callers and harden Hilbert dedup [#263](https://github.com/acgetchell/delaunay/pull/263) + +- Refactor evaluate_cell_orientation_for_context to use robust_orientation + as the sole oracle, removing the duplicate kernel call +- Add robust_orientation guard in apply_bistellar_flip_with_k to reject + degenerate cells before kernel invocation (fixes 4D perf regression) +- Switch find_boundary_edge_split_facet to robust_orientation for true + collinearity/degeneracy detection instead of kernel SoS +- Use robust_orientation sign directly in build_initial_simplex, removing + unused kernel variable and redundant orientation call +- Extract hilbert_dedup_sorted from order_vertices_hilbert so the + ordering function is pure; apply dedup in + preprocess_vertices_for_construction after Hilbert sort regardless of + DedupPolicy (safety-critical for SoS identical-point failures) +- Add validate_cell_coordinate_uniqueness to validation_report with + CoordinateScalar bound +- Fix quantization bits table in numerical_robustness_guide.md (2D/3D + capped at 31 bits, not 64/42) +- Update rustdoc for cells_require_positive_orientation_promotion to + reflect skip-degenerate semantics +- Trim inaccurate near-duplicate claim from dedup_batch_construction docs +- Add SoS identical-points regression tests (2D–5D) verifying + AdaptiveKernel returns 0 when all cofactors vanish +- Add standalone hilbert_dedup_sorted edge-case tests + +#### Changed: Address review comments for SoS orientation normalization [#263](https://github.com/acgetchell/delaunay/pull/263) + +- Propagate `robust_orientation` errors in `apply_bistellar_flip_with_k` + instead of silently ignoring `Err` via `matches!` +- Switch `k2_flip_would_create_degenerate_cell` from kernel orientation + to `robust_orientation` so degenerate cells are detected under SoS; + remove unused `kernel` parameter +- Delegate `AdaptiveKernel::orientation()` to `robust_orientation` for + layers 1+2, eliminating duplicated matrix build + exact_det_sign logic +- Remove unused `kernel` parameter from `find_boundary_edge_split_facet` + and update call site in `extend_hull` +- Update stale rustdoc: `validate_geometric_cell_orientation` and + `build_initial_simplex` now reference `robust_orientation` instead of + kernel predicates / `K::default()` +- Add `vkeys[i] == vkeys[j]` guard in `validate_cell_coordinate_uniqueness` + to avoid misleading error when vertex keys are duplicated +- Replace broad `assert!(result.is_err())` in all-duplicates test with + precise `InsufficientVertices` match +- Decouple many-duplicates test from magic `$dim + 2` by using the + helper's returned distinct count +- Update docs: numerical_robustness_guide, KNOWN_ISSUES_4D, + ORIENTATION_SPEC, validation.md + +#### Changed: Remove unused kernel parameter from flip-application functions [#263](https://github.com/acgetchell/delaunay/pull/263) + +- Replace `K: Kernel<D>` with `T: CoordinateScalar` in 7 functions: + apply_bistellar_flip_with_k, apply_bistellar_flip, + apply_bistellar_flip_dynamic, apply_bistellar_flip_k2/k3/k1, + apply_bistellar_flip_k1_inverse +- Update ~40 call sites across flips.rs, triangulation/flips.rs, + delaunay_triangulation.rs +- Delete ZeroOrientationKernel2d test struct (now redundant) +- Update ORIENTATION_SPEC.md flip pseudocode to match new signatures +- Address review round 3 comments: guard coordinate uniqueness + validation, add #[non_exhaustive] to InvariantKind, extract + generic flip_would_create_degenerate_cell, add nitpick tests + +#### Fixed: Remove Morton and Lexicographic ordering, unconditional Hilbert dedup, strengthen flip assertions + +[#263](https://github.com/acgetchell/delaunay/pull/263) + +- Strengthen assert_context_has_nonzero_robust_orientation to explicitly + fail on Err variants instead of only checking for DEGENERATE +- Merge hilbert_dedup_sorted into order_vertices_hilbert via + dedup_quantized parameter, eliminating redundant re-quantization +- Make Hilbert quantized dedup unconditional (not gated on DedupPolicy) +- Update DedupPolicy docs to frame as performance-tuning knob +- Remove InsertionOrderStrategy::Morton variant and all supporting code + (~100 lines: morton_bits_per_coord, morton_code, order_vertices_morton) +- Remove InsertionOrderStrategy::Lexicographic variant and associated + tests; keep internal order_vertices_lexicographic as Hilbert fallback +- Remove Morton/Lexicographic doc references from README, invariants.md, + numerical_robustness_guide.md, and triangulation_generation.rs +- Identity-based SoS perturbation via canonical vertex ordering (… [#272](https://github.com/acgetchell/delaunay/pull/272) + [`a125d98`](https://github.com/acgetchell/delaunay/commit/a125d988566bb7196c025212833f3e539665e7de) + +#### Added: Identity-based SoS perturbation via canonical vertex ordering [#266](https://github.com/acgetchell/delaunay/pull/266) + +- Add canonical_points module with sorted_cell_points and + sorted_facet_points_with_extra helpers that sort vertices by + VertexKey identity before resolving to points +- Update all 5 kernel call sites (locate, flips, triangulation) to + use canonical ordering for consistent SoS tie-breaking +- Fix misleading error variant in find_conflict_region BFS traversal + (InvalidStartCell → CellDataAccessFailed) +- Add 6 unit tests including 2D/3D permutation-invariance tests + +#### Added: Identity-based SoS perturbation via canonical vertex ordering [#266](https://github.com/acgetchell/delaunay/pull/266) + +- Add canonical_points module with sorted_cell_points and + sorted_facet_points_with_extra helpers that sort vertices by + VertexKey identity before resolving to points +- Update all 5 kernel call sites (locate, flips, triangulation) to + use canonical ordering for consistent SoS tie-breaking +- Fix misleading error variant in find_conflict_region BFS traversal + (InvalidStartCell → CellDataAccessFailed) +- Document canonical ordering convention in numerical_robustness_guide +- Add canonical_points.rs to code_organization.md util listing +- Add 14 new tests: permutation invariance (2D all 6, 3D all 24), + canonical ordering helpers, and error-path coverage for + is_point_outside_facet and find_conflict_region + +#### Changed: Reuse canonical cell ordering for query simplex construction + + Optimize the construction of the query simplex by reusing the + canonical vertex ordering of the cell. This ensures consistent + identity-based SoS perturbation and includes a safety check to + prevent out-of-range facet index access. + +- Add ExactPredicates marker trait for flip repair type safety (#… [#273](https://github.com/acgetchell/delaunay/pull/273) + [`4877151`](https://github.com/acgetchell/delaunay/commit/48771518b2b5a8a6dd9b4036b0903f7c3158b7c9) + +#### Added: Add ExactPredicates marker trait for flip repair type safety [#257](https://github.com/acgetchell/delaunay/pull/257) + +- Define `ExactPredicates` marker trait in `kernel.rs`, implemented for + `AdaptiveKernel` and `RobustKernel` but not `FastKernel` +- Add `K: ExactPredicates` bound to flip repair entry points in + `flips.rs` and propagate through `delaunay_triangulation.rs`, + `builder.rs`, and `triangulation_generation.rs` +- Add `compile_fail` doctest asserting `FastKernel` cannot satisfy the + bound, plus positive compile-time assertion tests for the other kernels +- Update test code to use `AdaptiveKernel` where `DelaunayTriangulation` + construction or flip repair is invoked +- Document the trait and its design rationale in + `numerical_robustness_guide.md` + +#### Changed: Narrow ExactPredicates bound to public repair methods only [#257](https://github.com/acgetchell/delaunay/pull/257) + +- Remove K: ExactPredicates from ~20 internal, construction, insertion, + and removal methods so FastKernel remains usable for all operations + except explicit Delaunay repair +- Retain ExactPredicates bound on repair_delaunay_with_flips, + repair_delaunay_with_flips_advanced, and rebuild_with_heuristic +- Replace run_flip_repair_fallbacks with inline robust-only fallback in + maybe_repair_after_insertion; remove dead code (run_flip_repair_fallbacks, + remap_vertex_key_by_uuid, HeuristicRebuildRecursionGuard::in_progress) +- Update with_kernel / build_with_kernel docs to note FastKernel is + accepted but exact kernels are recommended +- Restructure heuristic rebuild test to test_vertex_key_valid_after_explicit_heuristic_rebuild; + remove test_run_flip_repair_fallbacks_smoke_ok_with_local_seed + +#### Fixed: Preserve full fallback-chain context in advanced repair errors [#257](https://github.com/acgetchell/delaunay/pull/257) + +- Restore test_with_kernel_fast_kernel to use FastKernel (regressed when + ExactPredicates bound was added, now possible again after narrowing) +- Restructure repair_delaunay_with_flips_advanced fallback: when primary, + robust, and heuristic rebuild all fail, the HeuristicRebuildFailed error + now includes context from all three stages instead of losing the robust + fallback error +- Add test_advanced_repair_fallback_error_preserves_full_chain_context + asserting the composed error message includes primary, robust, and + heuristic failure details + +#### Changed: Remove redundant ScalarSummable where clauses [#257](https://github.com/acgetchell/delaunay/pull/257) + +- Remove 26 redundant `K::Scalar: ScalarSummable` where clauses from + `delaunay_triangulation.rs`; the impl block already bounds + `K::Scalar: ScalarAccumulative` which implies `ScalarSummable` via + blanket impl +- Remove unused `ScalarSummable` import +- Export `ExactPredicates` from `prelude::query` +- Update docs (numerical_robustness_guide, validation, workflows, + api_design) to reflect the narrowed `ExactPredicates` bound on + public repair methods and add `FastKernel` + `EveryN` guidance +- Add tests for non-retryable error pass-through in + `repair_delaunay_with_flips` and `repair_delaunay_with_flips_advanced` + +#### Added: Add test injection for robust-fallback coverage [#257](https://github.com/acgetchell/delaunay/pull/257) + +- Add FORCE_REPAIR_NONCONVERGENT thread-local and test guard +- Inject synthetic NonConvergent errors in repair_delaunay_with_flips + and maybe_repair_after_insertion to exercise robust-fallback paths +- Add tests for advanced robust fallback and insertion robust fallback +- Move test-only helpers into mod tests with pub(super) visibility +- Add progressive scale-invariant perturbation [#209](https://github.com/acgetchell/delaunay/pull/209) [#274](https://github.com/acgetchell/delaunay/pull/274) + [`4c35028`](https://github.com/acgetchell/delaunay/commit/4c35028537b9011d586be3b9b234925e3ca5bb5a) + + - Replace hardcoded perturbation retry count with + DEFAULT_PERTURBATION_RETRIES = 3 (4 total attempts) + - Apply 10^(attempt-1) progressive scaling factor per retry, + spanning 4 orders of magnitude (e.g. 1e-8 → 1e-5 for f64) + - Update debug messages with computed max perturbation values + - Update numerical robustness guide documentation + - Add tests for scale invariance, f32 base epsilon, and constant value + - Remove 32 redundant `where K::Scalar: CoordinateScalar` clauses + (implied by impl-level bounds) + +#### Fixed: Correct perturbation exponent off-by-one and improve test coverage [#209](https://github.com/acgetchell/delaunay/pull/209) + +- Fix progressive scale factor: use 10^attempt instead of 10^(attempt-1) + so the retry ladder reaches 1e-5 × local_scale (was capped at 1e-6), + matching the documented "4 orders of magnitude" range +- Apply the same correction to the debug-message exponent computation +- Update perturbation ladder in numerical_robustness_guide.md to reflect + the corrected values (1e-7, 1e-6, 1e-5) +- Replace test_perturbation_f32_base_epsilon with + test_perturbation_epsilon_selection_and_retry: asserts mantissa_digits + for both f32 and f64, exercises insert_transactional with on-edge + near-degenerate points for both scalar types +- Add absolute expected counts to test_perturbation_scale_invariance_3d + to catch regressions that affect all scales equally +- Add test_perturbation_retry_and_exhaustion_4d: 4D random points + exercise the progressive retry loop body and exhaustion branch +- Add test_perturbation_retry_seeded_branch_4d: calls + insert_transactional directly with perturbation_seed != 0 to cover + the seeded sign-selection path +- [**breaking**] Improve 4D debug harness diagnostics, add capped repair and regression test [#230](https://github.com/acgetchell/delaunay/pull/230) + [#277](https://github.com/acgetchell/delaunay/pull/277) [`0684ec0`](https://github.com/acgetchell/delaunay/commit/0684ec01108cc6a816d5aa5b41179726ee7a51a5) + + Add configurable flip-budget capping, structured debug-harness outcomes, + enriched orientation diagnostics, and a seeded 4D regression test. + + Flip budget enforcement: + + - Move max_flips check before apply_bistellar_flip in all 5 repair + paths (k2, k3, dynamic, inverse) so Some(0) means truly zero flips + - Change guard from `>` to `>=` to eliminate off-by-one + - Thread max_flips_override through repair_delaunay_with_flips_k2_k3, + the robust fallback, heuristic rebuild, and per-insertion repair + + Capped repair API: + - Add max_flips: Option<usize> to DelaunayRepairHeuristicConfig + - Mark DelaunayRepairHeuristicConfig #[non_exhaustive] + - Add internal repair_delaunay_with_flips_capped() helper + - Add DELAUNAY_LARGE_DEBUG_REPAIR_MAX_FLIPS env var to debug harness + + Error taxonomy: + - Add RepairFailed variant to DelaunayTriangulationValidationError for + mutating operations (remove_vertex); fix remove_vertex to use it + instead of VerificationFailed (which is for passive validation) + + Orientation diagnostics: + - Enrich NegativeOrientation error message with vertex keys + - Add tracing::warn with cell key, UUID, vertex keys, neighbor keys, + and orientation sign for negative-orientation cells + + Debug harness: + - Return DebugOutcome enum instead of panicking (Success, + ConstructionFailure, SkippedVertices, RepairNonConvergence, + ValidationFailure) + - Print seed replay command on every abort path + - Add per-chunk insertion rate (pts/s) in progress output + - Harness tests now assert on DebugOutcome::Success + +### Changed + +- Replace panicking calls with error propagation [#242](https://github.com/acgetchell/delaunay/pull/242) [#250](https://github.com/acgetchell/delaunay/pull/250) + [`9d640c3`](https://github.com/acgetchell/delaunay/commit/9d640c378bdefd0043c28970b05b7162c47dc1bf) + + - Add `InternalInconsistency` variant to `TriangulationConstructionError` + for internal bookkeeping failures distinct from geometric degeneracy + - Replace 5 `.expect()` calls on HashMap lookups in builder.rs periodic + quotient reconstruction with `?` propagation + - Reclassify 3 additional internal operations (image vertex removal, + neighbor assignment, incident-cell rebuild) from `GeometricDegeneracy` + to `InternalInconsistency` + - Replace `.expect()` on `initial_points.take()` in + triangulation_generation.rs with error propagation + - Update doc comment from `# Panics` to `# Errors` + - Add single-quote guidance for gh --body in AGENTS.md +- [**breaking**] Remove RobustPredicateConfig and config_presets [#259](https://github.com/acgetchell/delaunay/pull/259) + [#260](https://github.com/acgetchell/delaunay/pull/260) [`6764bac`](https://github.com/acgetchell/delaunay/commit/6764bacd7a02a9e7c95c88235b68bfcbc447eae3) + + - Delete RobustPredicateConfig struct and config_presets module + - Remove config parameter from robust_insphere, robust_orientation, + adaptive_tolerance_insphere, and verify_insphere_consistency + - Simplify RobustKernel to a zero-size type (remove config field and + with_config constructor, derive Default) + - Remove config threading from flips.rs, delaunay_validation.rs, and + coordinate_conversion_errors.rs + - Delete tests that only exercised config field values + - Update numerical_robustness_guide.md: document AdaptiveKernel as the + default kernel, remove config_presets references +- [**breaking**] Rename TdsValidationError to TdsError [#262](https://github.com/acgetchell/delaunay/pull/262) + [#265](https://github.com/acgetchell/delaunay/pull/265) [`99b9810`](https://github.com/acgetchell/delaunay/commit/99b9810c7aeeb91f84efba019bb199da8ee4f87a) + + - Rename TdsValidationError -> TdsError across all source files + - Remove the type alias that bridged the old name + - Update all references in production code, tests, and examples + - Part of error hierarchy orthogonalization (Phase 5) + +#### Changed: Make TriangulationValidationError purely Level 3 [#262](https://github.com/acgetchell/delaunay/pull/262) + + Remove the Tds variant from TriangulationValidationError so it contains + only Level 3 (topology) errors. TDS-level errors now flow through + InvariantError, keeping Levels 1–2 orthogonal from Level 3. + + API changes: + +- is_valid, validate, validate_at_completion, validate_after_insertion + now return InvariantError instead of TriangulationValidationError +- validate_geometric_cell_orientation returns TdsError directly +- remove_vertex returns InvariantError +- Add Tds variant to DelaunayTriangulationValidationError +- TdsMutationError inner field made private; add as_tds_error() and + into_inner() accessors +- Remove From<TdsMutationError> for TriangulationValidationError +- Add From<ManifoldError> for InvariantError +- Simplify trait bounds and re-export secondary maps [#282](https://github.com/acgetchell/delaunay/pull/282) + [`04ea024`](https://github.com/acgetchell/delaunay/commit/04ea024f7091b7f1d9406c48d673e58a07a657d3) + + - Re-export VertexSecondaryMap and CellSecondaryMap in prelude and + prelude::collections; update doc examples to use prelude path + - Replace ~50 vestigial ScalarSummable bounds with CoordinateScalar + across geometry and core modules (Sum is never called on T) + - Remove ~34 redundant K::Scalar: CoordinateScalar where clauses + already implied by K: Kernel<D> (associated type bound) + - Remove 8 redundant [T; D]: Copy + Sized bounds already implied + by T: CoordinateScalar (Float → Copy; arrays are always Sized) + - Keep ScalarSummable trait definition and blanket impl for future use + +### Fixed + +- Canonicalize positive orientation after bulk construction repair… [#261](https://github.com/acgetchell/delaunay/pull/261) + [`dec8df9`](https://github.com/acgetchell/delaunay/commit/dec8df9f07b5e868825f31a64bee85c4a04e984d) + +#### Fixed: Canonicalize positive orientation after bulk construction repair [#258](https://github.com/acgetchell/delaunay/pull/258) + +- Call normalize_and_promote_positive_orientation() in + finalize_bulk_construction after the flip-repair block and before + topology validation, ensuring the global geometric sign is positive +- Update #228 regression test to expect PLManifold (was Pseudomanifold) + now that orientation is correctly canonicalized + +#### Changed: Categorize errors during orientation canonicalization + + Distinguish structural `InsertionError` variants as `InternalInconsistency` + to separate algorithmic bugs from input-related `GeometricDegeneracy` + during post-repair orientation canonicalization. Added topology + validation to the issue #228 regression test to ensure manifold parity. + +### Maintenance + +- [**breaking**] Replace custom changelog pipeline with git-cliff [#247](https://github.com/acgetchell/delaunay/pull/247) + [`1b2af41`](https://github.com/acgetchell/delaunay/commit/1b2af41fcb5115d82c1ae6f0ab66651c075fbd52) + + Replace ~4,000 lines of custom Python changelog generation + (changelog_utils.py, enhance_commits.py) with git-cliff and two + focused scripts (~640 lines total): + + - postprocess_changelog.py: lightweight markdown hygiene + (MD004, MD007, MD012, MD013, MD030, MD031, MD032, MD040) + plus summary section injection (Merged PRs, Breaking Changes) + - tag_release.py: extract latest version section for git tag messages + + Pipeline changes: + - cliff.toml: full git-cliff config with conventional commit parsing, + PR auto-linking, and Tera template for Keep a Changelog format + - justfile: new changelog-update, changelog-tag, changelog recipes + replacing the old generate-changelog workflow + - Idempotent output: postprocessor matches markdownlint --fix exactly, + so `just changelog-update && just fix` produces zero diff + + Tooling simplification: + - Remove mypy in favor of ty (Astral) — mypy's permissive config was + catching nothing that ty doesn't already cover + - Disable markdownlint MD037 (false positives on cron expressions and + glob patterns like `saturating_*`) +- Replace derive_builder with hand-written VertexBuilder [#212](https://github.com/acgetchell/delaunay/pull/212) + [#249](https://github.com/acgetchell/delaunay/pull/249) [`b017b39`](https://github.com/acgetchell/delaunay/commit/b017b39bc410e96703bc7370972a930b93f6d6be) + + - Add VertexBuilderError enum and VertexBuilder struct with + point(), data(), and build() methods in src/core/vertex.rs + - Remove #[derive(Builder)] and #[builder(...)] attributes from Vertex + - Remove derive_builder dependency from Cargo.toml and lib.rs + - All ~30 call sites unchanged — builder API is a drop-in replacement +- Bump actions/download-artifact from 8.0.0 to 8.0.1 [#267](https://github.com/acgetchell/delaunay/pull/267) + [`3727781`](https://github.com/acgetchell/delaunay/commit/37277814a118d100bffed0e6fe48953094936280) + + Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 8.0.0 to 8.0.1. + + - [Release notes](https://github.com/actions/download-artifact/releases) + - [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) +- Bump tracing-subscriber in the dependencies group [#268](https://github.com/acgetchell/delaunay/pull/268) + [`7d355f4`](https://github.com/acgetchell/delaunay/commit/7d355f43418a3bad0da1badf5fde3a19d6306d37) + + Bumps the dependencies group with 1 update: [tracing-subscriber](https://github.com/tokio-rs/tracing). + + Updates `tracing-subscriber` from 0.3.22 to 0.3.23 + + - [Release notes](https://github.com/tokio-rs/tracing/releases) + - [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.3.22...tracing-subscriber-0.3.23) +- Bump taiki-e/install-action from 2.68.25 to 2.68.33 [#269](https://github.com/acgetchell/delaunay/pull/269) + [`f7fb663`](https://github.com/acgetchell/delaunay/commit/f7fb6638c744f76a92325117160a420eb85e3d0b) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.25 to 2.68.33. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/a37010ded18ff788be4440302bd6830b1ae50d8b...cbb1dcaa26e1459e2876c39f61c1e22a1258aac5) +- Bump actions-rust-lang/setup-rust-toolchain [#270](https://github.com/acgetchell/delaunay/pull/270) + [`73b8d63`](https://github.com/acgetchell/delaunay/commit/73b8d63896386e1f17d14e1b10421059d17a79c3) + + Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.3 to 1.15.4. + + - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) + - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) + - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/a0b538fa0b742a6aa35d6e2c169b4bd06d225a98...150fca883cd4034361b621bd4e6a9d34e5143606) +- Bump astral-sh/setup-uv from 7.3.1 to 7.5.0 [#271](https://github.com/acgetchell/delaunay/pull/271) + [`3225d64`](https://github.com/acgetchell/delaunay/commit/3225d64974cb1d7772cf5cde4be6206578ef2da9) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.1 to 7.5.0. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/5a095e7a2014a4212f075830d4f7277575a9d098...e06108dd0aef18192324c70427afc47652e63a82) +- Bump arc-swap from 1.8.2 to 1.9.0 in the dependencies group [#278](https://github.com/acgetchell/delaunay/pull/278) + [`da93901`](https://github.com/acgetchell/delaunay/commit/da93901c78a40e8e484e3fb21b117156167ec2a0) + + Bumps the dependencies group with 1 update: [arc-swap](https://github.com/vorner/arc-swap). + + Updates `arc-swap` from 1.8.2 to 1.9.0 + + - [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md) + - [Commits](https://github.com/vorner/arc-swap/compare/v1.8.2...v1.9.0) +- Bump taiki-e/install-action from 2.68.34 to 2.69.6 [#279](https://github.com/acgetchell/delaunay/pull/279) + [`6c7c8b1`](https://github.com/acgetchell/delaunay/commit/6c7c8b190e563f18555cbfee14e8608be1dadeed) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.34 to 2.69.6. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/de6bbd1333b8f331563d54a051e542c7dfef81c3...06203676c62f0d3c765be3f2fcfbebbcb02d09f5) +- Bump codecov/codecov-action from 5.5.2 to 5.5.3 [#280](https://github.com/acgetchell/delaunay/pull/280) + [`47394f3`](https://github.com/acgetchell/delaunay/commit/47394f3543d4cbd2c69f45a6ce0c54814bd33875) + + Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.2 to 5.5.3. + + - [Release notes](https://github.com/codecov/codecov-action/releases) + - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...1af58845a975a7985b0beb0cbe6fbbb71a41dbad) + +## [0.7.2] - 2026-03-10 + +### Merged Pull Requests + +- Exact insphere predicates with f64 fast filter [#245](https://github.com/acgetchell/delaunay/pull/245) +- Use exact-sign orientation in robust_orientation() [#244](https://github.com/acgetchell/delaunay/pull/244) +- Bump actions/setup-node from 6.2.0 to 6.3.0 [#239](https://github.com/acgetchell/delaunay/pull/239) +- Bump taiki-e/install-action from 2.68.16 to 2.68.25 [#237](https://github.com/acgetchell/delaunay/pull/237) +- Use exact arithmetic for orientation predicates [#235](https://github.com/acgetchell/delaunay/pull/235) + [#236](https://github.com/acgetchell/delaunay/pull/236) +- Switch FastKernel to insphere_lifted and enable LTO [#234](https://github.com/acgetchell/delaunay/pull/234) +- Deduplicate D<4 repair fallback and improve diagnostics [#232](https://github.com/acgetchell/delaunay/pull/232) +- Resolve 3D seeded bulk construction orientation convergence failure [#228](https://github.com/acgetchell/delaunay/pull/228) +- Bump actions-rust-lang/setup-rust-toolchain [#226](https://github.com/acgetchell/delaunay/pull/226) +- Bump taiki-e/install-action from 2.68.8 to 2.68.16 [#225](https://github.com/acgetchell/delaunay/pull/225) +- Bump astral-sh/setup-uv from 7.3.0 to 7.3.1 [#224](https://github.com/acgetchell/delaunay/pull/224) +- Bump actions/upload-artifact from 6 to 7 [#223](https://github.com/acgetchell/delaunay/pull/223) +- Bump actions/download-artifact from 7.0.0 to 8.0.0 [#222](https://github.com/acgetchell/delaunay/pull/222) +- Introduce GlobalTopology behavior model adapter [#221](https://github.com/acgetchell/delaunay/pull/221) +- Enforce coherent orientation as a first-class invariant [#219](https://github.com/acgetchell/delaunay/pull/219) +- Use bulk Hilbert API in order_vertices_hilbert [#218](https://github.com/acgetchell/delaunay/pull/218) +- Improve Hilbert curve correctness and add bulk API [#207](https://github.com/acgetchell/delaunay/pull/207) + [#216](https://github.com/acgetchell/delaunay/pull/216) +- Update docs for DelaunayTriangulationBuilder and toroidal topology [#215](https://github.com/acgetchell/delaunay/pull/215) +- Feat/210 toroidalspace periodic [#213](https://github.com/acgetchell/delaunay/pull/213) +- Bump taiki-e/install-action from 2.67.30 to 2.68.8 [#211](https://github.com/acgetchell/delaunay/pull/211) + +### Added + +- Enforce coherent orientation as a first-class invariant [#219](https://github.com/acgetchell/delaunay/pull/219) + [`350f614`](https://github.com/acgetchell/delaunay/commit/350f614c3e18d148bfc88809c28fdc2de362dd9a) + + - add Level 2 coherent-orientation validation via `is_coherently_oriented()` and `OrientationViolation` diagnostics + - preserve/normalize orientation across flips, cavity/neighbor rebuild paths, periodic quotient reconstruction, and vertex-removal retriangulation + - add orientation coverage in `tests/tds_orientation.rs`, document the invariant, and update related docs/doctest examples + +#### Changed: Refine coherent orientation handling and validation + + The flip algorithms now explicitly manage the local orientation of newly created cells, canonicalizing their vertex order to a positive orientation before + insertion. This ensures consistent orientation within individual cells as they are added. + + Introduced `facet_vertex_identities_in_cell_order` to `TriangulationDataStructure` which derives canonical facet identities (vertex keys and relative periodic + offsets). This improves the robustness of `normalize_coherent_orientation` and `is_coherently_oriented` by ensuring consistent comparisons across facets, + especially in periodic domains. + + Added `resolve_facet_handle_for_key` and `resolve_ridge_handle_for_key` to `flips.rs` to allow robust re-resolution of facet/ridge handles. This is necessary + because vertex reordering within cells (e.g., during canonicalization) can invalidate direct facet/ridge indices. + + Updates documentation to reflect the new explicit orientation management strategy during flips, where post-flip normalization and validation are now standard + practice. + + Improved error handling by boxing `source` errors in `InsertionError`, `DelaunayTriangulationConstructionErrorWithStatistics`, and + `TriangulationConstructionError`, reducing struct size and preventing excessive stack usage. + + Enhanced robustness of `Cell::swap_vertex_slots` with additional bounds checks and `Triangulation::build_initial_simplex` to handle cases with insufficient + vertices more gracefully. + + Added `bump_generation` in `normalize_coherent_orientation` to correctly increment the TDS generation counter when cell orientations are modified. + + Expanded TDS orientation tests to include serialization, manual tampering of cell vertex order, and verification that `is_coherently_oriented` correctly + detects the violation. + +- Use exact arithmetic for orientation predicates [#235](https://github.com/acgetchell/delaunay/pull/235) + [#236](https://github.com/acgetchell/delaunay/pull/236) [`a62437f`](https://github.com/acgetchell/delaunay/commit/a62437f25c27259f145d3c193ce149ee14b421c7) + + Switch to la-stack v0.2.1 with the `exact` feature to obtain provably + correct simplex orientation via `det_sign_exact()`. + + Orientation predicates: + + - Add `orientation_from_matrix()` using `det_sign_exact()` with a + finite-entry guard and adaptive-tolerance fallback for non-finite cases + - `simplex_orientation()` now delegates to `orientation_from_matrix()`, + eliminating manual tolerance comparison + + insphere_lifted optimization: + - Reuse the relative-coordinate block already in the lifted matrix for + orientation instead of re-converting all D+1 simplex points + - Combine the dimension-parity sign and (-1)^D orientation correction + into a single simplified formula: det_norm = −det × rel_sign + - Remove `dimension_is_even`, `parity_sign`, and `orient_sign` variables + + Stack-matrix dispatch cleanup: + - Reduce MAX_STACK_MATRIX_DIM from 18 to 7 (matching tested D≤5 range) + - Replace 19 hand-written match arms with a compact repetition macro + - Add `matrix_zero_like()` helper for creating same-sized zero matrices + within macro-dispatched blocks without nested dispatch +- Use exact-sign orientation in robust_orientation() [#244](https://github.com/acgetchell/delaunay/pull/244) + [`2869cfe`](https://github.com/acgetchell/delaunay/commit/2869cfea111dbca3641e7f88119d67b93a0d4841) + + Replace f64 determinant + adaptive tolerance in `robust_orientation()` + with `orientation_from_matrix()`, which uses `det_sign_exact()` for + provably correct sign classification on finite inputs. + + - Make `orientation_from_matrix` pub(crate) so robust_predicates can call it + - Remove adaptive_tolerance / manual threshold comparison from robust_orientation() + - Add near-degenerate 2D and 3D tests that exercise the exact-sign path + +#### Changed: Ignore slow higher-dimensional Delaunay proptests + + Mark 4D and 5D incremental insertion proptests as ignored. The exact + arithmetic fallback for orientation matrices larger than 4×4 is + currently too slow for practical test execution. This is an internal + change. + +- Exact insphere predicates with f64 fast filter [#245](https://github.com/acgetchell/delaunay/pull/245) + [`fed429f`](https://github.com/acgetchell/delaunay/commit/fed429f281cb2bc2e4a97cd99ac1770ade76a202) + + - Add `insphere_from_matrix` helper in predicates.rs using a 3-stage + approach: f64 fast filter → exact Bareiss → f64 fallback + - Update `insphere`, `insphere_lifted`, `adaptive_tolerance_insphere`, + and `conditioned_insphere` to use exact-sign path + - Remove dead `interpret_insphere_determinant` function + - Add near-cocircular and near-cospherical exact-sign tests + - Switch convex hull performance test to FastKernel to avoid 5×5 + exact Bareiss on cospherical inputs + - Document lint suppression preference (`expect` over `allow`) in + docs/dev/rust.md + +### Changed + +- Feat/210 toroidalspace periodic [#213](https://github.com/acgetchell/delaunay/pull/213) + [`c172796`](https://github.com/acgetchell/delaunay/commit/c1727967ae2c92440c42413c10e1d5859d4cb561) +- Introduce GlobalTopology behavior model adapter [#221](https://github.com/acgetchell/delaunay/pull/221) + [`e56265b`](https://github.com/acgetchell/delaunay/commit/e56265bafeb4a1e0e65c72b2037ab0e747af7ffa) + + - add internal `GlobalTopologyModel` abstraction and concrete models + (euclidean, toroidal, spherical scaffold, hyperbolic scaffold) + - add `GlobalTopologyModelAdapter` and `GlobalTopology::model()` bridge to keep + `GlobalTopology<D>` as the stable public metadata/config surface + - migrate triangulation orientation lifting to model-based behavior calls + - migrate builder toroidal validation/canonicalization to model-based calls + - update topology/code-organization docs for metadata-vs-behavior split + +#### Changed: Improve global topology model validation and consistency + + Enhances periodic cell offset validation by leveraging `supports_periodic_facet_signatures`. + Introduces robust checks for non-finite coordinates during point canonicalization + in toroidal models, preventing invalid states. + Refactors the `GlobalTopologyModelAdapter` to consistently delegate all trait + method calls to specific underlying topology model implementations, + improving maintainability. + Updates error messages for clarity during topology validation. + Optimizes `periodic_domain` to return a reference, avoiding data copies. + Adjusts internal module visibility and re-exports `ToroidalConstructionMode` to prelude. + +#### Changed: Add comprehensive documentation and tests for GlobalTopologyModel + + Enhance the global_topology_model module with extensive documentation and unit test coverage: + + Documentation improvements: + +- Add module-level overview explaining trait abstraction and concrete implementations +- Enhance trait method documentation for periodic_domain() and supports_periodic_facet_signatures() +- Document public methods: ToroidalModel::new(), GlobalTopology::model(), GlobalTopologyModelAdapter::from_global_topology() + + Test coverage (41 tests added): +- EuclideanModel: comprehensive trait method coverage +- SphericalModel and HyperbolicModel: scaffolded model behavior +- GlobalTopologyModelAdapter: delegation verification for all trait methods +- Error handling: zero/negative/infinite/NaN periods, non-finite coordinates +- Edge cases: large coordinates, exact periods, zero/large offsets, f32 scalars, 5D + + Code quality improvements: +- Fix nitpick: delegate kind() and allows_boundary() in GlobalTopologyModelAdapter +- Fix nitpick: add NaN coordinate test for canonicalize_point_in_place +- Fix nitpick: add finiteness validation to lift_for_orientation with test +- Apply cargo fmt formatting +- Fix clippy warnings (float_cmp, suboptimal_flops) + +#### Changed: Optimize facet vertex processing and improve periodic facet key determinism + + Moves the facet vertex buffer initialization to only execute on the non-periodic path, + avoiding unnecessary work for periodic cells and improving efficiency. + + Enhances the `periodic_facet_key_from_lifted_vertices` function to ensure + deterministic sorting by considering both the vertex key value and its periodic + offset. This prevents inconsistencies when multiple lifted vertices share the same + base key. + +- Make Codacy analysis step continue on error [`24a1ad6`](https://github.com/acgetchell/delaunay/commit/24a1ad6a7e17025f40ea9d4f626f302670664c39) + + Configures the Codacy analysis step in the CI workflow to continue on + error. This prevents the entire workflow from failing due to intermittent + issues with Codacy's opengrep/semgrep engine, ensuring subsequent steps, + like SARIF report uploads, can still execute. This improves CI robustness. + This is an internal CI workflow improvement. +- Enhance Codacy CI reliability and performance [`b980630`](https://github.com/acgetchell/delaunay/commit/b9806304bff5de8d6ee554e36ae5543929c6300f) + + Disables the Semgrep engine within Codacy due to intermittent failures + and excessively long runtimes observed in CI. Additionally, adds a + timeout to the Codacy analysis step to prevent hung analyzers from + consuming the full job timeout, improving overall workflow stability + and resource utilization. This is an internal CI/CD change. +- Update MSRV to 1.93.1 and `sysinfo` dependency [`a2a42d5`](https://github.com/acgetchell/delaunay/commit/a2a42d58ed913b46bf81489658356dc4d09c3637) + + Increment the Minimum Supported Rust Version (MSRV) to 1.93.1 + across all project configuration and documentation. This updates + the pinned Rust toolchain, `Cargo.toml` settings, and `clippy.toml` + MSRV, ensuring consistency and compatibility. Additionally, the + `sysinfo` dependency is updated to 0.38.3. This is an internal + maintenance change. +- Improve 3D incremental prefix debug harness [`515dade`](https://github.com/acgetchell/delaunay/commit/515dadeb975250217702a9ae1c0a705fc16f620f) + + Refactors the `run_incremental_prefix_3d` function to use a batch construction + method, aligning it with other large-scale debug tests and simplifying logic. + This enhances initial triangulation robustness and error reporting by capturing + detailed statistics from construction failures. + + Adds new environment variables, `DELAUNAY_LARGE_DEBUG_PREFIX_MAX_PROBES` and + `DELAUNAY_LARGE_DEBUG_PREFIX_MAX_RUNTIME_SECS`, to control the bisection + process, enabling more efficient and targeted debugging of failure points. + + Updates the `env_usize` helper to correctly parse environment variables + provided in a `key=value` format, improving test configuration flexibility. +- Deduplicate D<4 repair fallback and improve diagnostics [#232](https://github.com/acgetchell/delaunay/pull/232) + [`14ff1b3`](https://github.com/acgetchell/delaunay/commit/14ff1b3aad4ab4c1869018d6cbbb59d2d0456fd3) + + - Extract try_d_lt4_global_repair_fallback helper to eliminate + duplicated repair-or-abort logic between the stats and non-stats + branches of insert_remaining_vertices_seeded. + - Enrich the soft post-condition diagnostic in + normalize_and_promote_positive_orientation with the count of + residual negative cells and a sample of up to 5 CellKeys. + - Add test_construction_options_global_repair_fallback_toggle unit + test verifying the without_global_repair_fallback builder toggle. + +#### Fixed: Switch default kernel from FastKernel to RobustKernel + +- Change all convenience constructors (new, new_with_topology_guarantee, + new_with_options, empty, etc.) to use RobustKernel<f64> +- Change builder build() default to RobustKernel<T> +- Add RobustKernel to prelude::query exports +- Update type annotations across tests, benches, and doc tests +- Preserve FastKernel in tests that explicitly test it via with_kernel() + +#### Changed: Use RobustKernel for random generation and 3D examples + + Update examples and random triangulation utilities to use RobustKernel, + aligning them with the core library's default. FastKernel is now + explicitly documented as unreliable for 3D workloads due to floating- + point precision issues in near-degenerate configurations. This change + also adds topological admissibility checks for flip-based repairs and + improves error diagnostics for per-insertion failures. + +### Documentation + +- Update docs for DelaunayTriangulationBuilder and toroidal topology [#215](https://github.com/acgetchell/delaunay/pull/215) + [`a90526c`](https://github.com/acgetchell/delaunay/commit/a90526cd53be4cbe07c0add0b52ef04bd7243c3d) + + Update all documentation to reflect that toroidal topology is fully + implemented and accessible via DelaunayTriangulationBuilder. + + Documentation updates: + + - docs/topology.md: Replace "future plumbing" language with current + implementation status; add complete toroidal triangulation examples + - docs/api_design.md: Split Builder API section into simple (::new()) + vs advanced (Builder) construction with toroidal examples + - docs/workflows.md: Add new section for toroidal/periodic triangulations + with practical examples and construction modes + - docs/code_organization.md: Update file tree with missing files + (invariants.md, workflows.md, tests, geometry/util/ subdirectory) + - README.md: Add toroidal feature to Builder API section with example + + Code updates: + - src/lib.rs: Export TopologyKind and GlobalTopology from + prelude::triangulation for ergonomic imports + - src/core/delaunay_triangulation.rs: Add "Advanced Configuration" + section to ::new() documentation mentioning Builder for toroidal + and custom options; fix redundant rustdoc link + - examples/topology_editing_2d_3d.rs: Migrate to DelaunayTriangulationBuilder + - benches/profiling_suite.rs: Migrate to DelaunayTriangulationBuilder + +#### Changed: Adopt DelaunayTriangulationBuilder and update related documentation + + Migrates benchmark and example code to consistently use the + DelaunayTriangulationBuilder for creating triangulations. + This reflects the full implementation and accessibility of toroidal + topology via the builder, and updates documentation across various + sections (API design, workflows, topology) to guide users on its + proper and advanced configuration. Includes internal exports for + ergonomic usage. + +### Fixed + +- Ensure deterministic sorting and enforce coherent orientation + [`c0e4d4f`](https://github.com/acgetchell/delaunay/commit/c0e4d4fffc9e3ae116062b8bd2d89baf58678517) + + Resolves multiple issues to ensure deterministic behavior and strong + invariants across the triangulation data structure. + + Stabilizes vertex ordering, particularly for Hilbert curve sorts, by + refining tie-breaking, error handling, and fallback logic. This prevents + non-deterministic results and corrects inverse permutation calculations, + addressing previously identified breaking changes related to sorting. + + Enforces a consistent positive geometric orientation for all cells + throughout the triangulation lifecycle, making coherent orientation a + first-class invariant. This fixes 4D construction failures and improves + periodic self-neighbor validation by handling lifted coordinates. + + Enhances the global topology model, especially for toroidal domains, + by improving validation, canonicalization, and periodic facet key + derivation. This addresses edge cases related to non-finite coordinates, + zero/negative periods, and ensures consistent behavior. +- Resolve 3D seeded bulk construction orientation convergence failure [#228](https://github.com/acgetchell/delaunay/pull/228) + [`c181f28`](https://github.com/acgetchell/delaunay/commit/c181f289c7d36a6668a8441b78aed596b9dae36c) + + - Soften post-condition in normalize_and_promote_positive_orientation: + add canonicalize_global_orientation_sign before the promote loop to + prevent oscillation; demote the residual negative-orientation check + from a hard error to a diagnostic log so near-degenerate but + structurally valid simplices no longer abort insertion. + - Replace enlarged local repair fallback with global + repair_delaunay_with_flips_k2_k3 when D<4 per-insertion local repair + cycles on co-spherical FP configurations. The multi-attempt global + repair uses robust predicates and alternate queue orders to break + cycling. + - Gate global repair fallback on a new ConstructionOptions field + (use_global_repair_fallback, default true) threaded through the + build chain via DelaunayInsertionState. The periodic builder disables + it (.without_global_repair_fallback()) so global repair cannot + disrupt the image-point topology; the existing 24-attempt shuffle + retry finds a working vertex ordering instead. + +### Maintenance + +- Bump taiki-e/install-action from 2.67.30 to 2.68.8 [#211](https://github.com/acgetchell/delaunay/pull/211) + [`a133758`](https://github.com/acgetchell/delaunay/commit/a13375884047d06aab280ff5cb17f48910e496f0) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.30 to 2.68.8. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/288875dd3d64326724fa6d9593062d9f8ba0b131...cfdb446e391c69574ebc316dfb7d7849ec12b940) +- Update docs, remove old files [`18679dc`](https://github.com/acgetchell/delaunay/commit/18679dc73e5764277906ee83d1465cb0134a9780) +- Bump actions-rust-lang/setup-rust-toolchain [#226](https://github.com/acgetchell/delaunay/pull/226) + [`3e2cd26`](https://github.com/acgetchell/delaunay/commit/3e2cd26f67d4845445f1b876ec31695a20e745be) + + Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.2 to 1.15.3. + + - [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases) + - [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md) + - [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/1780873c7b576612439a134613cc4cc74ce5538c...a0b538fa0b742a6aa35d6e2c169b4bd06d225a98) +- Bump actions/download-artifact from 7.0.0 to 8.0.0 [#222](https://github.com/acgetchell/delaunay/pull/222) + [`c172f09`](https://github.com/acgetchell/delaunay/commit/c172f09dd0a0f533f47e943bfbbbfc54240e40b0) + + Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7.0.0 to 8.0.0. + + - [Release notes](https://github.com/actions/download-artifact/releases) + - [Commits](https://github.com/actions/download-artifact/compare/37930b1c2abaa49bbe596cd826c3c89aef350131...70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3) +- Bump taiki-e/install-action from 2.68.8 to 2.68.16 [#225](https://github.com/acgetchell/delaunay/pull/225) + [`25a09a4`](https://github.com/acgetchell/delaunay/commit/25a09a46f1c0d46775fd085e6b34053888d69277) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.8 to 2.68.16. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/cfdb446e391c69574ebc316dfb7d7849ec12b940...d6e286fa45544157a02d45a43742857ebbc25d12) +- Bump actions/upload-artifact from 6 to 7 [#223](https://github.com/acgetchell/delaunay/pull/223) + [`0a25bfa`](https://github.com/acgetchell/delaunay/commit/0a25bfa55c5b9d4579e7747e1e7c8661185c4542) + + Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. + + - [Release notes](https://github.com/actions/upload-artifact/releases) + - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) +- Bump astral-sh/setup-uv from 7.3.0 to 7.3.1 [#224](https://github.com/acgetchell/delaunay/pull/224) + [`1533402`](https://github.com/acgetchell/delaunay/commit/15334025d07c4dfeef43d01bbf3a190eaed54688) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.3.0 to 7.3.1. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/eac588ad8def6316056a12d4907a9d4d84ff7a3b...5a095e7a2014a4212f075830d4f7277575a9d098) +- Bump taiki-e/install-action from 2.68.16 to 2.68.25 [#237](https://github.com/acgetchell/delaunay/pull/237) + [`abe7925`](https://github.com/acgetchell/delaunay/commit/abe79250b63aaf695a8a4447250402b6f1cbdcc8) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.68.16 to 2.68.25. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/d6e286fa45544157a02d45a43742857ebbc25d12...a37010ded18ff788be4440302bd6830b1ae50d8b) +- Bump actions/setup-node from 6.2.0 to 6.3.0 [#239](https://github.com/acgetchell/delaunay/pull/239) + [`eb0000b`](https://github.com/acgetchell/delaunay/commit/eb0000bf27cb583a97370190861c01d4b8902bfe) + + Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.2.0 to 6.3.0. + + - [Release notes](https://github.com/actions/setup-node/releases) + - [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f) + +### Performance + +- Improve Hilbert curve correctness and add bulk API [#207](https://github.com/acgetchell/delaunay/pull/207) + [#216](https://github.com/acgetchell/delaunay/pull/216) [`2d198e7`](https://github.com/acgetchell/delaunay/commit/2d198e7d2f1f41f1b2e47009a1cf7cc12079fe05) + + Implements correctness fixes, API improvements, and comprehensive testing + for the Hilbert space-filling curve ordering utilities. + +#### Correctness Fixes + +- Add debug_assert guards in hilbert_index_from_quantized for parameter + validation (bits range and overflow checks) +- Fix quantization truncation bias by changing from NumCast::from(scaled) + to scaled.round().to_u32() for fairer spatial distribution across grid + cells, improving point ordering quality + +#### API Design + +- Add HilbertError enum with InvalidBitsParameter, IndexOverflow, and + DimensionTooLarge variants for proper error handling +- Implement hilbert_indices_prequantized() returning Result<Vec<u128>, + HilbertError> for bulk processing of pre-quantized coordinates +- Bulk API avoids redundant quantization computation, significantly + improving performance for large insertion batches + +#### Testing + +- Add 4D continuity test verifying Hilbert curve property on 256-point + grid (bits=2) +- Add quantization rounding distribution test validating fair cell + assignment +- Add 5 comprehensive tests for prequantized API covering success cases, + empty input, and all error conditions +- All 17 Hilbert-specific tests pass (11 existing + 6 new) + +#### Known Issue + + Temporarily ignore repair_fallback_produces_valid_triangulation test as + the rounding change affects insertion order, exposing a latent geometric + degeneracy issue in triangulation construction. This is properly + documented and tracked under issue #204 for investigation. + +#### Added: Explicitly handle zero-dimensional inputs in Hilbert index calculation + + Ensures correct behavior for `hilbert_indices_prequantized` when + the dimensionality `D` is zero. In such a space, all points map to + the single origin, and their Hilbert curve index is always 0. + This change adds an early return for this specific edge case. + +- Use bulk Hilbert API in order_vertices_hilbert [#218](https://github.com/acgetchell/delaunay/pull/218) + [`4782905`](https://github.com/acgetchell/delaunay/commit/478290556e88f770e0fcda07fb6137a3404b70f5) + + Refactored `order_vertices_hilbert` to use the bulk `hilbert_indices_prequantized` API + instead of calling `hilbert_index` individually for each vertex. This eliminates + redundant parameter validation (N validations → 1 validation for N vertices). +- Switch FastKernel to insphere_lifted and enable LTO [#234](https://github.com/acgetchell/delaunay/pull/234) + [`91e290f`](https://github.com/acgetchell/delaunay/commit/91e290fca1a633f5b084accc367767f235780a49) + + Switch FastKernel::in_sphere() to use insphere_lifted() for 5.3x speedup in 3D. + Add release profile optimization with thin LTO and codegen-units=1. + + Benchmarks across dimensions (2D-5D): + + - insphere_lifted is 5.3x faster in 3D (15.5 ns vs 81.7 ns) + - Random query test: 3.75x faster (20.0 µs vs 75.0 µs for 1000 queries) + - insphere_lifted consistently fastest across all dimensions + + Performance gains attributed to la-stack v0.2.0's closed-form determinants for D=1-4. + +## [0.7.1] - 2026-02-20 + +### Merged Pull Requests + +- Prevents timeout in 4D bulk construction [#203](https://github.com/acgetchell/delaunay/pull/203) +- Bump taiki-e/install-action from 2.67.26 to 2.67.30 [#202](https://github.com/acgetchell/delaunay/pull/202) +- Bump the dependencies group with 3 updates [#201](https://github.com/acgetchell/delaunay/pull/201) +- Feat/ball pointgen and debug harness [#200](https://github.com/acgetchell/delaunay/pull/200) +- Ci/perf baselines by tag [#199](https://github.com/acgetchell/delaunay/pull/199) +- Refactors changelog generation to use git-cliff [#198](https://github.com/acgetchell/delaunay/pull/198) +- Bump astral-sh/setup-uv from 7.2.1 to 7.3.0 [#196](https://github.com/acgetchell/delaunay/pull/196) +- Bump taiki-e/install-action from 2.67.18 to 2.67.26 [#195](https://github.com/acgetchell/delaunay/pull/195) +- Improves flip algorithm with topology index [#194](https://github.com/acgetchell/delaunay/pull/194) +- Removes `CoordinateScalar` bound from `Cell`, `Tds`, `Vertex` [#193](https://github.com/acgetchell/delaunay/pull/193) +- Moves `TopologyEdit` to `triangulation::flips` [#192](https://github.com/acgetchell/delaunay/pull/192) +- Correctly wires neighbors after K2 flips [#191](https://github.com/acgetchell/delaunay/pull/191) +- Use borrowed APIs in utility functions [#190](https://github.com/acgetchell/delaunay/pull/190) +- Add ScalarSummable/ScalarAccumulative supertraits [#189](https://github.com/acgetchell/delaunay/pull/189) +- Refactors point access for efficiency (internal) [#187](https://github.com/acgetchell/delaunay/pull/187) +- Corrects kernel parameter passing in triangulation [#186](https://github.com/acgetchell/delaunay/pull/186) +- Examples to error and struct definitions [#185](https://github.com/acgetchell/delaunay/pull/185) +- Validates random triangulations for Euler consistency [#184](https://github.com/acgetchell/delaunay/pull/184) +- Validates ridge links locally after Delaunay repair [#183](https://github.com/acgetchell/delaunay/pull/183) +- Bump astral-sh/setup-uv from 7.2.0 to 7.2.1 [#182](https://github.com/acgetchell/delaunay/pull/182) +- Bump taiki-e/install-action from 2.67.17 to 2.67.18 [#181](https://github.com/acgetchell/delaunay/pull/181) +- Stabilizes Delaunay property tests with bistellar flips [#180](https://github.com/acgetchell/delaunay/pull/180) +- Bump taiki-e/install-action from 2.66.1 to 2.67.11 [#177](https://github.com/acgetchell/delaunay/pull/177) +- Bump actions/checkout from 6.0.1 to 6.0.2 [#176](https://github.com/acgetchell/delaunay/pull/176) +- Bump actions/setup-node from 6.1.0 to 6.2.0 [#175](https://github.com/acgetchell/delaunay/pull/175) +- Feature/bistellar flips [#172](https://github.com/acgetchell/delaunay/pull/172) + +### Added + +- Examples to error and struct definitions [#185](https://github.com/acgetchell/delaunay/pull/185) + [`a1bce55`](https://github.com/acgetchell/delaunay/commit/a1bce556cfd9a799f2a6aabb716443a14aaf6772) + + Adds code examples to various error enums and struct definitions + to improve documentation and provide usage guidance. + + This change enhances the discoverability and understanding of + various components, such as `AdjacencyIndexBuildError`, + `BistellarFlipKind`, `FlipDirection`, `FlipError`, `FlipInfo`, + `TriangleHandle`, `RidgeHandle`, `DelaunayRepairStats`, + `RepairQueueOrder`, `DelaunayRepairDiagnostics`, + `DelaunayRepairError`, `HullExtensionReason`, `InsertionError`, + `LocateResult`, `LocateError`, `ConflictError`, `LocateFallbackReason`, + `LocateFallback`, `LocateStats`, `CellValidationError`, `EdgeKey`, + `FacetError`, `TopologicalOperation`, `RepairDecision`, + `InsertionResult`, `InsertionStatistics`, + `TriangulationConstructionState`, `TdsConstructionError`, + `DelaunayValidationError`, `DelaunayRepairPolicy`, + `DelaunayRepairHeuristicConfig`, `DelaunayRepairHeuristicSeeds`, + `DelaunayRepairOutcome`, `DelaunayCheckPolicy`, + `UuidValidationError`, `VertexValidationError`, + `ConvexHullValidationError`, `ConvexHullConstructionError`, + `MatrixError`, `InSphere`, `Orientation`, `QualityError`, + `ConsistencyResult`, `CoordinateConversionError`, + `CoordinateValidationError`, `CircumcenterError`, + `SurfaceMeasureError`, `RandomPointGenerationError` and + `ValueConversionError` to make the crate easier to use. + +#### Changed: Improves examples and updates doc tests + + Updates doc tests to use clearer examples and more + idiomatic syntax, enhancing code readability and + maintainability. Modifies BistellarFlipKind to use a + getter method. Addresses issues identified during + documentation review. (internal) + +- Add ScalarSummable/ScalarAccumulative supertraits [#189](https://github.com/acgetchell/delaunay/pull/189) + [`abdeeb2`](https://github.com/acgetchell/delaunay/commit/abdeeb2f80ab03c998b9a29108c57ff9f0c54393) + + - Add ScalarSummable (CoordinateScalar + Sum) and ScalarAccumulative (CoordinateScalar + AddAssign + SubAssign + Sum) + - Refactor repeated scalar bounds across geometry/core modules to use the new supertraits + - Allow “supertrait(s)” in cspell +- Document geometric and topological invariants [`0283bf0`](https://github.com/acgetchell/delaunay/commit/0283bf01cd1860c1a44ff9f645ac304fa44b7345) + + Adds `invariants.md` to document the theoretical background and + rationale for the topological and geometric invariants enforced by + the `delaunay` crate. This includes simplicial complexes, + PL-manifolds, link-based validation, insertion strategies, and + convergence considerations. Updates `README.md` and `lib.rs` to + reference the new document. Also adds a `examples/README.md` file. + +### Changed + +- Feature/bistellar flips [#172](https://github.com/acgetchell/delaunay/pull/172) + [`66c7028`](https://github.com/acgetchell/delaunay/commit/66c7028d0c3d9dbc00f6b1a9cb791c41d39ab933) +- Refactors point access for efficiency (internal) [#187](https://github.com/acgetchell/delaunay/pull/187) + [`8020065`](https://github.com/acgetchell/delaunay/commit/8020065afe66fc066ef51307a9de02621f087a54) + + Simplifies vertex coordinate access using `.coords()` instead of `.into()`, + improving code clarity and potentially performance. This change is + internal, affecting predicate calculations and geometric algorithms. + Also, moves the issue 120 investigation document to the archive. +- Use borrowed APIs in utility functions [#190](https://github.com/acgetchell/delaunay/pull/190) + [`bee065b`](https://github.com/acgetchell/delaunay/commit/bee065bd13f9f7adb8a7767b5b907ea7886248d5) + + Updates `into_hashmap`, `dedup_vertices_exact`, + `dedup_vertices_epsilon`, and `filter_vertices_excluding` + functions to accept slices instead of vectors, improving + performance by avoiding unnecessary cloning. + + This aligns with the Rust agent's preference for borrowed + APIs, taking references as arguments and returning borrowed + views when possible, and only taking ownership when required. +- Moves `TopologyEdit` to `triangulation::flips` [#192](https://github.com/acgetchell/delaunay/pull/192) + [`c491bb9`](https://github.com/acgetchell/delaunay/commit/c491bb913e1b49ff38d4ce52c180d5220e9db9df) + + Moves the `TopologyEdit` trait to `triangulation::flips` and renames it to `BistellarFlips`. + + This change involves updating imports and references throughout the codebase and documentation to reflect the new location and name of the trait. + +#### Changed: Refactors prelude modules for clarity (internal) + + Streamlines the prelude modules to provide clearer and more + focused exports for common triangulation tasks. This change + affects import statements in documentation and examples, + requiring more specific paths for certain types. + +#### Removed: Topology validation prelude module + + Removes the redundant topology validation prelude module. + + Moves its contents into the main topology prelude, simplifying + module structure and reducing code duplication. This change + internally refactors the prelude modules for better organization. + +- Removes `CoordinateScalar` bound from `Cell`, `Tds`, `Vertex` [#193](https://github.com/acgetchell/delaunay/pull/193) + [`e69f3d1`](https://github.com/acgetchell/delaunay/commit/e69f3d153961050e03a520e5b5457a165097c834) + + Relaxes trait bounds on `Cell`, `Tds`, and `Vertex` structs by + removing the `CoordinateScalar` requirement. + + This change prepares the triangulation data structure for combinatorial + operations independent of geometry. The `validate` method in `Tds` + now requires `CoordinateScalar` to perform coordinate validation, + where applicable. (Internal change). + +#### Changed: Clarifies `Vertex` constraints and moves `point` + + Clarifies the `Vertex` struct's constraints, emphasizing + `CoordinateScalar` requirement for geometric operations and + serialization but allowing combinatorial use without it. + + Moves the `point` method definition to ensure consistent API + presentation. (Internal refactoring, no functional change). + +- Improves flip algorithm with topology index [#194](https://github.com/acgetchell/delaunay/pull/194) + [`c4e37ed`](https://github.com/acgetchell/delaunay/commit/c4e37ed9e899170978196af4edad4e2c0a248141) + + Improves flip algorithm by introducing a topology index to + efficiently check for duplicate cells and non-manifold facets. + This avoids redundant scans of the triangulation data + structure, especially during repair operations, by pre-computing + and storing facet and cell signatures. This change is internal. +- Updates typos-cli installation in CI workflow [`6168e83`](https://github.com/acgetchell/delaunay/commit/6168e83512509123f9c0443f9716752f88cc2aa3) + + Updates the typos-cli installation in the CI workflow to use the + `taiki-e/install-action` for simpler and more reliable installation. + This aligns with the switch from cspell to typos in the codebase. +- Refactors changelog generation to use git-cliff [#198](https://github.com/acgetchell/delaunay/pull/198) + [`63553fa`](https://github.com/acgetchell/delaunay/commit/63553fa170a5603c98c3c5eee87caca756e0bb89) +- Ci/perf baselines by tag [#199](https://github.com/acgetchell/delaunay/pull/199) + [`0c94dec`](https://github.com/acgetchell/delaunay/commit/0c94dec96ac73004b9b9c924a977499e29dfaf19) +- Feat/ball pointgen and debug harness [#200](https://github.com/acgetchell/delaunay/pull/200) + [`79bf0e9`](https://github.com/acgetchell/delaunay/commit/79bf0e96b0d9c4f8cbdda8539910adfa18f412a4) + +### Documentation + +- Refresh docs and add workflows guide [`695e9a0`](https://github.com/acgetchell/delaunay/commit/695e9a0f700b8cb6bf7cb5a3acb6e4510c4b3939) + + - Add a new workflows guide covering Builder/Edit API usage, topology guarantees, and repair + - Wire README into doctests and refresh crate-level docs/examples (simplify type annotations, link to workflows) + - Update README Features + references (kernels, insertion ordering, construction options, validation/repair) + - Reorganize docs index and archive historical/roadmap material; refresh topology/robustness/validation guides + - Replace debug `eprintln!` with `tracing` in Hilbert utilities/tests + - Tweak spell-check + release docs (typos-cli, rename handling, release steps) and update CHANGELOG + +### Fixed + +- Stabilizes Delaunay property tests with bistellar flips [#180](https://github.com/acgetchell/delaunay/pull/180) + [`e3bd4bf`](https://github.com/acgetchell/delaunay/commit/e3bd4bfa77258484e6dab088a2980139efd0f182) + + Enables previously failing Delaunay property tests by + implementing bistellar flips for robust Delaunay repair. + Includes automatic repair and fast validation. + + Updates MSRV to 1.93.0. +- Validates ridge links locally after Delaunay repair [#183](https://github.com/acgetchell/delaunay/pull/183) + [`7bc4792`](https://github.com/acgetchell/delaunay/commit/7bc4792b33ee1e6ecbeda729834a33fbf06cd0e6) + + Addresses potential topology violations (non-manifold configurations) + introduced by flip-based Delaunay repair by validating ridge links + for affected cells post-insertion. This prevents committing + invalid triangulations and surfaces topology validation failures + as insertion errors, enabling transactional rollback. +- Validates random triangulations for Euler consistency [#184](https://github.com/acgetchell/delaunay/pull/184) + [`72eb272`](https://github.com/acgetchell/delaunay/commit/72eb2726f8c683339a23b17a63991ac87a35e412) + + Ensures that random triangulations satisfy Euler characteristic + validation to prevent construction errors or invalid classifications. + + Adds a validation function to check topology/Euler validity after + triangulation construction or robust fallback attempts, catching + potential issues that can lead to incorrect results. Removes + redundant validation checks. +- Corrects kernel parameter passing in triangulation [#186](https://github.com/acgetchell/delaunay/pull/186) + [`df3c490`](https://github.com/acgetchell/delaunay/commit/df3c49033dd96558ee5ee0de572913e82c55f210) + + Addresses an issue where the kernel was being passed by value + instead of by reference in the Delaunay triangulation + construction. This change ensures that the kernel is correctly + accessed and used, preventing potential errors and improving + reliability. The fix involves modifying the `with_kernel` method + signatures and call sites to accept a kernel reference instead of + a kernel value. This affects benchmark code, documentation, + examples, and internal code. +- Correctly wires neighbors after K2 flips [#191](https://github.com/acgetchell/delaunay/pull/191) + [`5ab686c`](https://github.com/acgetchell/delaunay/commit/5ab686c2177562bdeb852fe843c946181e03753a) + + Fixes an issue where external neighbors across the cavity + boundary were not being correctly rewired after a K2 flip. + + Introduces `external_facets_for_boundary` to collect the set + of external facets that are shared with the flip cavity boundary, + and then uses these to correctly wire up neighbors. + + Adds a test case to verify that external neighbors are correctly + rewired after the flip, ensuring that the triangulation remains + valid and consistent. + Refs: refactor/wire-cavity-neighbors + +#### Added: K=3 flip rewiring test + + Adds a test to verify correct rewiring of external neighbors + after a k=3 flip. This validates the boundary handling and + neighbor update logic in the bistellar flip implementation. + + This test constructs an explicit k=3 ridge-flip fixture and + checks neighbor rewiring. + +- Prevents timeout in 4D bulk construction [#203](https://github.com/acgetchell/delaunay/pull/203) + [`b071fb7`](https://github.com/acgetchell/delaunay/commit/b071fb787bf06ff196fade35fd5dab180822985b) + + Addresses a timeout issue in 4D bulk construction + by implementing per-insertion local Delaunay repair + (soft-fail) during bulk construction to prevent + violation accumulation, which slows down the global + repair process. Also adds a hard wall-clock time + limit to the test harness. + +### Maintenance + +- Bump actions/setup-node from 6.1.0 to 6.2.0 [#175](https://github.com/acgetchell/delaunay/pull/175) + [`8d15114`](https://github.com/acgetchell/delaunay/commit/8d15114553e05ecb9d46cfb9bd78eb9e27379796) + + Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.1.0 to 6.2.0. + + - [Release notes](https://github.com/actions/setup-node/releases) + - [Commits](https://github.com/actions/setup-node/compare/395ad3262231945c25e8478fd5baf05154b1d79f...6044e13b5dc448c55e2357c09f80417699197238) +- Bump actions/checkout from 6.0.1 to 6.0.2 [#176](https://github.com/acgetchell/delaunay/pull/176) + [`c703f94`](https://github.com/acgetchell/delaunay/commit/c703f944a9928651b639d5e5b2a06db3b1b75e4f) + + Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2. + + - [Release notes](https://github.com/actions/checkout/releases) + - [Commits](https://github.com/actions/checkout/compare/v6.0.1...v6.0.2) +- Bump taiki-e/install-action from 2.66.1 to 2.67.11 [#177](https://github.com/acgetchell/delaunay/pull/177) + [`92292e0`](https://github.com/acgetchell/delaunay/commit/92292e01f5777fe4f13ab387a1f9ee4e39930ab3) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.66.1 to 2.67.11. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/3522286d40783523f9c7880e33f785905b4c20d0...887bc4e03483810873d617344dd5189cd82e7b8b) +- Bump astral-sh/setup-uv from 7.2.0 to 7.2.1 [#182](https://github.com/acgetchell/delaunay/pull/182) + [`cfaaf60`](https://github.com/acgetchell/delaunay/commit/cfaaf600fef814bfe563524fcdbcb0ab83fa9028) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.0 to 7.2.1. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/61cb8a9741eeb8a550a1b8544337180c0fc8476b...803947b9bd8e9f986429fa0c5a41c367cd732b41) +- Bump taiki-e/install-action from 2.67.17 to 2.67.18 [#181](https://github.com/acgetchell/delaunay/pull/181) + [`068f314`](https://github.com/acgetchell/delaunay/commit/068f314ed00a837678c968734f75b4b69327d9e0) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.17 to 2.67.18. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/29feb09ac22f4fde4175fe7b5c3548952234f69a...650c5ca14212efbbf3e580844b04bdccf68dac31) +- Bump rand to 0.10 and trim unused deps [`fe3e406`](https://github.com/acgetchell/delaunay/commit/fe3e406f19dcc6c9c72666d89b285626ea00465c) + + - Update rand to v0.10 and fix RNG trait imports (use rand::RngExt) in tests/utilities + - Move test-only crates to dev-dependencies (approx, serde_json) + - Remove unused runtime dependencies (anyhow, clap, serde_test) + - Drop clippy allow for multiple_crate_versions + - Update Cargo.lock and regenerate CHANGELOG.md +- Bump astral-sh/setup-uv from 7.2.1 to 7.3.0 [#196](https://github.com/acgetchell/delaunay/pull/196) + [`6c4662a`](https://github.com/acgetchell/delaunay/commit/6c4662a4008e5a43de71d3b83591350dbf4778b0) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.2.1 to 7.3.0. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/803947b9bd8e9f986429fa0c5a41c367cd732b41...eac588ad8def6316056a12d4907a9d4d84ff7a3b) +- Bump taiki-e/install-action from 2.67.18 to 2.67.26 [#195](https://github.com/acgetchell/delaunay/pull/195) + [`1cd6008`](https://github.com/acgetchell/delaunay/commit/1cd6008503d0bc2694e934060f8ed986f2d9e05e) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.18 to 2.67.26. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/650c5ca14212efbbf3e580844b04bdccf68dac31...509565405a8a987e73cf742e26b26dcc72c4b01a) +- Bump taiki-e/install-action from 2.67.26 to 2.67.30 [#202](https://github.com/acgetchell/delaunay/pull/202) + [`e99f0d3`](https://github.com/acgetchell/delaunay/commit/e99f0d3f17cf45e85c51274799b8baee3b28e8e5) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.67.26 to 2.67.30. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/509565405a8a987e73cf742e26b26dcc72c4b01a...288875dd3d64326724fa6d9593062d9f8ba0b131) +- Bump the dependencies group with 3 updates [#201](https://github.com/acgetchell/delaunay/pull/201) + [`fa69c80`](https://github.com/acgetchell/delaunay/commit/fa69c800e6b01fa2cb4f9b1468473e09ed9f0108) + + Bumps the dependencies group with 3 updates: [arc-swap](https://github.com/vorner/arc-swap), [uuid](https://github.com/uuid-rs/uuid) and + [sysinfo](https://github.com/GuillaumeGomez/sysinfo). + + Updates `arc-swap` from 1.8.1 to 1.8.2 + + - [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md) + - [Commits](https://github.com/vorner/arc-swap/compare/v1.8.1...v1.8.2) + + Updates `uuid` from 1.20.0 to 1.21.0 + - [Release notes](https://github.com/uuid-rs/uuid/releases) + - [Commits](https://github.com/uuid-rs/uuid/compare/v1.20.0...v1.21.0) + + Updates `sysinfo` from 0.38.1 to 0.38.2 + - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md) + - [Commits](https://github.com/GuillaumeGomez/sysinfo/compare/v0.38.1...v0.38.2) + +### Removed + +- Replace cspell with typos for spell checking [`4b5e1a1`](https://github.com/acgetchell/delaunay/commit/4b5e1a1641037f137663612c74bb39cd187f90e9) + + Replaces the cspell tool with typos for spell checking across the + project. This change involves removing cspell configurations and + dependencies, and integrating typos, including its configuration file. + +## [0.7.0] - 2026-01-13 + +### ⚠️ Breaking Changes + +- Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) + +### Merged Pull Requests + +- Refactors topology guarantee and manifold validation [#171](https://github.com/acgetchell/delaunay/pull/171) +- Bump astral-sh/setup-uv from 7.1.6 to 7.2.0 [#170](https://github.com/acgetchell/delaunay/pull/170) +- Bump taiki-e/install-action from 2.65.13 to 2.66.1 [#169](https://github.com/acgetchell/delaunay/pull/169) +- Feature/manifolds [#168](https://github.com/acgetchell/delaunay/pull/168) +- Refactors Gram determinant calculation with LDLT [#167](https://github.com/acgetchell/delaunay/pull/167) +- Bump clap from 4.5.53 to 4.5.54 in the dependencies group [#166](https://github.com/acgetchell/delaunay/pull/166) +- Bump taiki-e/install-action from 2.65.7 to 2.65.13 [#165](https://github.com/acgetchell/delaunay/pull/165) +- Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) + +### Added + +- [**breaking**] Add public topology traversal API [#164](https://github.com/acgetchell/delaunay/pull/164) + [`3748ebb`](https://github.com/acgetchell/delaunay/commit/3748ebb24ded08154875b2be371128c77d43eed3) + + - Introduce canonical `EdgeKey` and read-only topology traversal helpers on `Triangulation` + - Add opt-in `AdjacencyIndex` builder for faster repeated adjacency queries + - Add integration tests for topology traversal and adjacency index invariants + - Refresh repo tooling/CI configs and supporting scripts/tests + +#### Changed: Exposes public topology traversal API + + Makes topology traversal APIs public for external use. + + Exposes `edges()`, `incident_edges()`, and `cell_neighbors()` on the + `DelaunayTriangulation` struct as convenience wrappers. Updates + documentation, examples, and benchmarks to use new API. + + This allows external users to traverse the triangulation's topology + without needing to access internal implementation details. + +#### Changed: Expose topology query APIs on DelaunayTriangulation + + Exposes cell and vertex query APIs on `DelaunayTriangulation` for zero-allocation topology traversal. + + Also includes internal refactoring to improve vertex incidence + validation and ensure more robust handling of invalid key references. + Now TDS validation detects isolated vertices. + +### Changed + +- Updates CHANGELOG.md for unreleased changes [`271353f`](https://github.com/acgetchell/delaunay/commit/271353f1b1af82fb45eb619520d62cd7474e4541) + + Updates the changelog to reflect recent changes, including adding + a new public topology traversal API, refreshing repository + tooling/CI configurations, and clarifying TDS validation and API + documentation. +- Refactors Gram determinant calculation with LDLT [#167](https://github.com/acgetchell/delaunay/pull/167) + [`561a259`](https://github.com/acgetchell/delaunay/commit/561a259d58401d2baa61cd6313dd0ada01179f4a) + + Refactors the Gram determinant calculation to use LDLT factorization from the `la-stack` crate for improved efficiency and numerical stability by exploiting + symmetry. + + Also, updates the `la-stack` dependency version. + +#### Fixed: Improves robustness of incremental insertion + + Addresses rare topological invalidations during incremental + insertion by: + +- Adding connectedness validation to conflict region checks. +- Adding codimension-2 boundary manifoldness validation + ("no boundary of boundary") to triangulation's `is_valid` + method. +- Ensuring that strict Level 3 validation is enabled during + batch construction in debug builds. + Refs: feat/la-stack-ldlt-factorization + +#### Changed: Rename SimplexCounts to FVector for clarity + + Renames the `SimplexCounts` struct to `FVector` to better reflect + its mathematical meaning as the f-vector in topology, representing + the counts of simplices of different dimensions. + + This change improves code readability and aligns the naming + convention with standard topological terminology. + (Internal refactoring, no API change.) + +#### Changed: Improves simplex generation algorithm + + Improves the algorithm for generating simplex combinations in + the Euler characteristic calculation. This change enhances + efficiency by using a lexicographic approach to generate + combinations, reducing unnecessary computations. + +- Feature/manifolds [#168](https://github.com/acgetchell/delaunay/pull/168) + [`10abbe1`](https://github.com/acgetchell/delaunay/commit/10abbe1899a381d1b0d4855727dfef7797952549) +- Refactors topology guarantee and manifold validation [#171](https://github.com/acgetchell/delaunay/pull/171) + [`dfdba5a`](https://github.com/acgetchell/delaunay/commit/dfdba5a745d6a41b4fa92d66b71c0c3d3dc87e54) + + Refactors manifold validation mode to topology guarantee for + clarity. Updates Level 3 validation configuration, improves error + reporting, and adds comprehensive manifold validation tests. + Also improves robustness of incremental insertion. + +#### Changed: Updates topology guarantee defaults and validation + + Updates the default topology guarantee to `Pseudomanifold` for new + triangulations and deserialized triangulations. Also, clarifies + validation policy and its relationship to topology guarantees in + documentation. Introduces a test-only function to repair degenerate + cells by removing them and clearing dangling references. + +#### Fixed: Corrects triangulation perturbation logic + + Fixes a bug in the vertex insertion perturbation logic that + caused non-equivalent results when translating the input + point set by using a translation-invariant anchor for + perturbation scaling. + + Also, preserves the caller-provided vertex UUID across + perturbation retries to maintain vertex identity. + + Updates documentation on topology guarantees to clarify + manifoldness invariants. + +#### Changed: Improves PL-manifold validation with vertex-link check + + Replaces ridge-link validation with vertex-link validation for + PL-manifold topology guarantee. This change provides a more + robust and canonical check for PL-manifoldness, ensuring that + the link of every vertex is a sphere or ball of the appropriate + dimension. + +### Maintenance + +- Bump clap from 4.5.53 to 4.5.54 in the dependencies group [#166](https://github.com/acgetchell/delaunay/pull/166) + [`ebd0d32`](https://github.com/acgetchell/delaunay/commit/ebd0d32e3552b2e94af021995df8c9c1431ccc1b) + + Bumps the dependencies group with 1 update: [clap](https://github.com/clap-rs/clap). + + Updates `clap` from 4.5.53 to 4.5.54 + + - [Release notes](https://github.com/clap-rs/clap/releases) + - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) + - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.53...clap_complete-v4.5.54) +- Bump taiki-e/install-action from 2.65.7 to 2.65.13 [#165](https://github.com/acgetchell/delaunay/pull/165) + [`6b5f723`](https://github.com/acgetchell/delaunay/commit/6b5f723cf9f71599bedef098b3f226f4786ce539) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.65.7 to 2.65.13. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/4c6723ec9c638cccae824b8957c5085b695c8085...0e76c5c569f13f7eb21e8e5b26fe710062b57b62) +- Bump astral-sh/setup-uv from 7.1.6 to 7.2.0 [#170](https://github.com/acgetchell/delaunay/pull/170) + [`b50bb8c`](https://github.com/acgetchell/delaunay/commit/b50bb8c4157496c99e9879b5c7214815ddbca633) + + Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.6 to 7.2.0. + + - [Release notes](https://github.com/astral-sh/setup-uv/releases) + - [Commits](https://github.com/astral-sh/setup-uv/compare/681c641aba71e4a1c380be3ab5e12ad51f415867...61cb8a9741eeb8a550a1b8544337180c0fc8476b) +- Bump taiki-e/install-action from 2.65.13 to 2.66.1 [#169](https://github.com/acgetchell/delaunay/pull/169) + [`44d3add`](https://github.com/acgetchell/delaunay/commit/44d3add45bdac8daff9cff6b686929959ccf84a3) + + Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.65.13 to 2.66.1. + + - [Release notes](https://github.com/taiki-e/install-action/releases) + - [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md) + - [Commits](https://github.com/taiki-e/install-action/compare/0e76c5c569f13f7eb21e8e5b26fe710062b57b62...3522286d40783523f9c7880e33f785905b4c20d0) + +[0.7.8]: https://github.com/acgetchell/delaunay/compare/v0.7.7...v0.7.8 +[0.7.7]: https://github.com/acgetchell/delaunay/compare/v0.7.6...v0.7.7 +[0.7.6]: https://github.com/acgetchell/delaunay/compare/v0.7.5...v0.7.6 +[0.7.5]: https://github.com/acgetchell/delaunay/compare/v0.7.4...v0.7.5 +[0.7.4]: https://github.com/acgetchell/delaunay/compare/v0.7.3...v0.7.4 +[0.7.3]: https://github.com/acgetchell/delaunay/compare/v0.7.2...v0.7.3 +[0.7.2]: https://github.com/acgetchell/delaunay/compare/v0.7.1...v0.7.2 +[0.7.1]: https://github.com/acgetchell/delaunay/compare/v0.7.0...v0.7.1 +[0.7.0]: https://github.com/acgetchell/delaunay/compare/v0.6.2...v0.7.0 diff --git a/docs/archive/performance/README.md b/docs/archive/performance/README.md index 525747e9..9bb6e62d 100644 --- a/docs/archive/performance/README.md +++ b/docs/archive/performance/README.md @@ -1,14 +1,6 @@ # Archived Performance Reports -Older release-to-release benchmark comparisons are archived here. The release -workflow promotes the latest curated comparison to `docs/PERFORMANCE.md` and -moves its predecessor into this directory. +Older release-to-release benchmark comparisons are archived here. +`docs/PERFORMANCE.md` contains the latest curated comparison. -## Release Comparisons - -- No archived release-to-release reports yet. - -## Large-Scale Debug Characterizations - -- [May 2026](large-scale-debug-characterization-2026-05.md) — dated 2D–5D - release-mode acceptance and profiling observations. +- [large-scale-debug-characterization-2026-05](large-scale-debug-characterization-2026-05.md) diff --git a/docs/dev/commands.md b/docs/dev/commands.md index e91d0fef..4bb3f2d1 100644 --- a/docs/dev/commands.md +++ b/docs/dev/commands.md @@ -222,7 +222,8 @@ just docs-version-check This compares the Cargo package version against `Cargo.lock`, `pyproject.toml`, `uv.lock`, `CITATION.cff`, release-pinned README links, active documentation -dependency snippets, and current-tag benchmark workflow examples. +dependency and `cargo add` snippets, and current-tag benchmark workflow +examples. --- @@ -367,11 +368,13 @@ regenerates `benches/PERFORMANCE_RESULTS.md`. Use `just bench-latest` when you need the curated release-signal Criterion suite for local saved-baseline comparisons. It runs `ci_performance_suite`, `circumsphere_containment`, `cold_path_predicates`, -`topology_guarantee_construction`, and `locate`, leaving `target/criterion/new` -data suitable for `just bench-compare`. Save the previous release signal as -`last` with `just bench-save-baseline last` from the baseline checkout, or save -an explicit baseline name with the same recipe. Use `just perf-local` when you -want the tool to manage isolated +and `locate`, leaving `target/criterion/new` data suitable for +`just bench-compare`. The manual `topology_guarantee_construction` suite remains +available through `just bench-save-baseline topology` and +`uv run benchmark-utils perf-local --suite topology`. Save the previous release +signal as `last` with `just bench-save-baseline last` from the baseline +checkout, or save an explicit baseline name with the same recipe. Use +`just perf-local` when you want the tool to manage isolated baseline/current worktrees. ```bash diff --git a/docs/diagnostics.md b/docs/diagnostics.md index d9a4087c..50aadfd2 100644 --- a/docs/diagnostics.md +++ b/docs/diagnostics.md @@ -61,7 +61,7 @@ In downstream application code: ```toml [dependencies] -delaunay = { version = "0.7.8", features = ["diagnostics"] } +delaunay = { version = "0.8.0", features = ["diagnostics"] } ``` ## Validation Reports diff --git a/justfile b/justfile index f1984e61..18d2203b 100644 --- a/justfile +++ b/justfile @@ -25,7 +25,7 @@ rumdl_version := "0.2.43" samply_version := "0.13.1" sarif_fmt_version := "0.8.0" taplo_version := "0.10.0" -tectonic_version := "0.16.9" +tectonic_version := "0.17.0" tex_fmt_version := "0.5.7" typos_version := "1.48.0" uv_version := "0.11.32" @@ -88,7 +88,6 @@ bench-latest: cargo bench --profile perf --bench ci_performance_suite cargo bench --profile perf --bench circumsphere_containment cargo bench --profile perf --bench cold_path_predicates - cargo bench --profile perf --bench topology_guarantee_construction cargo bench --profile perf --bench locate # Run latest measurements and render the latest-vs-last performance report. @@ -113,7 +112,7 @@ bench-save-baseline tag suite="release-signal": suite="{{ suite }}" case "$suite" in release-signal) - targets=(ci_performance_suite circumsphere_containment cold_path_predicates topology_guarantee_construction locate) + targets=(ci_performance_suite circumsphere_containment cold_path_predicates locate) ;; ci) targets=(ci_performance_suite) diff --git a/pyproject.toml b/pyproject.toml index a2924733..76ffb345 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "delaunay-scripts" -version = "0.7.8" +version = "0.8.0" description = "Python utility scripts for the delaunay Rust library" readme = "README.md" requires-python = ">=3.14" diff --git a/scripts/benchmark_utils.py b/scripts/benchmark_utils.py index 6b68396e..32583758 100755 --- a/scripts/benchmark_utils.py +++ b/scripts/benchmark_utils.py @@ -203,7 +203,6 @@ def from_environment(cls) -> BaselineArtifactMetadata: "ci_performance_suite", "circumsphere_containment", "cold_path_predicates", - "topology_guarantee_construction", "locate", ) RELEASE_SIGNAL_GROUP_PREFIXES = ( @@ -222,7 +221,6 @@ def from_environment(cls) -> BaselineArtifactMetadata: "5d", "edge_cases_", "predicates", - "topology_guarantee_construction", "locate", ) BENCH_TARGET_SUITES = { @@ -3133,8 +3131,8 @@ def _run_saved_baseline_for_suite(*, worktree: Path, baseline_tag: str, suite: s def _run_latest_for_suite(*, worktree: Path, suite: str, env: dict[str, str] | None) -> None: - """Run latest release-signal benchmarks for a suite.""" - if (worktree / "justfile").exists(): + """Run current benchmarks for a suite.""" + if suite == "release-signal" and (worktree / "justfile").exists(): _run_tool("just", ["bench-latest"], cwd=worktree, timeout=RELEASE_BENCH_TIMEOUT_SECONDS, env=env) return for target in _bench_targets_for_suite(worktree, suite): diff --git a/scripts/check_docs_version_sync.py b/scripts/check_docs_version_sync.py index 6da64fb0..42720e71 100644 --- a/scripts/check_docs_version_sync.py +++ b/scripts/check_docs_version_sync.py @@ -88,6 +88,7 @@ class ReferenceKind(StrEnum): """A release surface whose version must match Cargo.toml.""" BENCHMARK_CURRENT_TAG = "benchmark workflow current tag" + CARGO_ADD = "cargo add command" CARGO_LOCK = "Cargo.lock root package" CITATION = "CITATION.cff version" DEPENDENCY_SNIPPET = "documentation dependency snippet" @@ -281,6 +282,30 @@ def _dependency_references(path: Path, package_name: str) -> list[VersionReferen return references +def _cargo_add_regex(package_name: str) -> re.Pattern[str]: + """Build a regex for cargo-add commands naming *package_name*.""" + escaped_name = re.escape(package_name) + return re.compile(rf"(?[^\s`]+)") + + +def _cargo_add_references(path: Path, package_name: str) -> list[VersionReference]: + """Return cargo-add command references in a Markdown file.""" + cargo_add_re = _cargo_add_regex(package_name) + references: list[VersionReference] = [] + for line_number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), start=1): + references.extend( + VersionReference( + path=path, + line=line_number, + version=match.group("version"), + kind=ReferenceKind.CARGO_ADD, + text=line.strip(), + ) + for match in cargo_add_re.finditer(line) + ) + return references + + _README_TAG_LINK_RE = re.compile( r"https://(?:github\.com/acgetchell/delaunay/(?:blob|raw|tree)/|raw\.githubusercontent\.com/acgetchell/delaunay/)" r"(?:v(?P[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)" @@ -334,6 +359,7 @@ def _version_references(root: Path, package: PackageInfo) -> list[VersionReferen ] for path in _iter_markdown_files(root): references.extend(_dependency_references(path, package.name)) + references.extend(_cargo_add_references(path, package.name)) references.extend(_benchmark_current_tag_references(path)) references.extend(_readme_tag_references(root / "README.md")) return references diff --git a/scripts/postprocess_changelog.py b/scripts/postprocess_changelog.py index eaf56195..d724239c 100644 --- a/scripts/postprocess_changelog.py +++ b/scripts/postprocess_changelog.py @@ -105,11 +105,18 @@ class _CodeFence: # inside one release section. _FOLLOWUP_HEADING_SUFFIX_RE = re.compile(r"\s+-\s+Follow-up(?:\s+\d+)?$") -# Markdown code spans used in generated heading titles. +# Markdown code spans used in generated text. _CODE_SPAN_RE = re.compile(r"`([^`]*)`") -# Bare glob-like identifiers in headings can be parsed as emphasis by linters. -_WILDCARD_IDENTIFIER_RE = re.compile(r"(? int | None: return None +def _delimiter_run_end(text: str, start: int, delimiter: str) -> int: + """Return the exclusive end of one repeated Markdown delimiter run.""" + end = start + 1 + while end < len(text) and text[end] == delimiter: + end += 1 + return end + + +def _is_left_flanking_asterisk_run(text: str, start: int, end: int) -> bool: + """Return whether an asterisk run can open Markdown emphasis.""" + before = text[start - 1] if start > 0 else " " + after = text[end] if end < len(text) else " " + before_is_punctuation = not before.isalnum() and not before.isspace() + after_is_punctuation = not after.isalnum() and not after.isspace() + return not after.isspace() and (not after_is_punctuation or before.isspace() or before_is_punctuation) + + +def _is_right_flanking_asterisk_run(text: str, start: int, end: int) -> bool: + """Return whether an asterisk run can close Markdown emphasis.""" + before = text[start - 1] if start > 0 else " " + after = text[end] if end < len(text) else " " + before_is_punctuation = not before.isalnum() and not before.isspace() + after_is_punctuation = not after.isalnum() and not after.isspace() + return not before.isspace() and (not before_is_punctuation or after.isspace() or after_is_punctuation) + + +def _asterisk_emphasis_span_end(text: str, start: int) -> int | None: + """Return the end of an emphasis span with a matching asterisk run.""" + opener_end = _delimiter_run_end(text, start, "*") + delimiter_length = opener_end - start + if not _is_left_flanking_asterisk_run(text, start, opener_end): + return None + + position = opener_end + while position < len(text): + if text[position] == "`": + code_span_end = _backtick_span_end(text, position) + if code_span_end is not None: + position = code_span_end + continue + if text[position] != "*": + position += 1 + continue + + closer_end = _delimiter_run_end(text, position, "*") + if closer_end - position == delimiter_length and _is_right_flanking_asterisk_run(text, position, closer_end): + return closer_end + position = closer_end + return None + + def _balanced_delimiter_end(text: str, start: int, opening: str, closing: str) -> int | None: """Return the end of a balanced delimiter pair, honoring escapes.""" depth = 1 @@ -1225,23 +1283,38 @@ def _normalize_entry_heading(line: str, current_entry_summary: str | None) -> st return f"#### {title}" -def _code_span_heading_wildcards(line: str) -> str: - """Wrap bare wildcard identifiers in heading titles with code spans.""" - match = _ATX_HEADING_RE.match(line) - if match is None: - return line +def _code_span_wildcard_identifiers(line: str) -> str: + """Wrap bare wildcard identifiers outside code and emphasis spans.""" def code_span(match: re.Match[str]) -> str: return f"`{match.group(1)}`" - title_parts = re.split(r"(`[^`]+`)", match.group("title")) - title = "".join(part if part.startswith("`") and part.endswith("`") else _WILDCARD_IDENTIFIER_RE.sub(code_span, part) for part in title_parts) - return f"{match.group('level')} {title}" + result: list[str] = [] + plain_start = 0 + position = 0 + while position < len(line): + span_end: int | None = None + if line[position] == "`": + span_end = _backtick_span_end(line, position) + elif line[position] == "*": + span_end = _asterisk_emphasis_span_end(line, position) + + if span_end is None: + position += 1 + continue + + result.append(_WILDCARD_IDENTIFIER_RE.sub(code_span, line[plain_start:position])) + result.append(line[position:span_end]) + position = span_end + plain_start = position + + result.append(_WILDCARD_IDENTIFIER_RE.sub(code_span, line[plain_start:])) + return "".join(result) def _normalize_entry_heading_text(line: str) -> str: - """Apply final cleanup for generated entry-local headings.""" - return _code_span_heading_wildcards(line) + """Apply final cleanup for generated changelog prose and headings.""" + return _code_span_wildcard_identifiers(line) def normalize_entry_headings_text(text: str) -> str: diff --git a/scripts/tests/test_benchmark_utils.py b/scripts/tests/test_benchmark_utils.py index 83d4b3a7..bc2338f8 100644 --- a/scripts/tests/test_benchmark_utils.py +++ b/scripts/tests/test_benchmark_utils.py @@ -236,6 +236,40 @@ def test_collect_criterion_comparisons_filters_release_signal_scope(tmp_path: Pa assert comparison.speedup == pytest.approx(2.0) +def test_release_signal_excludes_manual_topology_benchmark() -> None: + """Release comparisons should not run the explicitly selected topology suite.""" + assert "topology_guarantee_construction" not in benchmark_utils.RELEASE_SIGNAL_BENCH_TARGETS + assert "topology_guarantee_construction" not in benchmark_utils.RELEASE_SIGNAL_GROUP_PREFIXES + assert benchmark_utils.BENCH_TARGET_SUITES["topology"] == ("topology_guarantee_construction",) + assert benchmark_utils.BENCH_COMPARE_GROUP_PREFIXES_BY_SUITE["topology"] == ("topology_guarantee_construction",) + + +def test_run_latest_for_explicit_suite_bypasses_release_signal_recipe(tmp_path: Path) -> None: + """A named suite should run its own Cargo targets even when Just is present.""" + (tmp_path / "justfile").write_text("", encoding=UTF8) + (tmp_path / "Cargo.toml").write_text( + '[[bench]]\nname = "topology_guarantee_construction"\n', + encoding=UTF8, + ) + + with patch("benchmark_utils._run_tool") as run_tool: + benchmark_utils._run_latest_for_suite(worktree=tmp_path, suite="topology", env=None) + + run_tool.assert_called_once_with( + "cargo", + [ + "bench", + "--profile", + benchmark_utils.BENCHMARK_BUILD_FLAVOR, + "--bench", + "topology_guarantee_construction", + ], + cwd=tmp_path, + timeout=benchmark_utils.RELEASE_BENCH_TIMEOUT_SECONDS, + env=None, + ) + + @pytest.mark.parametrize("point_estimate", [float("nan"), float("inf"), 0.0, -1.0]) def test_collect_criterion_comparisons_rejects_invalid_point_estimates(tmp_path: Path, point_estimate: float) -> None: """Saved Criterion baseline comparison should fail on non-physical timings.""" diff --git a/scripts/tests/test_check_docs_version_sync.py b/scripts/tests/test_check_docs_version_sync.py index cee92e06..4996cb84 100644 --- a/scripts/tests/test_check_docs_version_sync.py +++ b/scripts/tests/test_check_docs_version_sync.py @@ -72,6 +72,22 @@ def test_find_version_mismatches_reports_stale_dependency_snippets(tmp_path: Pat assert mismatches[0].package.version == "1.2.3" +def test_find_version_mismatches_reports_stale_cargo_add_commands(tmp_path: Path) -> None: + """Stale cargo-add commands are reported without matching other packages.""" + _write_project( + tmp_path, + readme=("cargo add delaunay@1.2.3\n`cargo add --features diagnostics delaunay@1.2.2`\ncargo add la-stack@0.4.1\n"), + ) + + mismatches = check_docs_version_sync.find_version_mismatches(tmp_path) + + assert len(mismatches) == 1 + assert mismatches[0].reference.kind is check_docs_version_sync.ReferenceKind.CARGO_ADD + assert mismatches[0].reference.path == tmp_path / "README.md" + assert mismatches[0].reference.line == 2 + assert mismatches[0].reference.version == "1.2.2" + + def test_find_version_mismatches_handles_reordered_inline_table_keys(tmp_path: Path) -> None: """Inline Cargo dependency tables can put version after other keys.""" _write_project(tmp_path) diff --git a/scripts/tests/test_justfile_discoverability.py b/scripts/tests/test_justfile_discoverability.py index 2ccc734a..bcf7558b 100644 --- a/scripts/tests/test_justfile_discoverability.py +++ b/scripts/tests/test_justfile_discoverability.py @@ -8,11 +8,14 @@ from pathlib import Path from typing import Any +import benchmark_utils + REPO_ROOT = Path(__file__).resolve().parents[2] JUSTFILE = REPO_ROOT / "justfile" HELPER_JUSTFILE = REPO_ROOT / "just" / "helpers.just" RECIPE_DECLARATION = re.compile(r"^([A-Za-z_][A-Za-z0-9_-]*)(?:\s+.*?)?:(?=\s|$)", re.MULTILINE) WORKFLOW_VERSION_LOOKUP = re.compile(r"just --evaluate ([a-z0-9_]+_version)") +RELEASE_SIGNAL_TARGETS = re.compile(r"^\s*release-signal\)\s*\n\s*targets=\(([^)]*)\)", re.MULTILINE) def run_just(*args: str) -> subprocess.CompletedProcess[str]: @@ -60,6 +63,21 @@ def test_check_code_includes_dependency_hygiene() -> None: assert "unused-deps" in dependencies +def test_release_signal_benchmark_recipes_match_python_runner() -> None: + """Just and Python should select the same curated release benchmark targets.""" + justfile_text = JUSTFILE.read_text(encoding="utf-8") + suite_match = RELEASE_SIGNAL_TARGETS.search(justfile_text) + assert suite_match is not None + saved_baseline_targets = tuple(suite_match.group(1).split()) + + latest = run_just("--dry-run", "bench-latest") + latest_targets = tuple(re.findall(r"--bench ([A-Za-z0-9_-]+)", latest.stdout + latest.stderr)) + expected = benchmark_utils.RELEASE_SIGNAL_BENCH_TARGETS + + assert saved_baseline_targets == expected + assert latest_targets == expected + + def test_cargo_tool_guards_reuse_pinned_helper() -> None: """Named Cargo-tool guards should share one exact-version implementation.""" recipes = just_recipes() diff --git a/scripts/tests/test_postprocess_changelog.py b/scripts/tests/test_postprocess_changelog.py index bf3a664a..58d6c41d 100644 --- a/scripts/tests/test_postprocess_changelog.py +++ b/scripts/tests/test_postprocess_changelog.py @@ -620,6 +620,36 @@ def test_full_pipeline_code_spans_wildcard_identifiers_in_headings(self, tmp_pat result = f.read_text(encoding="utf-8") assert "#### Documentation: Rename `saturating_*` helpers to `bbox_*` and clarify float semantics" in result + def test_full_pipeline_code_spans_wildcard_api_names_in_prose(self) -> None: + content = ( + "# Changelog\n\n" + "## [1.0.0]\n\n" + "### Changed\n\n" + "- Remove the legacy DelaunayTriangulation::try_new* and try_with_* batch constructors.\n" + "- Tolerate NFS .nfs* lock files.\n" + "- Preserve [**breaking**], *emphasis*, and existing `already_*` markup.\n" + ) + + result = postprocess_text(content) + + assert "Remove the legacy `DelaunayTriangulation::try_new*` and `try_with_*` batch constructors." in result + assert "Tolerate NFS `.nfs*` lock files." in result + assert "Preserve [**breaking**], *emphasis*, and existing `already_*` markup." in result + + def test_full_pipeline_preserves_matching_run_code_spans(self) -> None: + content = "# Changelog\n\n## [1.0.0]\n\n### Changed\n\n- Preserve ``foo`bar*`` and ``foo`bar*`baz`` while wrapping qux*.\n" + + result = postprocess_text(content) + + assert "Preserve ``foo`bar*`` and ``foo`bar*`baz`` while wrapping `qux*`." in result + + def test_full_pipeline_preserves_wildcard_like_emphasis(self) -> None: + content = "# Changelog\n\n## [1.0.0]\n\n### Changed\n\n- Preserve *foo/bar* and *foo bar* while wrapping foo/bar* and qux*.\n" + + result = postprocess_text(content) + + assert "Preserve *foo/bar* and *foo bar* while wrapping `foo/bar*` and `qux*`." in result + def test_full_pipeline_normalizes_indented_bold_entry_headings(self, tmp_path: Path) -> None: f = tmp_path / "CHANGELOG.md" f.write_text( diff --git a/src/main.rs b/src/main.rs index cddc8a5d..55dc92d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ #![forbid(unsafe_code)] +#![deny(dead_code_pub_in_binary)] //! Companion command-line entrypoint for notebook and diagnostic workflows. diff --git a/uv.lock b/uv.lock index 79e65065..ccc9ae7e 100644 --- a/uv.lock +++ b/uv.lock @@ -451,7 +451,7 @@ wheels = [ [[package]] name = "delaunay-scripts" -version = "0.7.8" +version = "0.8.0" source = { editable = "." } dependencies = [ { name = "packaging" }, @@ -540,11 +540,11 @@ wheels = [ [[package]] name = "fastjsonschema" -version = "2.22.0" +version = "2.22.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/11/c802f752919c1fd83d44b3b955c6e7120c79f355d4a448c358198a11178c/fastjsonschema-2.22.0.tar.gz", hash = "sha256:6eb12e8f9900db6166c3d396d178ebdf6a4215fe22a06e19792edd612a20035a", size = 382291, upload-time = "2026-07-25T20:32:35.561Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/98/474719c58eddaf77fa443b063693e76d49db32bbe851bcbaf58d2700119f/fastjsonschema-2.22.1.tar.gz", hash = "sha256:0b83d1ce8d7845b959dcb20e1a5c3c8883b6541d9c52ab02cce5166b75ec805f", size = 382291, upload-time = "2026-07-27T13:31:08.515Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/9d/4a0f9355ca3e540b2d22d5f269212e2f227b8f277835b02d8908355245d1/fastjsonschema-2.22.0-py3-none-any.whl", hash = "sha256:60f4c92fda6f93efe3b3261638836478e1e11abc01c647e36e478199f7a86a37", size = 26248, upload-time = "2026-07-25T20:32:33.616Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/62cc96341f01bdff2ba967441939178fcd1900d11ce7e6554d9954a5d7ec/fastjsonschema-2.22.1-py3-none-any.whl", hash = "sha256:cf377ff5c9a6f4f3125fb35f75a2c5767bd824ffbcf62c209a93cd48d1453999", size = 26239, upload-time = "2026-07-27T13:31:03.251Z" }, ] [[package]]