diff --git a/.gitea/workflows/doxygen-pages.yml b/.gitea/workflows/doxygen-pages.yml index f338277..4030d47 100644 --- a/.gitea/workflows/doxygen-pages.yml +++ b/.gitea/workflows/doxygen-pages.yml @@ -75,16 +75,31 @@ jobs: run: | set -eu # Build the publish payload in a clean scratch dir so the - # orphan branch contains only the Doxygen output (and a - # marker README), never any build/source artefacts. + # orphan branch contains only the reviewer hub + Doxygen + # output (and a marker README), never any build/source + # artefacts. publish_dir=$(mktemp -d) cp -r doc/doxygen/html/. "$publish_dir/" + # ── Reviewer hub override ───────────────────────────────── + # If doc/reviewer/hub.html is present, install it as the + # publish landing page and demote the auto-generated Doxygen + # index to /doxygen.html. The hub is hand-curated and lives + # under source control; this step keeps it visible after + # every push to main, surviving the auto-publish cycle. + if [ -f doc/reviewer/hub.html ]; then + mv "$publish_dir/index.html" "$publish_dir/doxygen.html" + cp doc/reviewer/hub.html "$publish_dir/index.html" + echo "DOC ▸ reviewer hub installed; Doxygen index now at /doxygen.html" + fi + cat > "$publish_dir/README.txt" </dev/null 2>&1 || apt-get install -y --no-install-recommends ccache + + # ─── Run 1: baseline (PCH OFF, Unity OFF, ccache cleared) ────── + - name: "Run 1: cold baseline (no PCH, no Unity, no ccache)" + run: | + ccache -C >/dev/null 2>&1 || true + rm -rf build-baseline + cmake -S code -B build-baseline -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_USE_PCH=OFF \ + -DCMAKE_UNITY_BUILD=OFF \ + -DCONFORMALLAB_USE_CCACHE=OFF + start=$(date +%s) + nice -n 19 cmake --build build-baseline --target conformallab_cgal_tests -j1 + end=$(date +%s) + echo "PERF baseline_wall=$((end - start)) s" + echo "PERF_BASELINE_WALL=$((end - start))" >> $GITHUB_ENV + + # ─── Run 2: PCH only ────────────────────────────────────────── + - name: "Run 2: PCH only (Unity off, ccache off)" + run: | + ccache -C >/dev/null 2>&1 || true + rm -rf build-pch + cmake -S code -B build-pch -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_USE_PCH=ON \ + -DCMAKE_UNITY_BUILD=OFF \ + -DCONFORMALLAB_USE_CCACHE=OFF + start=$(date +%s) + nice -n 19 cmake --build build-pch --target conformallab_cgal_tests -j1 + end=$(date +%s) + echo "PERF pch_only_wall=$((end - start)) s" + echo "PERF_PCH_WALL=$((end - start))" >> $GITHUB_ENV + + # ─── Run 3: default (PCH + Unity Build + #6 Dense→Core) ─────── + - name: "Run 3: default config (PCH + Unity + Dense→Core)" + run: | + ccache -C >/dev/null 2>&1 || true + rm -rf build-default + cmake -S code -B build-default -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_USE_CCACHE=OFF + start=$(date +%s) + nice -n 19 cmake --build build-default --target conformallab_cgal_tests -j1 + end=$(date +%s) + echo "PERF default_wall=$((end - start)) s" + echo "PERF_DEFAULT_WALL=$((end - start))" >> $GITHUB_ENV + + # ─── Run 4: + FAST_TEST_BUILD (-O0 -g) ──────────────────────── + - name: "Run 4: default + FAST_TEST_BUILD=ON (-O0 -g for tests)" + run: | + ccache -C >/dev/null 2>&1 || true + rm -rf build-fast + cmake -S code -B build-fast -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_FAST_TEST_BUILD=ON \ + -DCONFORMALLAB_USE_CCACHE=OFF + start=$(date +%s) + nice -n 19 cmake --build build-fast --target conformallab_cgal_tests -j1 + end=$(date +%s) + echo "PERF fast_test_wall=$((end - start)) s" + echo "PERF_FAST_WALL=$((end - start))" >> $GITHUB_ENV + + # ─── Run 5: ccache hit-rate validation ───────────────────────── + - name: "Run 5: ccache hit-rate (rebuild build-default)" + run: | + ccache -C >/dev/null 2>&1 || true + ccache --zero-stats >/dev/null + # First rebuild: populate ccache. + rm -rf build-cc + cmake -S code -B build-cc -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_USE_CCACHE=ON + nice -n 19 cmake --build build-cc --target conformallab_cgal_tests -j1 >/dev/null + ccache_first=$(ccache -s 2>&1 | grep -E "^\s*Hits" | head -1 | awk '{print $2}') + # Second rebuild: expect cache hits. + rm -rf build-cc-warm + cmake -S code -B build-cc-warm -G Ninja \ + -DWITH_CGAL_TESTS=ON \ + -DCONFORMALLAB_USE_CCACHE=ON + start=$(date +%s) + nice -n 19 cmake --build build-cc-warm --target conformallab_cgal_tests -j1 + end=$(date +%s) + warm_wall=$((end - start)) + ccache_stats=$(ccache -s 2>&1 | grep -E "Hits|Misses" | head -4) + echo "── ccache stats after warm rebuild ──" + echo "$ccache_stats" + echo "PERF ccache_warm_wall=${warm_wall} s" + echo "PERF_CCACHE_WARM_WALL=$warm_wall" >> $GITHUB_ENV + + # ─── Test correctness (last gate; perf data already collected) ─ + - name: Verify all configs produced working binaries + if: always() + run: | + for build in build-baseline build-pch build-default build-fast; do + if [ -d "$build" ]; then + ctest --test-dir "$build" -R "^cgal\." --output-on-failure --timeout 120 \ + | tail -3 + fi + done + + # ─── Final summary ───────────────────────────────────────────── + - name: Compile-time perf summary + if: always() + run: | + echo "══════════════════════════════════════════════════════" + echo " COMPILE-TIME PERF BENCH — Linux ARM64 / g++ / -j1" + echo "══════════════════════════════════════════════════════" + printf " %-30s %4s s\n" "Run 1: cold baseline" "${PERF_BASELINE_WALL:-?}" + printf " %-30s %4s s\n" "Run 2: + PCH" "${PERF_PCH_WALL:-?}" + printf " %-30s %4s s\n" "Run 3: + PCH + Unity (default)" "${PERF_DEFAULT_WALL:-?}" + printf " %-30s %4s s\n" "Run 4: + FAST_TEST_BUILD" "${PERF_FAST_WALL:-?}" + printf " %-30s %4s s\n" "Run 5: + ccache warm rerun" "${PERF_CCACHE_WARM_WALL:-?}" + echo "──────────────────────────────────────────────────────" + echo "Predictions to validate vs Apple-M1 baseline:" + echo " ┃ FAST_TEST_BUILD: expected ~40 % faster than default" + echo " ┃ ccache warm: expected ≤ 10 s (vs Apple's 55 s)" + echo "──────────────────────────────────────────────────────" + # Compute relative deltas + if [ -n "${PERF_DEFAULT_WALL:-}" ] && [ -n "${PERF_FAST_WALL:-}" ]; then + pct=$(awk -v d="${PERF_DEFAULT_WALL}" -v f="${PERF_FAST_WALL}" \ + 'BEGIN { printf "%.0f", 100.0 * (d - f) / d }') + echo " Δ FAST_TEST_BUILD vs default: ${pct} % wall reduction" + fi + if [ -n "${PERF_DEFAULT_WALL:-}" ] && [ -n "${PERF_CCACHE_WARM_WALL:-}" ]; then + pct=$(awk -v d="${PERF_DEFAULT_WALL}" -v c="${PERF_CCACHE_WARM_WALL}" \ + 'BEGIN { printf "%.0f", 100.0 * (d - c) / d }') + echo " Δ ccache warm vs default: ${pct} % wall reduction" + fi + echo "══════════════════════════════════════════════════════" diff --git a/doc/architecture/compile-time.md b/doc/architecture/compile-time.md index ae472c4..6ad0316 100644 --- a/doc/architecture/compile-time.md +++ b/doc/architecture/compile-time.md @@ -188,13 +188,31 @@ build: | `FAST_TEST_BUILD=ON` (Linux CI) | 5 | ~30 (expected) | ~25 (expected) | | `FAST_TEST_BUILD=ON` (Apple clang) | 5 | 52 | n/a (use DEV_BUILD locally) | +## Cross-platform perf bench (Linux CI) + +`.gitea/workflows/perf-compile-time.yml` runs a 5-step matrix on the +eulernest Linux runner after every push to `main` that touches the +build system or public headers. The matrix validates the predictions +that this document makes against the macOS-local measurements: + +| Run | Predicted Linux gain | Apple M1 actual | +|---|---|---| +| Baseline (no PCH, no Unity, no ccache) | reference | 78 s | +| + PCH only | ~15 % | 66 s (−15 %) | +| + PCH + Unity (default) | ~30 % | 55 s (−30 %) | +| + FAST_TEST_BUILD (-O0 -g) | **~40 % vs default** (g++ Backend dominates) | 52 s (neutral on clang) | +| + ccache warm rerun | **≥ 90 % vs default** (8.5× speedup) | 56 s (Apple-clang PCH friction = 0 % hit) | + +The job is data-collection only — does not gate merges. Output appears +in the run summary tab; if Linux numbers diverge from predictions, the +"Next levers" table below gets updated based on what actually wins. + ## Next levers (not in this branch) If 55 s wall is still not enough for full-clean rebuilds: | Lever | Estimated win | Cost | |---|---|---| -| `-O0` for the CGAL test target in CI PRs | 55 s → ~30 s | 1 h policy doc | | `extern template` (lever #2 above) | 55 s → ~52 s | 2 h + Eigen version tracking | | Header split (lever #3) | downstream-only | 1 day + API risk | | C++20 Modules | speculative; experimental in Apple clang 17 | weeks | diff --git a/doc/reviewer/README.md b/doc/reviewer/README.md index 02aa3bb..829f082 100644 --- a/doc/reviewer/README.md +++ b/doc/reviewer/README.md @@ -25,6 +25,21 @@ suggested structure. for our conformallab++ chat (~15 min)"*. - **agenda.md**: never send. This is internal scaffolding. +## Hub-Page durability + +The reviewer hub HTML at +is published from `doc/reviewer/hub.html` in the repo (not from a +detached preview branch). This means: + +* Merging any of the open PRs into `main` triggers + `.gitea/workflows/doxygen-pages.yml` which republishes the hub + alongside fresh Doxygen HTML — the reviewer URL stays live across + merges with no manual intervention. +* The hub is source-controlled, so changes are reviewable via PR + like any other doc, and old versions live in git history. +* The original Doxygen index moves to `/doxygen.html` whenever the + hub override is active; both are reachable from the hub itself. + ## Quick links the reviewer should bookmark - 🌐 Reviewer-hub landing page: diff --git a/doc/reviewer/hub.html b/doc/reviewer/hub.html new file mode 100644 index 0000000..2bb7332 --- /dev/null +++ b/doc/reviewer/hub.html @@ -0,0 +1,529 @@ + + + + +conformallab++ — Reviewer Preview + + + + + + +
+ +

conformallab++ — Reviewer Preview

+ +

+A C++17 header-only implementation of discrete conformal equivalence +solvers on triangle meshes, built around CGAL's Surface_mesh +and Eigen. v0.9.0 ships five DCE solvers (Euclidean / Spherical / +HyperIdeal / CP-Euclidean / Inversive-Distance) plus the layout, +holonomy, period-matrix, cut-graph and serialisation infrastructure. +

+ +

+Audience. Active researcher in discrete differential geometry — +specifically the decorated DCE / Penner coordinates / +canonical Delaunay tessellations / hyperideal polyhedra +line — treated as a peer most likely to use conformallab++ as +numerical infrastructure for their own future experiments, not merely +to evaluate it. +

+ +
+This page is a temporary preview combining two unmerged PRs so +the integrated state is reviewable before any merge happens. Once the +PRs land on main, the publish URL serves the main-branch view. +
+ + +

TL;DR — orient yourself #

+ +

+ Tests 259/259 + Skipped 0 + Doxygen 100% + Quality + Roadmap + Lit + License + Header-only + v0.9.0 +

+ +
+Headline. 259/259 tests pass (0 skipped); 100 % Doxygen +coverage on the public API; 14 of 15 quality gates green +(1 SKIP — local CGAL-version-matrix has no tarballs); library is +verified-standalone (Eigen + CGAL + Boost, all header-only, no +runtime deps). +
+ +

Pick a time budget; each path is a sequence of anchor links.

+ +
+ +
+

⏱ 5 minutes — minimum to know what's here

+ +
+ +
+

📖 20 minutes — to prepare for the meeting

+ +
+ +
+

🔬 60+ minutes — deep dive

+ +
+ +
+ + +

1. Research alignments — where this could be infrastructure for your work #

+ +

Most rows match an active publication line in discrete differential +geometry. Rows marked no Java parent are research-only phases +the reader can shape at design stage. The Phase column links to the +per-phase entry in doc/roadmap/.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Reader's research threadWhat this snapshot hasPhase
Decorated DCE in non-Euclidean geometriesfive DCE solvers + traits scaffolding; non-Euclidean cone extension scoped in research-track with acceptance criteria9d.2 RESEARCH
Canonical Delaunay tessellations of decorated hyperbolic surfacescut-graph + period matrix + hyperbolic-disk layout as scaffolding; canonical-tessellation algorithm itself outlined10c planned
Hyperideal polyhedra rigidityHyperIdeal functional + 805-line analytic Hessian derivation note (Schläfli identity)9b-analytic derived; 10c′ KAT planned
Optimal cone placement / non-Euclidean cone metricscone-singularity port via ConesUtility scoped; non-Euclidean extension is the research delta9d.1 port + 9d.2 RESEARCH
Polygon Laplacian on general (non-triangular) meshesno Java parent — first phase the reader can influence at design stage9f RESEARCH
Quasi-isothermic maps (Lawson correspondence, ~800 lines, discrete Beltrami-field solver)scoped as a 6-class Java port: QuasiisothermicLayout, DBFSolution, SinConditionApplication, QuasiisothermicDelaunay, QuasiisothermicUtility, ConformalStructureUtility10e planned
Higher-genus + hyperelliptic surfaces (Bobenko–Bücking 2009; block-diagonal period matrices with Z₂ symmetry)port of HyperellipticUtility + HyperIdealHyperellipticUtility scoped; existing period-matrix code as scaffolding10b planned
Möbius centring as a variational problem (Lorentz energy, full gradient + Hessian)currently iterative Fréchet mean in normalise_hyperbolic(); the principled variational alternative is scoped via the Java MobiusCenteringFunctional port9d.4 planned
Boundary-First / interactive flattening (Crane et al. 2017 BFF; Bonneel et al. 2015 Stripe Patterns)not on the roadmap as ports; documented in references.md as comparison points / inspiration
Schläfli-based variational machinery (Rivin–Springborn 1999)derivation done; implementation gated on the reader's view of whether the ~6× speedup over our block-FD path matters at their mesh sizes9b-analytic ready
+ + +

2. Seven questions at a glance #

+ +

The full text of each question lives in +questions.md. +The first two are research-oriented and benefit most from this +specific reader; the rest are scoped so "A / B / either" is a +sufficient answer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
QTopicTrack
Q1Research-track alignment — which of 6 candidate phases (9d.2 / 9f / 10c+10c′ / 10e / 10b / 9d.4) would unblock concrete experiments you want to run?research
Q2Decorated-DCE API surface — named parameter, separate decorated_* solvers, or property-map auto-detect?research
Q3Phase 9b-analytic Hessian — is the ~6× speedup worth ~2 weeks at your mesh sizes?porting
Q4Phase 9c (4g-polygon canonical form) — port literally or re-derive from Springborn 2020 §5?porting
Q5geometry-central cross-validation (GC-1) — would you co-author?collaboration
Q6CGAL submission packaging — one package or several?process
Q7The "no" question — is there one of the 12 architecture decisions you would push back on?process
+ + +

3. What's new on this snapshot #

+ +
+ +

Since the previous publish, four threads converged:

+ +
    +
  • +6 phases from a full Java-library scan + (9d cones + 9d.4 variational Möbius centring / 9e circle-pattern + layout / 10d Koebe circle-domain / 10e quasi-isothermic / 10f + Koebe polyhedra / 10g cyclic-symmetry). See + java-parity.md + for the reverse table.
  • +
  • +13 literature citations integrated + into the per-phase roadmap with explicit acceptance criteria. + Decorated-DCE / canonical-tessellation / hyperideal line: + Bobenko–Lutz 2024 IMRN; Bobenko–Lutz 2025 DCG; Lutz 2023 + Geom. Dedicata; Lutz 2024 PhD; Bowers–Bowers–Lutz 2026. + Cones, polyhedra, period matrices: Crane et al. 2018; + Springborn 2019; Bobenko–Bücking 2009; Rivin–Springborn 1999. + Polygon Laplacians: Alexa–Wardetzky 2011; Alexa 2020. Integrable + and practical-flattening context: Springborn–Veselov 2015; + Crane et al. 2017 (BFF); Bonneel et al. 2015 (Stripe Patterns). +
  • +
  • +1 RESEARCH phase with no Java + parent — Phase 9f (polygon Laplacian on non-triangular meshes, + Alexa-Wardetzky 2011 / Alexa 2020) — the first phase a reviewer + can shape at design stage.
  • +
  • output_uv_map now covers 4 of 5 DCE + solvers (Inversive-Distance added; CP-Euclidean deferred to + Phase 9c with a clear runtime error).
  • +
+ +
+ + +

4. How you'd actually use this #

+ +

The library is header-only and standalone. Two-minute build + smoke +test:

+ +
git clone https://codeberg.org/TMoussa/ConformalLabpp
+cd ConformalLabpp
+cmake -S code -B build && cmake --build build --target conformallab_tests
+ctest --test-dir build              # ~2 s · 23 pure-math tests
+
+# CGAL solvers + layouts (adds Boost headers as system dep)
+cmake -S code -B build -DWITH_CGAL_TESTS=ON
+cmake --build build --target conformallab_cgal_tests -j
+ctest --test-dir build              # ~3 min · 236 CGAL tests
+ +

One-call entry to compute a Euclidean discrete conformal map and a +UV-layout in a single shot:

+ +
#include <CGAL/Surface_mesh.h>
+#include <CGAL/Discrete_conformal_map.h>
+
+CGAL::Surface_mesh<K::Point_3> mesh = ...;        // your mesh
+auto uv = mesh.add_property_map<V_idx, K::Point_2>("uv").first;
+
+auto r = CGAL::discrete_conformal_map_euclidean(
+    mesh,
+    CGAL::parameters::output_uv_map(uv)
+                   | CGAL::parameters::gradient_tolerance(1e-12));
+// r.u_per_vertex, r.iterations, r.gradient_norm now populated.
+ +
+For adding your own functional or layout — pointer chain + +
    +
  • add-inversive-distance.md + — step-by-step recipe for a sixth DCE model, used in real for the existing 9a.2 port.
  • +
  • block-fd-hessian.md + — per-face block-FD pattern (96× over full-FD).
  • +
  • add-output-uv-map.md + — output_uv_map named parameter + pipe-operator chaining.
  • +
  • For your decorated-DCE work specifically: see + Q2 of the reviewer questions + — three candidate API shapes, picking one would let us sketch a prototype in the week after the meeting.
  • +
+ +
+ + +

5. Documents to read next #

+ +

The four document folders most useful to a researcher. Click each +folder for the per-document table.

+ +
+📋 Meeting materials — doc/reviewer/ (read first) + + + + + + + +
DocumentWhat it covers
briefing.mdOne-page orientation: research alignments (10-row table), what's new on this snapshot, the seven questions.
questions.mdFull text of Q1–Q7. Q1 lists 6 candidate phases (9d.2 / 9f / 10c+10c′ / 10e / 10b / 9d.4); Q2 covers the decorated-DCE API surface; Q3–Q4 are porting decisions; Q5–Q6 project management; Q7 the open invitation to push back.
+ +
+ +
+🗺️ Roadmap — doc/roadmap/ (where everything fits) + + + + + + + + + + + +
DocumentWhat it covers
phases.md +6 phasesPer-phase plan including the 6 new Java-scan phases (9d / 9e / 10d / 10e / 10f / 10g + 9d.4) and the 3 new research-only entries (9d.2 / 9f / 10c′).
research-track.md +2 RESEARCHItems beyond Java parity, with explicit acceptance criteria: non-Euclidean cone extensions (9d.2), polygon Laplacian on non-triangular meshes (9f), geometry-central cross-validation (GC-1).
java-parity.md full scanReverse table: every class in the Java original, where it lives in our port (or which phase will absorb it), or why it is intentionally not ported (the do-not-port list — Colt, PETSc, jReality wrappers).
porting-status.mdOperational snapshot: 25 kLoC Java breakdown, 5-DCE-model status matrix, things Java doesn't have.
+ +
+ +
+📚 Mathematics & literature — doc/math/ + + + + + + + +
DocumentWhat it covers
references.md +13 refsPer-phase literature index. 13 new citations added: decorated DCE in non-Euclidean geometries (Bobenko–Lutz 2025); canonical tessellations (Lutz 2023 / 2024); hyperideal polyhedra rigidity (Bowers–Bowers–Lutz 2026); polygon Laplacians (Alexa–Wardetzky 2011 / Alexa 2020); optimal cone placement (Crane et al. 2018); Schläfli identity (Rivin–Springborn 1999); hyperbolic polyhedra (Springborn 2019); polyhedral period matrices (Bobenko–Bücking 2009); integrable cluster dynamics (Springborn–Veselov 2015); BFF (Crane et al. 2017); stripe patterns (Bonneel et al. 2015).
hyperideal-hessian-derivation.mdFull LaTeX-formatted derivation of the analytic HyperIdeal Hessian via the Schläfli identity (805 lines, 8 sections + 2 appendices). Cited sources: Schläfli 1858, Milnor 1982, Vinberg 1993, Cho–Kim 1999, Glickenstein 2011, Rivin–Springborn 1999, Springborn 2020.
+ +
+ +
+🏗️ Architecture, dependencies & auto-generated reference + + + + + + + + + + + + + + + +
DocumentWhat it covers
locked-vs-flexible.md12 architecture decisions classified 🔴 load-bearing / 🟡 semi-fixed / 🟢 opportunistic + a "Known limitations" table. Q7 of the reviewer questions points here to push back on anything.
dependencies.mdWhat's required (Eigen + CGAL + Boost headers) vs optional; per-tool install hints; standalone-verification recipe.
code/deps/THIRD-PARTY-LICENSES.mdPer-vendored-dep SPDX with MIT-compatibility analysis (LGPL §3 vs §4 distinction for header-only consumption of CGAL).
Doxygen HTML259 pages, 0 warnings, 100 % public-API coverage (396 / 396 symbols). MathJax enabled for inline formulas.
api/headers.mdAuto-generated table of every public header with brief + symbols; regenerated on every push to main.
api/tests.mdPer-suite test breakdown (single source of truth). 259 tests, 0 skipped.
+ +
+ + +

6. Quality & tests — proof points #

+ + + + + + + + +
SuiteTestsStatus
Non-CGAL (pure-math)23PASS 0 skipped
CGAL (Surface_mesh + Phase 8b-Lite)236PASS 0 skipped
Total2590 failures
+ +
+Quality gates — 14 of 15 PASS, 1 SKIP (full breakdown) + +

Run with bash scripts/quality/run-all.sh. Four ★ gates are +required in CI on every PR; the rest are local-only and skip gracefully +on a partial dev environment.

+ + + + + + + + + + + + + + + + + + + + + + +
GateWhereResultDetail
License headers ★CIPASS66/66 files carry MIT SPDX
CGAL conventions (6 rules) ★CIPASS0/6 violations across 6 CGAL public headers
codespell ★CIPASS0 typos
shellcheck ★ (strict)CIPASS0 findings across 16 shell scripts
clang-format driftlocalPASS0 drift against .clang-format
cmake-format / cmake-lintlocalPASS0 drift, 0 lint findings
cppchecklocalPASSwarning+ severity clean
Markdown linksCIPASSinternal links resolve
Sanitizers (ASan + UBSan)localPASS23/23 tests pass under instrumentation
clang-tidylocalPASS35 headers, 0 findings
Coverage (gcov + lcov)localDEGRADED23/23 tests run instrumented; lcov-on-macOS toolchain mismatch (works on Linux CI)
Multi-compilerlocalPASSAppleClang 17 + brew LLVM 22
Reproducible buildlocalPASSbyte-identical test binaries between 2 builds
Doxygen coverageCIPASS396 / 396 public symbols (100 %)
CGAL version matrixlocalSKIPno CGAL tarballs under ~/cgal/ (graceful)
test-count consistency ★CIPASStests.md totals match ctest reality
End-to-end smoke (try_it.sh) ★CIPASSfull configure + build + ctest + Euclidean example on a bundled mesh
+ +
+ + +

7. Source & navigation #

+ + + + + + + + + + +
Repo (this snapshot)codeberg.org/TMoussa/ConformalLabpp/branch/main
Default branchcodeberg.org/TMoussa/ConformalLabpp (main)
Doxygen HTML259 pages, 0 warnings, 100 % coverage
Origin (private)git.eulernest.eu/conformallab/ConformalLabpp
+ + + +
+ + +