Skip to content

refactor(api)!: tighten invariant-bearing triangulation APIs#511

Merged
acgetchell merged 1 commit into
mainfrom
refactor/453-invariant-performance-audit
Jul 7, 2026
Merged

refactor(api)!: tighten invariant-bearing triangulation APIs#511
acgetchell merged 1 commit into
mainfrom
refactor/453-invariant-performance-audit

Conversation

@acgetchell

Copy link
Copy Markdown
Owner
  • 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.

BREAKING CHANGE: BistellarFlipKind::d and PeriodicSimplexSpan::{axis, span, period} are private; use d(), axis(), span(), and period() instead.

Closes #453

- 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.

BREAKING CHANGE: BistellarFlipKind::d and PeriodicSimplexSpan::{axis, span, period} are private; use d(), axis(), span(), and period() instead.

Closes #453
@acgetchell acgetchell self-assigned this Jul 7, 2026
@acgetchell acgetchell enabled auto-merge (squash) July 7, 2026 10:54
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This PR performs a broad invariant-preserving audit pass: adds fluent builder APIs for DelaunayizeConfig and DelaunayRepairHeuristicConfig, converts CLI vertex counts to NonZeroUsize, relaxes several trait bounds (Serialize, CoordinateRepresentation, surface_measure), encapsulates BistellarFlipKind's dimension field, adds a duplicate-index rebuild headroom optimization, prechecks explicit-simplex topology in the builder, refines error classification logic, adds an explicit-import benchmark, bumps uv versions, migrates the papers CI job to macOS, and cleans up test logging/imports.

Changes

CI/Tooling Maintenance

Layer / File(s) Summary
uv version bump
.github/workflows/{benchmarks,ci,generate-baseline,release-benchmarks,semgrep-sarif}.yml, docs/dev/tooling-alignment.md
UV_VERSION bumped from 0.11.26 to 0.11.27 across workflows and documentation.
Papers workflow macOS migration
.github/workflows/papers.yml
Runner changed to macos-latest; apt-get dependency install replaced with Homebrew commands.
README hero link
README.md
Hero image reference changed to an absolute raw.githubusercontent.com URL.

Explicit-Import Benchmark

Layer / File(s) Summary
Fixture and manifest
benches/ci_performance_suite.rs
Adds ExplicitImportFixture, count constants, benchmark ID generator, and manifest entry.
Benchmark case & registration
benches/ci_performance_suite.rs
Adds bench_explicit_import_case, benchmark_explicit_import, and registers it in criterion_group!.

Typed Vertex-Count Validation

Layer / File(s) Summary
GenerateConfig NonZeroUsize
src/config.rs
vertices field and validation now use NonZeroUsize.
PachnerStressConfig NonZeroUsize
src/config.rs
vertex_count field and validation now use NonZeroUsize.
CLI integration tests
tests/cli.rs
New tests verify zero-vertex rejection for generate and pachner-stress.

BistellarFlipKind Dimension Accessor

Layer / File(s) Summary
Dimension encapsulation
src/core/algorithms/flips.rs
d field made private; new d() accessor added and used in tests.

Insertion Retryability Classification

Layer / File(s) Summary
Explicit non-retryable variants
src/core/algorithms/incremental_insertion.rs
Wildcard fallback replaced with explicit structural error variants.

PeriodicSimplexSpan Accessors

Layer / File(s) Summary
Accessor methods
src/geometry/embedding.rs, src/core/embedding.rs, tests/prelude_exports.rs
Fields replaced with axis(), span(), period() methods; call sites and tests updated.

Duplicate-Index Rebuild Headroom

Layer / File(s) Summary
Growth-factor headroom
src/core/insertion.rs
Adds growth-factor constant and helper for grid rebuild sizing, plus new tests.

Construction Helper Refactors

Layer / File(s) Summary
Flip error classification
src/delaunay/construction.rs
Wildcard fallback replaced with explicit non-geometric variants.
Farthest-candidate tie-break
src/delaunay/construction.rs
New shared helper for candidate replacement decisions; extrema tie-break simplified.

Explicit-Simplex Topology Precheck

Layer / File(s) Summary
Precheck & build_explicit rewiring
src/delaunay/builder.rs
Adds duplicate/facet-sharing prechecks before prechecked-topology insertion.

Fluent Config Builder APIs

Layer / File(s) Summary
DelaunayizeConfig builders
src/delaunay/delaunayize.rs
Adds fluent setters and updates flip-repair runner wiring.
DelaunayRepairHeuristicConfig builders
src/delaunay/repair.rs
Adds fluent setters with doc examples.
DelaunayizeConfig usage
docs/api_design.md, examples/delaunayize_repair.rs, src/delaunay/delaunayize.rs
Struct literals replaced with fluent calls in docs, examples, and tests.
DelaunayRepairHeuristicConfig usage
src/delaunay/repair.rs, tests/delaunay_repair_fallback.rs, tests/large_scale_debug.rs
Struct literals replaced with fluent calls.
Workflow test fixtures
tests/delaunayize_workflow.rs
Adds shared 3D fixture helpers; removes a redundant determinism test.
Prelude fluent-setter smoke tests
tests/prelude_exports.rs
Adds helper assertions covering both config types' fluent setters.

Relaxed Trait Bounds

Layer / File(s) Summary
Serialize impl
src/delaunay/serialization.rs
Removes Kernel/DataType bounds in favor of DataSerialize; adds test.
CoordinateRepresentation
src/geometry/traits/coordinate.rs
Removes explicit Sized bound.
surface_measure
src/geometry/util/measures.rs, tests/trait_bound_ergonomics.rs
Removes DataType bounds; adds non-DataType payload test.

Test Logging, Imports, and Harness Cleanup

Layer / File(s) Summary
Tracing conversion
src/core/util/facet_keys.rs, src/core/util/facet_utils.rs, src/core/algorithms/locate.rs, src/geometry/predicates.rs, src/geometry/util/conversions.rs
Replaces println!/eprintln! with tracing::debug!/warn!; removes one redundant test.
Prelude import consolidation
tests/*.rs
Consolidates test imports under delaunay::prelude.
Circumsphere tooling simplification
tests/circumsphere_debug_tools.rs
Removes redundant generic bounds/wrapper functions.
Test macro generators
src/geometry/util/point_generation.rs, tests/large_scale_debug.rs
Replaces duplicated tests with macro-generated ones.
docs.rs annotations
src/lib.rs
Adds cfg_attr(docsrs, ...) to diagnostics re-exports.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • acgetchell/delaunay#489: Both modify BistellarFlipKind in src/core/algorithms/flips.rs, with this PR's d accessor change affecting the flip feasibility API introduced there.
  • acgetchell/delaunay#499: Both modify build_explicit in src/delaunay/builder.rs, one adding topology prechecks and the other refactoring the builder's fluent API.
  • acgetchell/delaunay#474: Both modify src/delaunay/delaunayize.rs around fallback rebuild error propagation and configuration.

Suggested labels: enhancement, rust, breaking change, geometry, api, topology

Poem

Hop, hop through fields of typed delight,
NonZeroUsize keeps zero out of sight,
Fluent builders chain like carrot vines,
Tracing whispers where println once shined,
A rabbit's audit, tidy and bright! 🐇✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning These changes bundle broad API, docs, and workflow refactors, but the linked issue calls for a minimal whole-repo performance audit with documented validation. Limit the PR to audit findings and benchmark-backed hot-path fixes, and move API/workflow/doc refactors to separate issues or PRs with explicit validation notes.
Out of Scope Changes check ⚠️ Warning Several changes are unrelated to the audit scope, including README/docs edits, workflow version bumps, and broad API ergonomics refactors. Split non-audit refactors and workflow/doc updates into separate PRs, keeping this one focused on invariant-preserving performance findings.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately captures the main API refactor around triangulation invariants.
Description check ✅ Passed The description matches the change set, covering accessors, bound relaxations, benchmarks, tests, and workflow updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/453-invariant-performance-audit

Comment @coderabbitai help to get the list of available commands.

@codacy-production

codacy-production Bot commented Jul 7, 2026

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🟢 Metrics -13 complexity

Metric Results
Complexity -13

View in Codacy

🟢 Coverage 98.08% diff coverage · +0.02% coverage variation

Metric Results
Coverage variation +0.02% coverage variation (-1.00%)
Diff coverage 98.08% diff coverage

View coverage diff in Codacy

Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (703eb1e) 79921 72752 91.03%
Head commit (e7595d3) 80003 (+82) 72839 (+87) 91.05% (+0.02%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#511) 313 307 98.08%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@coderabbitai coderabbitai Bot added api breaking change enhancement New feature or request geometry Geometry-related issues rust Pull requests that update rust code topology labels Jul 7, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (6)
.github/workflows/papers.yml (1)

55-59: 🧹 Nitpick | 🔵 Trivial

macOS migration looks consistent.

Runner switch to macos-latest and Homebrew-based dependency install look correctly wired with the rest of the pipeline (Rust toolchain, uv, Tectonic all cross-platform). Worth noting macOS runners consume GitHub Actions minutes at a higher multiplier than Linux, so per-run cost/duration will increase for this job.

Also applies to: 89-90

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/papers.yml around lines 55 - 59, The papers workflow has
been switched to macOS, which increases GitHub Actions runtime cost; review the
job in papers.yml around the papers job and either confirm this higher-cost
runner is intentional or reduce usage by narrowing when the job runs or moving
it back to a Linux runner if macOS is not required. Keep the existing
Rust/uv/Tectonic setup intact while making any runner or trigger adjustment.
src/delaunay/repair.rs (1)

198-263: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consistent with the DelaunayizeConfig builder pattern.

Same with_/without_ shape duplicated across two config structs (here and DelaunayizeConfig). Could be reduced with a small macro if more config types adopt this pattern in the future, but not worth doing for just two structs today.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/delaunay/repair.rs` around lines 198 - 263, The builder methods in
DelaunayRepairHeuristicConfig should follow the same with_/without_ pattern used
by DelaunayizeConfig for consistency. Review the existing builder methods like
with_shuffle_seed, with_perturbation_seed, with_max_flips, and
without_max_flips, and make their naming/signature style match the corresponding
methods in DelaunayizeConfig without introducing extra abstraction unless it is
already used there.
src/config.rs (1)

255-261: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optional: shared helper for typed non-zero vertex validation.

The NonZeroUsize::new(...).filter(...).ok_or(...) pattern is duplicated between GenerateConfig::try_new and PachnerStressConfig::try_new with only the error type/threshold differing. A small generic helper (e.g. taking a predicate and an error-constructing closure) could remove the duplication, but given only two call sites and differing error types, this is a minor DRY improvement rather than a pressing need.

Also applies to: 1070-1076

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/config.rs` around lines 255 - 261, The typed non-zero vertex validation
logic is duplicated in GenerateConfig::try_new and PachnerStressConfig::try_new,
so extract a small shared helper around the
NonZeroUsize::new(...).filter(...).ok_or(...) pattern. Make the helper generic
over the threshold/predicate and accept an error-construction closure so each
caller can still produce its own error type while reusing the same validation
flow.
src/delaunay/builder.rs (1)

1997-2020: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Avoid retaining every explicit Simplex before insertion.

Line 1999 materializes a second full copy of the explicit connectivity just to run the precheck. Consider running the duplicate/facet precheck over simplices.as_slice() plus index_to_key, then constructing each Simplex in the insertion loop. This keeps the prechecked path while reducing peak memory for large explicit imports.

♻️ Sketch of the lower-allocation flow
-        let mut explicit_simplices = Vec::with_capacity(simplices.len());
-        for (simplex_idx, simplex_spec) in simplices.iter().enumerate() {
-            let vertex_keys: SimplexVertexKeyBuffer =
-                simplex_spec.iter().map(|&vi| index_to_key[vi]).collect();
-            let simplex = Simplex::try_new(vertex_keys).map_err(|e| {
-                ExplicitConstructionError::SimplexCreation {
-                    simplex_index: simplex_idx,
-                    source: e,
-                }
-            })?;
-            explicit_simplices.push(simplex);
-        }
-
-        Self::validate_explicit_simplices_for_prechecked_insert(&explicit_simplices).map_err(
+        Self::validate_explicit_simplices_for_prechecked_insert(simplices, &index_to_key).map_err(
             |source| ExplicitConstructionError::TdsAssembly {
                 source: Box::new(source),
             },
         )?;
 
-        // Insert simplices.
-        for simplex in explicit_simplices {
+        // Insert simplices.
+        for (simplex_idx, simplex_spec) in simplices.iter().enumerate() {
+            let vertex_keys: SimplexVertexKeyBuffer =
+                simplex_spec.iter().map(|&vi| index_to_key[vi]).collect();
+            let simplex = Simplex::try_new(vertex_keys).map_err(|e| {
+                ExplicitConstructionError::SimplexCreation {
+                    simplex_index: simplex_idx,
+                    source: e,
+                }
+            })?;
             tds.insert_simplex_with_mapping_prechecked_topology(simplex)
                 .map_err(|source| ExplicitConstructionError::TdsAssembly {
                     source: Box::new(source),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/delaunay/builder.rs` around lines 1997 - 2020, The explicit import path
in the builder currently allocates and retains a full Vec of Simplex values
before insertion, which increases peak memory. Update the logic around
validate_explicit_simplices_for_prechecked_insert and
tds.insert_simplex_with_mapping_prechecked_topology so the duplicate/facet
precheck runs directly over simplices.as_slice() with index_to_key, then
construct each Simplex only inside the insertion loop. Keep the existing
ExplicitConstructionError handling and prechecked topology path, but remove the
explicit_simplices collection.
src/geometry/traits/coordinate.rs (1)

952-955: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

No-op cleanup — explicit Sized bound was already redundant.

Rust adds an implicit Self: Sized bound to trait declarations and generic parameters unless ?Sized is used, and Default::default() -> Self already forces implementors to be Sized in practice. So removing the explicit + Sized here doesn't change which types satisfy CoordinateRepresentation, or make the trait object-safe (the other supertraits like Default still preclude dyn CoordinateRepresentation). Harmless, but worth knowing this isn't an actual bound relaxation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/geometry/traits/coordinate.rs` around lines 952 - 955, The
CoordinateRepresentation trait already has an implicit Sized requirement, so
this change is only a cleanup and should not alter behavior. Keep the trait and
blanket impl in coordinate.rs as Copy + Default + Debug + Serialize +
DeserializeOwned, and make sure no surrounding code or comments imply that
removing the explicit Sized bound changes trait object safety or accepted types.
src/delaunay/serialization.rs (1)

162-181: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Test bypasses public constructors via direct struct literal.

The test hand-builds Triangulation/DelaunayTriangulation via struct literals with a placeholder NotAKernel and an empty Tds, rather than going through builder()/try_from_tds(). That's acceptable here since the goal is a compile-time proof that Serialize no longer needs kernel/DataType bounds, and an empty TDS has no invariant to violate. Just flagging that this couples the test tightly to the current field layout of Triangulation/DelaunayTriangulation; if those become further encapsulated (as is happening elsewhere in this PR for other types), this test will need to track that.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/delaunay/serialization.rs` around lines 162 - 181, The serialization test
in serialize_delaunay_triangulation_does_not_require_kernel_or_datatype_bounds
is building Triangulation and DelaunayTriangulation with direct struct literals,
which tightly couples it to private field layout. Update the test to use the
public construction path (such as builder() or try_from_tds()) if it can still
create the same empty-triangulation setup, while preserving the compile-time
assertion that Serialize does not require kernel/DataType bounds; if no public
constructor can express this case, keep the literal-based setup but make the
dependency on internals explicit in the test name or nearby comment.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/papers.yml:
- Around line 55-59: The papers workflow has been switched to macOS, which
increases GitHub Actions runtime cost; review the job in papers.yml around the
papers job and either confirm this higher-cost runner is intentional or reduce
usage by narrowing when the job runs or moving it back to a Linux runner if
macOS is not required. Keep the existing Rust/uv/Tectonic setup intact while
making any runner or trigger adjustment.

In `@src/config.rs`:
- Around line 255-261: The typed non-zero vertex validation logic is duplicated
in GenerateConfig::try_new and PachnerStressConfig::try_new, so extract a small
shared helper around the NonZeroUsize::new(...).filter(...).ok_or(...) pattern.
Make the helper generic over the threshold/predicate and accept an
error-construction closure so each caller can still produce its own error type
while reusing the same validation flow.

In `@src/delaunay/builder.rs`:
- Around line 1997-2020: The explicit import path in the builder currently
allocates and retains a full Vec of Simplex values before insertion, which
increases peak memory. Update the logic around
validate_explicit_simplices_for_prechecked_insert and
tds.insert_simplex_with_mapping_prechecked_topology so the duplicate/facet
precheck runs directly over simplices.as_slice() with index_to_key, then
construct each Simplex only inside the insertion loop. Keep the existing
ExplicitConstructionError handling and prechecked topology path, but remove the
explicit_simplices collection.

In `@src/delaunay/repair.rs`:
- Around line 198-263: The builder methods in DelaunayRepairHeuristicConfig
should follow the same with_/without_ pattern used by DelaunayizeConfig for
consistency. Review the existing builder methods like with_shuffle_seed,
with_perturbation_seed, with_max_flips, and without_max_flips, and make their
naming/signature style match the corresponding methods in DelaunayizeConfig
without introducing extra abstraction unless it is already used there.

In `@src/delaunay/serialization.rs`:
- Around line 162-181: The serialization test in
serialize_delaunay_triangulation_does_not_require_kernel_or_datatype_bounds is
building Triangulation and DelaunayTriangulation with direct struct literals,
which tightly couples it to private field layout. Update the test to use the
public construction path (such as builder() or try_from_tds()) if it can still
create the same empty-triangulation setup, while preserving the compile-time
assertion that Serialize does not require kernel/DataType bounds; if no public
constructor can express this case, keep the literal-based setup but make the
dependency on internals explicit in the test name or nearby comment.

In `@src/geometry/traits/coordinate.rs`:
- Around line 952-955: The CoordinateRepresentation trait already has an
implicit Sized requirement, so this change is only a cleanup and should not
alter behavior. Keep the trait and blanket impl in coordinate.rs as Copy +
Default + Debug + Serialize + DeserializeOwned, and make sure no surrounding
code or comments imply that removing the explicit Sized bound changes trait
object safety or accepted types.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: dd6ac686-562f-4309-a4e6-5878db2f64d8

📥 Commits

Reviewing files that changed from the base of the PR and between 703eb1e and e7595d3.

📒 Files selected for processing (47)
  • .github/workflows/benchmarks.yml
  • .github/workflows/ci.yml
  • .github/workflows/generate-baseline.yml
  • .github/workflows/papers.yml
  • .github/workflows/release-benchmarks.yml
  • .github/workflows/semgrep-sarif.yml
  • README.md
  • benches/ci_performance_suite.rs
  • docs/api_design.md
  • docs/dev/tooling-alignment.md
  • examples/delaunayize_repair.rs
  • src/config.rs
  • src/core/algorithms/flips.rs
  • src/core/algorithms/incremental_insertion.rs
  • src/core/algorithms/locate.rs
  • src/core/embedding.rs
  • src/core/insertion.rs
  • src/core/util/facet_keys.rs
  • src/core/util/facet_utils.rs
  • src/delaunay/builder.rs
  • src/delaunay/construction.rs
  • src/delaunay/delaunayize.rs
  • src/delaunay/locality.rs
  • src/delaunay/property_validation.rs
  • src/delaunay/repair.rs
  • src/delaunay/serialization.rs
  • src/geometry/embedding.rs
  • src/geometry/predicates.rs
  • src/geometry/traits/coordinate.rs
  • src/geometry/util/conversions.rs
  • src/geometry/util/measures.rs
  • src/geometry/util/point_generation.rs
  • src/lib.rs
  • tests/circumsphere_debug_tools.rs
  • tests/cli.rs
  • tests/delaunay_incremental_insertion.rs
  • tests/delaunay_repair_fallback.rs
  • tests/delaunayize_workflow.rs
  • tests/euler_characteristic.rs
  • tests/large_scale_debug.rs
  • tests/mesh_export.rs
  • tests/prelude_exports.rs
  • tests/proptest_delaunay_triangulation.rs
  • tests/proptest_sos.rs
  • tests/proptest_toroidal.rs
  • tests/proptest_triangulation.rs
  • tests/trait_bound_ergonomics.rs
💤 Files with no reviewable changes (2)
  • tests/proptest_triangulation.rs
  • tests/proptest_delaunay_triangulation.rs

@codecov

codecov Bot commented Jul 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.08307% with 6 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.02%. Comparing base (703eb1e) to head (e7595d3).
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/core/util/facet_utils.rs 84.61% 4 Missing ⚠️
src/delaunay/builder.rs 98.80% 1 Missing ⚠️
src/geometry/predicates.rs 92.85% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #511      +/-   ##
==========================================
+ Coverage   91.00%   91.02%   +0.01%     
==========================================
  Files          88       88              
  Lines       79700    79782      +82     
==========================================
+ Hits        72533    72620      +87     
+ Misses       7167     7162       -5     
Flag Coverage Δ
unittests 91.02% <98.08%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@acgetchell acgetchell merged commit 6d5020d into main Jul 7, 2026
22 of 23 checks passed
@acgetchell acgetchell deleted the refactor/453-invariant-performance-audit branch July 7, 2026 11:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api breaking change enhancement New feature or request geometry Geometry-related issues rust Pull requests that update rust code topology

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf: audit invariant-preserving hot paths after simplification cleanup

1 participant